雙向循環鏈表C++實現
1.單鏈表:
結構圖:
2.雙向鏈表:
3.雙向循環鏈表:
對於本程序中,則是給定一個_head 頭結點,而不是指針,因為這樣更加方便避免一些空判斷問題
/* 版權信息:狼 文件名稱:BidCirList.h 文件標識: 文件摘要: 利用C++實現簡單的雙向鏈表功能。增,刪,查,改 //太煩了。。我直接給個 帶頭結點的 表 //swap 移花接木已經是個給力的方法。。just try 當前版本:1.1 作 者:狼 完成時間:2015-12-13 */ #ifndef _BIDCIRLIST_H #define _BIDCIRLIST_H #include"afxstd.h" typedef int DataType; typedef struct ListNode { ListNode(DataType x=0) : _data(x) //默認初始化是自環而非 NULL , _prev(this) , _late(this) {} DataType _data; struct ListNode* _prev; struct ListNode* _late; }ListNode; class BidCirList { public: BidCirList() :_head(0) {} BidCirList(DataType *array, size_t n = 0) :_head(0) { size_t i = 0; while (n--) { InsertAter(array[i++]); } } BidCirList(BidCirList & list) :_head() { ListNode* cur = list._head._prev; while (cur) { InsertAter(cur->_data); cur = cur->_prev; if (cur == &list._head) break; } } ~BidCirList() { Destoty(); } BidCirList operator+(BidCirList& list) { BidCirList tmp(*this); ListNode* cur = list._head._prev; while (cur != &list._head) { tmp.InsertAter(cur->_data); cur = cur->_prev; } return tmp; } BidCirList& operator = (BidCirList& list) { if (this != &list) { BidCirList S(list); Swap(S); } return *this; } //清空空間 void Destoty() { ListNode*cur = &_head; while (cur->_prev != &_head) { DelPrev(); } } //刪除結點之前的結點。默認為頭 void DelPrev(ListNode *del = NULL) { if (_head._prev == &_head) return; if (del == NULL) { //刪除頭之前 _head._prev = _head._prev->_prev; delete _head._prev->_late; _head._prev->_late = &_head; } else { del->_prev = del->_prev->_prev; delete del->_prev->_late; del->_prev->_late = del; } } //刪除結點之后一個,,默認為頭 void DelLate(ListNode *del = NULL) { if (_head._prev == &_head) return; if (del == NULL) { _head._late = _head._late->_late; delete _head._late->_prev; _head._late->_prev = &_head; } else { del->_late = del->_late->_late; delete del->_late->_prev; del->_late->_prev = del; } } //在結點之前插入,默認為頭 void InsertAter(DataType x ,ListNode* ins= NULL) { ListNode* tmp = new ListNode(x); if (ins == NULL) { tmp->_prev = &_head; tmp->_late = _head._late; tmp->_late->_prev = tmp; tmp->_prev->_late = tmp; } else { tmp->_prev = ins; tmp->_late = ins->_late; tmp->_late->_prev = tmp; tmp->_prev->_late = tmp; } } ListNode* Find(DataType x) { ListNode* cur = _head._prev; while (cur) { if (cur == &_head) return NULL; if (cur->_data == x) { return cur; } cur = cur->_prev; } } void Erase(ListNode * node) { if (node == &_head) { return; } else { ListNode* tmp = node; node->_prev->_late = node->_late; node->_late->_prev = node->_prev; delete tmp; tmp = NULL; } } //反向打印 void PrintPrev() { ListNode* cur = _head._prev; while (cur) { if (cur == &_head) break; cout << cur->_data << " -> "; cur = cur->_prev; } cout << " Over! " << endl; } //正向打印 void PrintLate() { ListNode* cur = _head._late; while (cur) { if (cur == &_head) break; cout << cur->_data << " -> "; cur = cur->_late; } cout << " Over! " << endl; } void Swap(BidCirList &list) { ::swap(_head._prev->_late, list._head._prev->_late); ::swap(_head._prev, list._head._prev); ::swap(_head._late->_prev, list._head._late->_prev); ::swap(_head._late, list._head._late); } private: ListNode _head; }; #endif