头文件:
#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> *m = NULL) { data = d; next = n; prio = m; } // 链表类的构造函数 template<class Type> List<Type>::List() { first = last = BuyNode(); first->prio = NULL; } // 链表类的析构函数 template<class Type> List<Type>::~List() { destroy(); } // 显示 template<class Type> void List<Type>::show_list() { NodeList<Type> *p = first->next; while (p != NULL) { 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; last = p; first->data++; } // 头插 template<class Type> void List<Type>::head_insert(Type const &x) { NodeList<Type> *p = BuyNode(x); if (first->data == 0) { first->next = p; p->prio = first; last = p; } else { p->next = first->next; first->next = p; p->prio = first; p->next->prio = p; last = p; for (int i = 0; i < first->data; ++i) { last = last->next; } } 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 = NULL; p->prio = NULL; last = t; first->data = 1; while (p != NULL) { 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 = NULL; } 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; if (first->data == 1) { first->next = NULL; first->prio = NULL; last = first; } else { last = last->prio; last->next = NULL; first->prio = NULL; } 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 != NULL) { 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 != NULL) { 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 != NULL) { 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 = NULL; p->prio = NULL; last = t; first->data = 1; while (p != NULL) { 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 != NULL) { 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 "DList.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; }
清空:
头删:
头插:
反转:
排序:
尾删:
尾插:
按值删除:
按值插入: