C++ 数据结构 双链表(模板类)
来源:互联网 发布:搜客软件下载 编辑:程序博客网 时间:2024/06/03 09:30
#ifndef DLIST_H_INCLUDED#define DLIST_H_INCLUDED#include<iostream>using namespace std;template<class Type>class DList;template<class Type>class ListNode{ friend class DList<Type>;public: ListNode():data(Type()),next(NULL),prior(NULL) {} ListNode(Type d,ListNode<Type> *n = NULL,ListNode<Type> *m = NULL):data(d),next(n),prior(m) {} ~ListNode() {}public: void SetData(Type d) {data = d;} void GetData()const {return data;}private: Type data; ListNode<Type> *next; ListNode<Type> *prior;};template<class Type>class DList{public: DList() { first = last = BuyNode(); } ~DList() { DList<Type>::destroy(); }public:void push_back(const Type &x);void push_front(const Type &x);void show_list()const;void pop_back();void pop_front();void insert_val(const Type &x);void delete_val(const Type &x);bool find(const Type &x);Type length();void clear();void destroy(); //摧毁该顺序表void reserv(); //反转void sort();protected: ListNode<Type>* BuyNode(Type x = Type()){ ListNode<Type> *p = new ListNode<Type>(x); return p;}private: ListNode<Type> *first;ListNode<Type> *last;};template<class Type>void DList<Type>::push_back(const Type &x){ ListNode<Type> *s = BuyNode(x); last->next = s; s->prior = last; last = s; first->data++;}template<class Type>void DList<Type>::push_front(const Type &x){ ListNode<Type> *s = BuyNode(x); if(first == last) { s->prior = first; first->next = s; last = s; } else { first->next->prior = s; s->prior = first; s->next = first->next; first->next = s; } first->data++;}template<class Type>void DList<Type>::show_list()const{ ListNode<Type> *p = first->next; while(p != NULL) { cout<<p->data<<" "; p = p->next; } cout<<endl;}template<class Type>void DList<Type>::pop_back(){ if(first->data == 0) return; ListNode<Type> *p = first; while(p->next != last) p = p->next; ListNode<Type> *q = p->next; p->next = NULL; last = p; delete q; first->data--;}template<class Type>void DList<Type>::pop_front(){ if(first->data <= 1) pop_back(); else { ListNode<Type> *p = first->next; p->next->prior = first; first = p->next->prior; first->next = p->next; p = NULL; delete p; first->data--; }}template<class Type>void DList<Type>::insert_val(const Type &x){ ListNode<Type> *s = BuyNode(x); ListNode<Type> *p = first->next; if(p->data > s->data) { push_front(s->data); } else if(last->data < s->data) { push_back(s->data); } else { while(p != NULL) { if(p->next->data>x) { p->next->prior = s; s->prior = p; s->next = p->next; p->next = s; first->data++; return; } p=p->next; } }}template<class Type>void DList<Type>::delete_val(const Type &x){ ListNode<Type> *p = first; while (p->next != NULL && p->next->data != x) p = p->next; if (p->next == NULL)//未找到即返回 { cout<<"未找到该值"<<endl; return; } ListNode<Type> *q = p->next; if (q == last) pop_back(); else { q->next->prior = p; p->next = q->next; } delete q; first->data--;}template<class Type>bool DList<Type>::find(const Type &x){ ListNode<Type> *p = first->next; while(p != NULL && p->data != x) p = p->next; if(p == NULL) {cout<<"未找到该值"<<endl; return false;} else {cout<<"存在该值"<<endl; return true;}}template<class Type>Type DList<Type>::length(){ cout<<"length = "<<first->data<<endl;}template<class Type>void DList<Type>::clear(){ while(first->data >0) pop_front();}template<class Type>void DList<Type>::destroy()//摧毁该顺序表{ clear(); first = last = NULL; delete first;}template<class Type>void DList<Type>::reserv() //反转{ ListNode<Type> *p = first->next; ListNode<Type> *curr = p->next; ListNode<Type> *tmp = NULL; first->next->next = NULL; while (curr) //将直接后继指向当前指针的next { tmp = curr->next; curr->next = p; p = curr; curr = tmp; } first->next = p;}template<class Type>void DList<Type>::sort(){ ListNode<Type> *s = first->next; while (s->next) { ListNode<Type> *p = s; while(p->next) { if(s->data > p->next->data) { Type tmp = s->data; s->data = p->next->data; p->next->data = tmp; } p = p->next; } s = s->next; }}#endif // DLIST_H_INCLUDED
<pre name="code" class="cpp">#include"DList.h"int main(){ DList<int> mylist;int select = 1;int Item;int pos;while(select){cout<<"**************************************"<<endl;cout<<"* [1] push_back [2] push_front *"<<endl;cout<<"* [3] show_list [0] quit_system*"<<endl;cout<<"* [4] pop_back [5] pop_front *"<<endl;cout<<"* [6] insert_val [7] delete_val *"<<endl;cout<<"* [8] find [9] length *"<<endl;cout<<"* [10]clear [11]destroy *"<<endl;cout<<"* [12]reserv [13]sort *"<<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:mylist.show_list();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:cout<<"请输入要查找的值:>";cin>>Item;mylist.find(Item);break; case 9: mylist.length(); break; case 10: mylist.clear(); break; case 11: mylist.destroy(); break; case 12: mylist.reserv(); break; case 13: mylist.sort(); break;default:break; } }}
0 0
- 数据结构之双链表C++(模板)
- 数据结构(C++)----单链表模板类
- 数据结构(c++)最小堆模板类
- C++ 数据结构 双链表(模板类)
- 数据结构(C++)最小优先权队列实现<模板类>
- [数据结构] 顺序表的实现(c++/类模板)
- [数据结构]链表的实现(c++/类模板)
- [数据结构]栈的实现(c++/类模板)
- [数据结构]循环链表(c++/类模板)用例JosephRing
- 数据结构之单链表C++(模板)
- 【c/c++】类模板
- 【C/C++】模板类
- C++数据结构 单链表(模板类)
- 数据结构之 单链表 模板类
- 数据结构之 矩阵 模板类
- 【c++】模板和模板类
- 数据结构(C++)-用顺序结构实现的栈模板类
- 数据结构(c++)栈的模板类(使用链表实现)
- 【转载】理工渣眼中的HMM及安全应用
- eclipse在.java文件中调用xml文件中元素出错
- 设计包含min函数的栈。
- 小火箭案例
- 第12周项目4 - 点、圆的关系
- C++ 数据结构 双链表(模板类)
- 第13周上机实践项目1——动物这样叫
- Auto Layout 使用心得(五)—— 根据文字、图片自动计算 UITableViewCell 高度
- 安装pip,安装kazoo和一个简单例子
- Ubuntu: Install newest firefox
- Lucene基础(四)-- 结合数据库使用
- 连载《一个程序员的成长历程》-19.工作7年,对做技术的一点感悟和理解
- 《程序员修炼之道–从小工到专家》笔记
- cannot resolve getAttribute(java.lang.String)问题的解决