【C++/数据结构】单链表的基本操作
2015-08-22 15:41
756 查看
#pragma once #ifndef _CLIST_H_ #define _CLIST_H_ #include <iostream> #include <assert.h> using namespace std; template<class Type> class List; typedef enum { FALSE, TRUE }Status; template<class Type> class ListNode { friend class List<Type>; public: ListNode() :data(Type()), next(NULL) {} ListNode(Type d, ListNode<Type> *n = NULL) : data(d), next(n) {} ~ListNode() {} void setData(const Type &d) { data = d; } Type GetData() { return data; } private: Type data; ListNode<Type> *next; }; template<class Type> class List { public: List() { ListNode<Type> *s = new ListNode<Type>(0); assert(s != NULL); last = first = s; size = 0; } ~List() {} public: Status push_back(const Type &x) { ListNode<Type> *s = new ListNode<Type>(x); last->next = s; last = s; size++; return TRUE; } Status push_front(const Type &x) { ListNode<Type> *s = new ListNode<Type>(x); s->next = first->next; first->next = s; if (size == 0) { last = s; } size++; return TRUE; } Status pop_back() { if (size == 0) { return FALSE; } ListNode<Type> *p = first; while (p->next != last) { p = p->next; } delete last; last = p; last->next = NULL; size--; return TRUE; } Status pop_front() { if (size == 0) { return FALSE; } ListNode<Type> *p = first->next; first->next = p->next; delete p; if (size == 1) { last = first; } size--; return TRUE; } void show_List() { ListNode<Type> *p = first->next; while (p != NULL) { cout << p->data << "->"; p = p->next; } cout << "NULL" << endl; } Status insert_val(const Type &x) { ListNode<Type> *p = first; while (p->next != NULL && p->next->data < x) { p = p->next; } if (p->next == NULL) { push_back(x); } else { ListNode<Type> *s = new ListNode<Type>(x); s->next = p->next; p->next = s; size++; } /* ListNode<Type> *s = new ListNode<Type>(x); ListNode<Type> *q = p->next; if(last->data > x) { while(q->data < x ) { p = p->next; q = q->next; } p->next = s; s->next = q; size++; } else { push_back(); }*/ return TRUE; } ListNode<Type>* find(const Type &key) const { if (size == 0) { return NULL; } ListNode<Type> *p = first->next; while(p != NULL && p->data != key) { p = p->next; } return p; // while (p != NULL) // { // if (p->data == key) // { // return p; // } // p = p->next; // } // return NULL; } Status delete_val(const Type &x) { if (size == 0) { return FALSE; } ListNode<Type> *p = find(x); if (p == NULL) { return FALSE; } if (p == last) { pop_back(); } else { ListNode<Type> *q = p->next; p->data = q->data; p->next = q->next; delete q; size--; return TRUE; } return FALSE; /* ListNode<Type> *p = first; ListNode<Type> *q = p->next; if(last->data == x) { pop_back(); } while(q->data != x) { p = p->next; q = q->next; } p->next = q->next; return TRUE;*/ } Status modify_val(const Type &x, const Type &y) { ListNode<Type> *p = find(x); if (p == NULL) { return FALSE; } p->data = y; return TRUE; } int length() { return size; } void clear() { ListNode<Type> *p = first->next; while (p != NULL) { first->next = p->next; delete p; p = first->next; } last = first; size = 0; } void destroy() { clear(); delete first; first = last = NULL; } void sort() { if (size==0 || size==1) { return; } ListNode<Type> *p = first->next; ListNode<Type> *q = p->next; last = p; last->next = NULL; while (q != NULL) { p = q; q = q->next; ListNode<Type> *s = first; while (p->data > s->next->data && s->next != NULL) { s = s->next; } if (s->next == NULL) { p->next = NULL; last->next = p; last = p; } else { p->next = s->next; s->next = p; } } } void resver() { if (size==0 || size==1) { return; } ListNode<Type> *p = first->next; ListNode<Type> *q = p->next; last = p; last->next = NULL; while (q != NULL) { p = q; q = q->next; p->next = first->next; first->next = p; } } Status merge(List<Type> <1, List<Type> <2) { ListNode<Type> *p = lt1.first->next; ListNode<Type> *q = lt2.first->next; ListNode<Type> *s = first; while (p != NULL && q != NULL) { if (p->data < q->data) { s->next = p; p = p->next; s = s->next; } else { s->next = q; q = q->next; s = s->next; } } while (p != NULL) { s->next = p; p = p->next; s = s->next; } while (q != NULL) { s->next = q; q = q->next; s = s->next; } size = lt1.size + lt2.size; return TRUE; } ListNode<Type> *prio(ListNode<Type> *p) const { if (p == NULL || p == first->next) { return NULL; } ListNode<Type> *pr = first; while (pr->next != p) { pr = pr->next; } return pr; } ListNode<Type> *next(ListNode<Type> *p) const { if (p == NULL || p->next == NULL) { return NULL; } ListNode<Type> *q = first; while (q->next != p) { q = q->next; } return q; } ListNode<Type> *Next(const Type &x) const { if (size==0 || size==1) { return NULL; } ListNode<Type> *q = find(x); if (q == NULL) { return NULL; } return q->next; } ListNode<Type> *Prio(const Type &x) const { if(size==0 || size==1) { return NULL; } ListNode<Type> *p = first; ListNode<Type> *q = p->next; while (q != NULL) { if (q->data == x) { return p; } p = p->next; q = q->next; } return NULL; } private: ListNode<Type> *first; ListNode<Type> *last; size_t size; }; #endif
#include "CList.h" void main() { List<int> mylist; List<int> youlist; List<int> mergelist; int select = 1; int pos; int item; system("Color 0d"); while (select) { cout << "************************************" << endl; cout << "* [0] quit_system [1] push_back *" << endl; cout << "* [2] push_front [3] show_list *" << endl; cout << "* [4] pop_back [5] pop_front *" << endl; cout << "* [6] insert_val [7] delete_val *" << endl; cout << "* [8] merge [9] next *" << endl; cout << "* [10] find [11] sort *" << endl; cout << "* [12] resver [13] length *" << endl; cout << "* [14] clear [15] destroy *" << endl; cout << "* [16] modify_val [17] prio *" << endl; cout << "************************************" << endl; cout << "请选择:>"; cin >> select; switch (select) { case 1: cout << "请输入要插入的数据(-1结束):>"; while (cin >> item, item != -1) { mylist.push_back(item); } break; case 2: cout << "请输入要插入的数据(-1结束):>"; while (cin >> item, item != -1) { mylist.push_front(item); } break; case 3: system("cls"); mylist.show_List(); system("pause"); break; case 4: mylist.pop_back(); break; case 5: mylist.pop_front(); break; case 6: cout << "请输入要插入的值:>"; cin >> item; mylist.insert_val(item); break; case 7: cout << "请输入要删除的值:>"; cin >> item; mylist.delete_val(item); break; case 8: for (int i = 1; i < 10; i+=2) { mylist.push_back(i); } for (int i = 2; i < 10; i += 2) { youlist.push_back(i); } mergelist.merge(mylist, youlist); mergelist.show_List(); break; case 9: cout << "请输入要查找的值:>"; cin >> item; cout << "所在查找值的后继为:" << mylist.Next(item) << endl; break; case 10: cout << "请输入要查找的值:>"; cin >> item; cout << "该值指针为:" << mylist.find(item) << endl; break; case 11: mylist.sort(); break; case 12: mylist.resver(); break; case 13: cout << "线性表的长度为:" << mylist.length() << endl; break; case 14: mylist.clear(); break; case 15: mylist.destroy(); break; case 16: cout << "请输入要修改的值:>"; cin >> item; cout << "请输入修改后的值:>"; cin >> pos; mylist.modify_val(item, pos); break; case 17: cout << "请输入要查找的值:>"; cin >> item; cout << "所在查找值的前驱为:" << mylist.Prio(item) << endl; break; default: break; } } }
运行界面如下:
相关文章推荐
- 【C++/数据结构】顺序表的基本操作
- 数据结构课程的实践方法指导
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历 (BFS)
- STL中map、set的数据结构及底层实现
- 数据结构基础 哈希表 概念篇
- 数据结构-图的创建与遍历
- 代写代做程序设计 国外算法编程 VB/C语言/C++/数据结构/Java/PHP/Python
- 数据结构学习笔记之队列
- 数据结构绪论1
- 数据结构之---C语言实现最短路径之Floyd(弗洛伊德)算法
- 数据结构-二叉树定义
- 《数据结构与算法分析》引论:选择问题实现
- 【c++版数据结构】之双链表的实现(带头结点以及尾节点)
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
- MySQL索引背后的数据结构及算法原理
- C++数据结构之Stack(栈)
- 2015 Multi-University Training Contest 10 (hdu 5406-5416)数据结构+dp+矩阵快速幂+bitset优化拓扑排序+(dp&树状数组)
- 【数据结构与算法】——排序算法篇
- 【数据结构】线段树(interval tree)
- Python数据结构:映射(map)——字典