数据结构(C++)——单向循环链表
2017-01-20 22:30
579 查看
#include"AllHead.h" template<class T> class CircList; template<class T> class CircListNode { friend class CircList<T>; protected: T data; CircListNode *next; public: CircListNode(CircListNode<T> *ptr = NULL){next = ptr;} //只初始化指针域的构造函数 CircListNode(T x,CircListNode<T> *ptr = NULL){data = x;next = ptr;}//初始化数据域和指针域的构造函数 }; template<class T> class CircList { private: CircListNode<T> *first; CircListNode<T> *last; size_t size; public: CircList() { first = new CircListNode<T>; last = first; last->next = first; size = 0; } ~CircList(){makeEmpty();} void makeEmpty(); Status IsEmpty(){return first == last?TRUE:FALSE;} Status push_back(T x); void show_circlist(); Status push_front(T x); size_t getlenth(){return size;} T getHead_val(){return first!=last?first->next->data:NULL;} T getLast_val(){return first!=last?last->data:NULL;} Status pop_back(); Status pop_front(); CircListNode<T>* find(T key); Status insert_val(T x); Status del_val(T x); void sort(); void reverse(); // List(ListNode<T> &L); // ListNode<T>* getFirst(){return first;} // List& operator=(List<T> &L); }; template<class T> void CircList<T>::sort()///////////////////////////SORT////////////// { CircListNode<T> *q = first->next; CircListNode<T> *h; CircListNode<T> *p; CircListNode<T> *m; first->next = first; last = first; while(q!= first) {//h和q是断开后面的指针!!! h = q; q = q->next; //p和m是新的表头这边的两个指针!!! p = first->next; m = first; while(p != first&&(p->data)<(h->data)) { m = p; p = p->next; } if(p == first) { last = h; } m->next = h; h->next = p; } } template<class T> void CircList<T>::reverse() { if(IsEmpty()) { cout<<"空链表无法逆置"<<endl; } CircListNode<T> *h = first->next->next; CircListNode<T> *q = h->next; CircListNode<T> *m = last; last = first->next; last->next = first; while(q!=first) { h->next = first->next; first->next = h; h = q; q = q->next; } m->next = first->next; first->next = m; } template<class T> Status CircList<T>::del_val(T x) { if(IsEmpty()) { cout<<"链表已空(del_val)....."<<endl; return ERROR; } CircListNode<T> *q = first->next; CircListNode<T> *h = first; size_t sizemem = size; while(q!= first) { if(q->data == x) { if(q->next == first) { last = h; } h->next = q->next; delete q; --size; return OK; } h = q; q = q->next; } if(size == sizemem) { cout<<"链表中不存在该值!"<<endl; return ERROR; } } template<class T> Status CircList<T>::insert_val(T x) { CircListNode<T> *p = new CircListNode<T>; p->data = x; p->next = NULL; CircListNode<T> *q = first->next; CircListNode<T> *h = first; while(q!= first && q->data<x) { h = q; q = q->next; } if(q == first) { last = p; } p->next = q; h->next = p; ++size; return OK; } template<class T> CircListNode<T>* CircList<T>::find(T key) { if(IsEmpty()) { cout<<"链表为空()find..."<<endl; } CircListNode<T> *q = first->next; while(q != first&&q->data != key) { q=q->next; } if(q == first) { return NULL; } else { return q; } } template<class T> Status CircList<T>::pop_front() { if(IsEmpty()) { cout<<"空链表不能删除(pop_front)......"<<endl; return ERROR; } CircListNode<T> *q = first->next; first->next = q->next; delete q; if(size == 1) { last = first; } --size; return OK; } template<class T> Status CircList<T>::pop_back() { if(IsEmpty()) { cout<<"空链表不能删除(pop_back)......"<<endl; return ERROR; } CircListNode<T> *q = first; while(q->next!=last) { q=q->next; } q->next = first; delete last; last = q; --size; return OK; } template<class T> Status CircList<T>::push_front(T x) { CircListNode<T> *s = new CircListNode<T>; s->data = x; s->next = first->next; first->next = s; if(size == 0) { last = s; } ++size; return OK; } template<class T> void CircList<T>::show_circlist() { CircListNode<T> *p = first; while(p->next != first) { p=p->next; cout<<p->data<<"-->"; } cout<<"NULL"<<endl; } template<class T> Status CircList<T>::push_back(T x) { CircListNode<T> *s = new CircListNode<T>; s->data = x; last->next = s; last = s; last->next = first; ++size; return OK; } template<class T> void CircList<T>::makeEmpty() { if(IsEmpty()) { cout<<"链表已空..."<<endl; } else { CircListNode<T> *q; while(first->next != first) { q = first->next; first->next = q->next; delete q; } last = first; size = 0; } }
#if 1#include"CircList.h"int main(){ CircList<int> myls;CircList<int> yourls;int select = 1;while(select){cout<<"||========================================||"<<endl;cout<<"||==[1]push_front [2]push_back=======||"<<endl;cout<<"||==[3]show_list [4]getlenth========||"<<endl;cout<<"||==[5]getHead_val [6]getLast_val=====||"<<endl;cout<<"||==[7]quit ||"<<endl;cout<<"||==[9]makeEmpty [10]pop_back=======||"<<endl;cout<<"||==[11]pop_front [12]insert_val=====||"<<endl;cout<<"||==[13]del_val [14]sort==========||"<<endl;cout<<"||==[15]reverse [16]find_val_rid==||"<<endl; cout<<"||========================================||"<<endl;cout<<"请输入您的选择:>";cin>>select;system("cls");switch(select){case 1:int val_pf;cout<<"请输入插入的值(以-1结束):>"<<endl;while(cin>>val_pf,val_pf!=-1){myls.push_front(val_pf);}break;case 2:int val_pb;cout<<"请输入插入的值(以-1结束):>"<<endl;while(cin>>val_pb,val_pb!=-1){myls.push_back(val_pb);}break;case 3: myls.show_circlist();break;case 4:size_t size;size = myls.getlenth();cout<<"循环链表长度为:"<<size<<endl;break;case 5:int head;head = myls.getHead_val();cout<<"该链表的第一个为:"<<head<<endl;break;case 6:int last;last = myls.getLast_val();cout<<"该链表的最后一个值为:"<<last<<endl;break;case 7:exit(1);break;case 9:myls.makeEmpty();break;case 10:myls.pop_back();break;case 11:myls.pop_front();break;case 12:int val_insert;cout<<"请输入您要插入的值:>";cin>>val_insert;myls.insert_val(val_insert);break;case 13:int val_del;cout<<"请输入您要删除的值:>";cin>>val_del;myls.del_val(val_del);break;case 14:myls.sort();break;case 15:myls.reverse();break;case 16:CircListNode<int> *key;int key_find;cout<<"请输入您要查找的值;>";cin>>key_find;key = myls.find(key_find);if(key != NULL)cout<<"找到啦!-->"<<key<<endl;elsecout<<"没找到..."<<endl;break;}}return 0;}#endif
相关文章推荐
- 数据结构之单向循环链表
- 数据结构作业代码保存-2.1 单向循环链表的建立,插入和删除,和指针移动
- 数据结构之设置尾指针的单向循环链表(参考整理严蔚敏数据结构)
- 数据结构中之单向循环链表的使用
- c语言_数据结构_单向循环链表
- 手把手写数据结构之单向循环链表操作
- 数据结构——单向链表的顺序存储及实现
- ※数据结构※→☆线性表结构(list)☆============单向循环链表 链式存储结构(list circular single)(四)
- 数据结构(java)——单向链表
- 实战数据结构(5)_双向循环链表的基本操作
- 手把手写数据结构之单向链表操作(一)
- 数据结构题典015:部分循环链表的逆转(ANSI C)
- 数据结构之静态链表和双向循环链表
- 图解数据结构(1)——大圈表示法、动态数组和单向链表
- 算法与数据结构之三----循环链表
- 实战数据结构(5)_双向循环链表的基本操作
- 数据结构——单向链表操作
- php学习第一章:PHP基础语法(三)数据结构与算法:2、单向链表
- 数据结构之单向链表实现
- 数据结构之链表与数组(二) -单向链表上的简单操作问题