【資料結構】雙迴圈鏈表(c++)

來源:互聯網
上載者:User

標籤:資料結構   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++)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.