標籤:資料結構 c++ 雙迴圈鏈表
標頭檔:
#pragma once#include <iostream>#include <assert.h>using namespace std;template<class Type>class List;// 結點類template<class Type>class NodeList{friend class List<Type>;public:NodeList();NodeList(Type d, NodeList<Type> *n = NULL, NodeList<Type> *m = NULL);private:Type data;NodeList<Type>* next;NodeList<Type>* prio;};// 鏈表類template<class Type>class List{public:List();~List();public:void show_list();void tail_insert(Type const &x);void head_insert(Type const &x);void sort();void head_delete();void tail_delete();void val_insert(Type const &x);NodeList<Type>* find(Type const &x);void val_delete(Type const &x);Type length();void reverse();void clear();void destroy();void quit_system(Type &x);protected:NodeList<Type>* BuyNode(Type x = Type()){NodeList<Type>* p = new NodeList<Type>(x);assert(p != NULL);return p;}private:NodeList<Type>* first;NodeList<Type>* last;};// 結點類的建構函式template<class Type>NodeList<Type>::NodeList(){data = Type();next = NULL;prio = NULL;}template<class Type>NodeList<Type>::NodeList(Type d, NodeList<Type> *n = NULL, NodeList<Type> *m = NULL){data = d;next = n;prio = m;}// 鏈表類的建構函式template<class Type>List<Type>::List(){first = last = BuyNode();first->prio = last;last->next = first;}// 鏈表類的解構函式template<class Type>List<Type>::~List(){destroy();}// 顯示template<class Type>void List<Type>::show_list(){NodeList<Type> *p = first->next;while (p != first){cout << p->data << "->";p = p->next;}cout << "NULL" << endl;}// 尾插template<class Type>void List<Type>::tail_insert(Type const& x){NodeList<Type> *p = BuyNode(x);last->next = p;p->prio = last;p->next = first;first->prio = p;last = p;first->data++;}// 頭插template<class Type>void List<Type>::head_insert(Type const &x){NodeList<Type> *p = BuyNode(x);if (first->data == 0){tail_insert(x);}else{p->next = first->next;first->next = p;p->prio = first;p->next->prio = p;first->data++;}}// 排序template<class Type>void List<Type>::sort(){if (first->data == 0){return;}if (first->data == 1){show_list();}NodeList<Type> *t = first->next;NodeList<Type> *p = t->next;NodeList<Type> *q = NULL;t->next = first;first->prio = t;p->prio = NULL;last = t;first->data = 1;while (p != first){val_insert(p->data);q = p;p = p->next;delete q;}}// 頭刪template<class Type>void List<Type>::head_delete(){if (first->data == 0){cout << "the list is empty,cannot delete!" << endl;return;}NodeList<Type> *p = first->next;if (first->data == 1){last = first;first->next = last;first->prio = last;}else{first->next = p->next;p->next->prio = first;}delete p;first->data--;}// 尾刪template<class Type>void List<Type>::tail_delete(){if (first->data == 0){cout << "the list is empty,cannot delete!" << endl;return;}NodeList<Type> *s = last;last = last->prio;last->next = first;first->prio = last;delete s;first->data--;}// 按值插入template<class Type>void List<Type>::val_insert(Type const &x){if (first->data == 0){tail_insert(x);return;}NodeList<Type> *p = first->next;NodeList<Type> *s = BuyNode(x);while (p->data < x && p->next != first){p = p->next;}if (p->data >= x){p->prio->next = s;s->prio = p->prio;s->next = p;p->prio = s;first->data++;}else{tail_insert(x);}}// 尋找template<class Type>NodeList<Type>* List<Type>::find(Type const &x){NodeList<Type> *s = first->next;while (s != first){if (s->data == x){return s;}s = s->next;}return NULL;}// 按值刪除template<class Type>void List<Type>::val_delete(Type const &x){if (first->data == 0){cout << "the list is empty,cannot delete!" << endl;return;}NodeList<Type> *s = find(x);if (s == NULL){cout << "the number is not exist,can not delete!" << endl;return;}if (s->next != first){s->prio->next = s->next;s->next->prio = s->prio;first->data--;delete s;}else{tail_delete();}}// 求長度template<class Type>Type List<Type>::length(){return first->data;}// 反轉template<class Type>void List<Type>::reverse(){if (first->data == 0){return;}if (first->data == 1){show_list();}NodeList<Type> *t = first->next;NodeList<Type> *p = t->next;NodeList<Type> *q = NULL;t->next = first;first->prio = t;p->prio = NULL;last = t;first->data = 1;while (p != first){head_insert(p->data);q = p;p = p->next;delete q;}}// 清空template<class Type>void List<Type>::clear(){if (first->data == 0){return;}while (first->next != first){tail_delete();}}// 摧毀template<class Type>void List<Type>::destroy(){clear();delete first;}// 退出系統template<class Type>void List<Type>::quit_system(Type &x){x = 0;}
主函數:
// 用c++實現單鏈表#include "DCList.h"int main(){List<int> mylist;int input = 1;int insert;while (input){cout << "*********************************************************************" << endl;cout << "* [1] show_list [2] tail_insert *" << endl;cout << "* [3] head_insert [4] sort *" << endl;cout << "* [5] head_delete [6] tail_delete *" << endl;cout << "* [7] val_insert [8] find *" << endl;cout << "* [9] val_delete [10] length *" << endl;cout << "* [11] reverse [12] clear *" << endl;cout << "* [13] destroy [14] quit_system *" << endl;cout << "*********************************************************************" << endl;cout << "please choose:";cin >> input;switch (input){case 1:mylist.show_list();break;case 2:cout << "please enter the number want to insert(-1 end):";while (cin >> insert, insert != -1){mylist.tail_insert(insert);}break;case 3:cout << "please enter the number want to insert(-1 end):";while (cin >> insert, insert != -1){mylist.head_insert(insert);}break;case 4:mylist.sort();break;case 5:mylist.head_delete();break;case 6:mylist.tail_delete();break;case 7:cout << "please enter the number want to insert:";cin >> insert;mylist.val_insert(insert);break;case 8:cout << "please enter the number want to find:";cin >> insert;if (mylist.find(insert) == NULL){cout << "the number is not exist!" << endl;}else{cout << "the number at the " << mylist.find(insert) << endl;}break;case 9:cout << "please enter the number want to delete:";cin >> insert;mylist.val_delete(insert);break;case 10:cout << "the length is" << " " << mylist.length() << endl;break;case 11:mylist.reverse();break;case 12:mylist.clear();break;case 13:mylist.destroy();break;case 14:mylist.quit_system(input);break;default:break;}}return 0;}
頭刪:
頭插:
反轉:
尾刪:
尾插:
按值插入:
清空:
排序:
按值刪除:
【資料結構】雙迴圈鏈表(c++)