数据结构--单链表single linked list数据结构C++实现
生活随笔
收集整理的這篇文章主要介紹了
数据结构--单链表single linked list数据结构C++实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2018年2月開始學習的 C++ Primer,到今天2019年3月已經整整一年了,非常感謝在一起交流的小伙伴,是你們的無私幫助和分享使得我能跨越很多技術的坑,感謝你們!期待我們2019年一起拿下《數據結構與算法》以及Python入門。?
我的github代碼鏈接https://github.com/hitskyer/course/tree/master/dataAlgorithm/chenmingming/linkedList?
單鏈表反轉 參考他人博客https://blog.csdn.net/feliciafay/article/details/6841115
single_linkedlist.h
#ifndef LINKEDLIST_SINGLE_LINKEDLIST_H #define LINKEDLIST_SINGLE_LINKEDLIST_H#include<iostream> using namespace std;template<class ElemType> struct LinkNode //節點類 {ElemType _data; //節點的數據LinkNode *_next; //指向該節點的下一個節點的指針LinkNode(): _next(NULL){cout << "please enter data: ";cin >> _data;}LinkNode(const ElemType &d, LinkNode* p = NULL) : _data(d), _next(p) {}~LinkNode(){} }; template <class ElemType> class Single_linkedlist {LinkNode<ElemType> *p_head = NULL; //首尾指針LinkNode<ElemType> *p_tail = NULL;int listlength = 0; //鏈表長度 public:Single_linkedlist(int len = 0); //構造函數(順序插入)Single_linkedlist(char reverse, int len = 0); //構造函數(逆序插入)~Single_linkedlist() //析構函數{deleteAll(); //釋放new出來的節點}void deleteAll(); //刪除所有節點void *get_p_head() const //返回頭節點的位置,即頭指針{return p_head;}void *get_p_tail() const //返回為節點的位置,即尾指針{return p_tail;}int getLength() const //返回鏈表長度{return listlength;}bool isEmpty() const //判斷鏈表是否為空{return listlength == 0;}ElemType getCurData(LinkNode<ElemType> *p) const //返回當前節點的數據內容{return p->_data;}void addHead(const ElemType &data); //在鏈表頭部添加元素void addTail(const ElemType &data); //在鏈表尾部添加元素LinkNode<ElemType>* find(int m) const; //按下標查找LinkNode<ElemType>* find(ElemType &data) const; //按元素值查找bool insertAtElemFront(const LinkNode<ElemType> &data, int i); //在i號元素前插入新節點bool insertAtElemBack(const LinkNode<ElemType> &data, int i); //在i號元素后插入新節點bool deleteElem(int i); //刪除i號元素節點bool modifyElem(int i, const ElemType &data); //修改i號元素的值LinkNode<ElemType>* reverse(); //鏈表反轉(就地反轉法)void printList() const; //打印鏈表數據};#include "single_linkedlist.cpp" //模板實現文件,包含編譯模型 #endif //LINKEDLIST_SINGLE_LINKEDLIST_H?single_linkedlist.cpp
/** 內存泄漏總結:* 局部定義的指針,指向new出來的節點(堆空間),指針就可以返回* (如果指針沒有指向堆空間,函數退出后,棧內的內容銷毀,返回的指針也就是無效的)* 鏈表析構的時候delete 這些new出來的節點的地址(堆指針)*/ template <class ElemType> Single_linkedlist<ElemType>::Single_linkedlist(int len) {LinkNode<ElemType> *curNode;for(int i = 0; i != len; ++i) {curNode = new LinkNode<ElemType>;if(i == 0) {p_head = curNode;p_tail = curNode;} else {p_tail->_next = curNode;p_tail = curNode;}++listlength;} } template <class ElemType> Single_linkedlist<ElemType>::Single_linkedlist(char reverse, int len) {if(reverse == 'r' | reverse == 'R') {LinkNode<ElemType> *curNode, *prevNode;for(int i = 0; i != len; ++i) {curNode = new LinkNode<ElemType>;if(i == 0) {p_head = curNode;p_tail = curNode;prevNode = curNode;} else {curNode->_next = prevNode;p_head = curNode;prevNode = curNode;}++listlength;}} else {cout << "you should enter 'r' or 'R' to the second Parameter!" << endl;} }template <class ElemType> void Single_linkedlist<ElemType>:: deleteAll() {LinkNode<ElemType> *del_tempNode, *tempNode;del_tempNode = this -> p_head;while(del_tempNode != NULL) {tempNode = del_tempNode -> _next;delete del_tempNode;del_tempNode = tempNode;listlength--;}p_head = NULL;p_tail = NULL; }template <class ElemType> LinkNode<ElemType>* Single_linkedlist<ElemType>::find(int m) const {if(m < 0 | m >= listlength){cout << "位置不正確(位置序號從0開始)!" << endl;return NULL;}else{LinkNode<ElemType> *tempNode = p_head;for (int i = 0; i < m; ++i, tempNode = tempNode->_next){ //空函數體}return tempNode;} } template <class ElemType> LinkNode<ElemType>* Single_linkedlist<ElemType>::find(ElemType &data) const {LinkNode<ElemType> *tempNode = p_head;for (; (tempNode != NULL) && (tempNode->_data != data); tempNode = tempNode->_next){ //空函數體}if(tempNode != NULL) {cout << "找到了指定元素!地址是:" << tempNode << endl;return tempNode;} else {cout << data << " is not exist!" << endl;return NULL;} } template <class ElemType> void Single_linkedlist<ElemType>::addHead(const ElemType &data) {LinkNode<ElemType> *node = new LinkNode<ElemType>(data);if(p_head == NULL) {p_head = node;p_tail = node;} else {node->_next = p_head;p_head = node;}++listlength;cout << "新的鏈表是:\n";this->printList();cout << "鏈表的長度是:" << listlength << endl; } template <class ElemType> void Single_linkedlist<ElemType>::addTail(const ElemType &data) {LinkNode<ElemType> *node = new LinkNode<ElemType>(data);if(p_tail == NULL) {p_head = node;p_tail = node;} else {p_tail->_next = node;p_tail = node;}++listlength;cout << "新的鏈表是:\n";this->printList();cout << "鏈表的長度是:" << listlength << endl; } template <class ElemType> bool Single_linkedlist<ElemType>::insertAtElemFront(const LinkNode<ElemType> &data, int i) {LinkNode<ElemType> *node = new LinkNode<ElemType>(data);LinkNode<ElemType> *tempNode = p_head;if(i < 0 | i >= listlength){cout << "位置不正確(位置序號從0開始)!" << endl;return false;}else{if(this->find(i) == NULL){p_head = node;p_tail = node;}else{while(tempNode->_next != this->find(i)){tempNode = tempNode->_next;}node->_next = this->find(i);tempNode->_next = node;}++listlength;return true;} } template <class ElemType> bool Single_linkedlist<ElemType>::insertAtElemBack(const LinkNode<ElemType> &data, int i) {LinkNode<ElemType> *node = new LinkNode<ElemType>(data);LinkNode<ElemType> *tempNode = p_head;if(i < 0 | i >= listlength){cout << "位置不正確(位置序號從0開始)!" << endl;return false;}else{if(this->find(i) == NULL){p_head = node;p_tail = node;}else{tempNode = this->find(i);node->_next = tempNode->_next;tempNode->_next = node;}++listlength;return true;} } template <class ElemType> bool Single_linkedlist<ElemType>::deleteElem(int i) {LinkNode<ElemType> *tempNode = p_head, *deleteNode;deleteNode = this->find(i);if(i < 0 | i >= listlength){cout << "位置不正確(位置序號從0開始)!" << endl;return false;}else{if(deleteNode == NULL){return false;}else{while (tempNode->_next != deleteNode){tempNode = tempNode->_next;}tempNode->_next = deleteNode->_next;if (deleteNode == p_tail)p_tail = tempNode;delete deleteNode;--listlength;return true;}} } template <class ElemType> bool Single_linkedlist<ElemType>::modifyElem(int i, const ElemType &data) {LinkNode<ElemType> *tempNode = p_head, *modifyNode;modifyNode = this->find(i);if(i < 0 | i >= listlength){cout << "位置不正確(位置序號從0開始)!" << endl;return false;}else{if(modifyNode == NULL){return false;}else{modifyNode->_data = data;return true;}} } template <class ElemType> LinkNode<ElemType>* Single_linkedlist<ElemType>::reverse() {if(p_head == NULL || p_head->_next == NULL)return NULL;else //就地反轉法{LinkNode<ElemType> *prevNode, *nextNode, *tempNode;prevNode = p_head;nextNode = prevNode->_next;prevNode->_next = NULL;p_tail = prevNode;while(nextNode != NULL){tempNode = nextNode->_next;nextNode->_next = prevNode;prevNode = nextNode;nextNode = tempNode;}p_head = prevNode;return p_head;} } template <class ElemType> void Single_linkedlist<ElemType>::printList() const {int m = 0;LinkNode<ElemType>* tempNode = p_head;for(; tempNode != NULL; tempNode = tempNode->_next){cout << "N.O[" << m++ << "] element " << tempNode->_data << endl;}cout << "--------------------------------------" << endl; }?main_single_linkedlist.cpp
#include "single_linkedlist.h" #include <iostream> #include <string>int main() {Single_linkedlist<int> intList1(2);intList1.printList();cout << "鏈表的長度是:" << intList1.getLength() << endl;intList1.deleteAll();cout << "鏈表的長度是:" << intList1.getLength() << endl;Single_linkedlist<string> strList1('r',3);strList1.printList();cout << "鏈表是空的嗎?(0:不是;1:是)" << strList1.isEmpty() << endl;cout << "鏈表的第2號元素list[2]是:" << (strList1.find(2))->_data << endl;string str("abc");cout << "鏈表的包含字符串\"abc\"的元素的地址:" << endl;strList1.find(str);strList1.addHead(str);strList1.addTail(str);strList1.insertAtElemFront(str,2);strList1.printList();strList1.insertAtElemBack(str,3);strList1.printList();strList1.deleteElem(strList1.getLength()-1);strList1.printList();strList1.modifyElem(strList1.getLength()-1,string("end"));strList1.printList();strList1.reverse();strList1.printList();return 0; }Valgrind內存檢測運行結果:
總結
以上是生活随笔為你收集整理的数据结构--单链表single linked list数据结构C++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 109. 有序链表转换
- 下一篇: python scipy库函数solve