【数据结构】双链表(c++)
2015-05-28 20:21
651 查看
头文件:
主函数:
清空:
![](http://img.blog.csdn.net/20150528203448286?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150528203505924?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
头删:
![](http://img.blog.csdn.net/20150528203530693?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150528203545776?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
头插:
![](http://img.blog.csdn.net/20150528203559427?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150528203616241?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
反转:
![](http://img.blog.csdn.net/20150528203631399?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150528203647580?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
排序:
![](http://img.blog.csdn.net/20150528203659399?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150528203716736?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
尾删:
![](http://img.blog.csdn.net/20150528203729423?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150528203744241?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
尾插:
![](http://img.blog.csdn.net/20150528203757095?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150528203817640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
按值删除:
![](http://img.blog.csdn.net/20150528203832135?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150528203850012?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
按值插入:
![](http://img.blog.csdn.net/20150528203901809?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhcWlhbjU1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
#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 = 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; }
清空:
头删:
头插:
反转:
排序:
尾删:
尾插:
按值删除:
按值插入:
相关文章推荐
- 数据结构之数组(对数组的所有操作!)
- 郝斌老师数据结构笔记
- 第一章 数据结构绪论
- c++基本数据结构的类的用法--栈,队列,链表
- nginx基本数据结构ngx_module_t,ngx_module_s
- 数据结构面试题总结
- linux下数据结构之STL的使用
- 面试经验分享之数据结构、算法题
- 网页爬虫及其用到的算法和数据结构
- 网页爬虫及其用到的算法和数据结构
- 数据结构实验一代码&nbsp;&nbsp;&amp;n…
- (编程训练)再回首,数据结构——二叉排序树的建立
- (编程训练)再回首,数据结构——无向图的邻接矩阵表示、DFS、BFS
- (编程训练)再回首,数据结构——哈夫曼编码的实现
- 二叉排序树的删除
- (编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)
- (编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(递归)
- (编程训练)再回首,数据结构——二维数组的操作
- (编程训练)再回首,数据结构——字符串操作
- 再回首,数据结构——以邻接矩阵、邻接表表示的图的深度、广度优先搜索