deque.h
上传用户:shunfadg
上传日期:2022-07-28
资源大小:4k
文件大小:5k
源码类别:

数据结构

开发平台:

Visual C++

  1. //由单链表类模板派生双端队列
  2. #include<iostream>
  3. #include<cassert>
  4. using namespace std;
  5. //首先看结点组织,采用结点类,凡与结点数据和指针操作有关函数作为成员函数
  6. template<typename T>class List;
  7. template<typename T>class Node{
  8. public:
  9. T info; //数据域
  10. Node<T> *link;                          //指针域
  11. Node();                                 //生成头结点的构造函数
  12. Node(const T & data); //生成一般结点的构造函数
  13. void InsertAfter(Node<T>* P);           //在当前结点后插入一个结点
  14. Node<T>* RemoveAfter(); //删除当前结点的后继结点,返回该结点备用
  15. //以List为友元类,List可直接访问Node的私有成员,与结构一样方便,但更安全
  16. };
  17. template <typename T> Node<T>::Node(){link=NULL;}
  18. template <typename T> Node<T>::Node(const T & data){
  19. info=data;
  20. link=NULL;
  21. }
  22. template<typename T>void Node<T>::InsertAfter(Node<T>* p){
  23. p->link=link;
  24. link=p;
  25. }
  26. template<typename T>Node<T>* Node<T>::RemoveAfter(){
  27. Node<T>* tempP=link;
  28. if(link==NULL) tempP=NULL; //已在链尾,后面无结点
  29. else link=tempP->link;
  30. return tempP;
  31. }
  32. //再定义链表类,选择常用操作:包括建立有序链表、搜索遍历、插入、删除、取数据等
  33. template<typename T>class List{
  34. protected:
  35. Node<T> *head,*tail; //链表头指针和尾指针
  36. public:
  37. List(); //构造函数,生成头结点(空链表)
  38. ~List(); //析构函数
  39. void MakeEmpty(); //清空一个链表,只余表头结点
  40. Node<T>* Find(T data); //搜索数据域与data相同的结点,返回该结点的地址
  41. int Length(); //计算单链表长度
  42. friend ostream & operator<<(ostream &,const List<T> & ); //打印链表的数据域
  43.     void InsertFront(Node<T>* p); //可用来向前生成链表,在表头插入一个结点
  44. void InsertRear(Node<T>* p); //可用来向后生成链表,在表尾添加一个结点
  45. void InsertOrder(Node<T> *p); //按升序生成链表
  46. Node<T>* CreatNode(T data); //创建一个结点(孤立结点)
  47. Node<T>* DeleteNode(Node<T>* p); //删除指定结点
  48. };
  49. template<typename T>List<T>::List(){
  50. head=tail=new Node<T>();
  51. }
  52. template<typename T>List<T>::~List(){
  53. MakeEmpty();
  54. delete head;
  55. }
  56. template<typename T>void List<T>::MakeEmpty(){
  57. Node<T> *tempP;
  58. while(head->link!=NULL){
  59. tempP=head->link;
  60. head->link=tempP->link; //把头结点后的第一个节点从链中脱离
  61. delete tempP; //删除(释放)脱离下来的结点
  62. }
  63. tail=head; //表头指针与表尾指针均指向表头结点,表示空链
  64. }
  65. template<typename T> Node<T>* List<T>::Find(T data){
  66. Node<T> *tempP=head->link;
  67. while(tempP!=NULL&&tempP->info!=data) tempP=tempP->link;
  68. return tempP; //搜索成功返回该结点地址,不成功返回NULL
  69. }
  70. template<typename T>int List<T>::Length(){
  71. Node<T>* tempP=head->link;
  72. int count=0;
  73. while(tempP!=NULL){
  74. tempP=tempP->link;
  75. count++;
  76. }
  77. return count;
  78. }
  79. template<typename T> ostream & operator<<(ostream & out,const List<T> & ls){ //打印链表的数据域
  80. Node<T>* tempP=ls.head->link;
  81. while(tempP!=NULL){
  82. out<<tempP->info<<"  ";
  83. tempP=tempP->link;
  84. }
  85. cout<<endl;
  86. return out;
  87. }
  88. template<typename T>void List<T>::InsertFront(Node<T> *p){
  89. p->link=head->link;
  90. head->link=p;
  91. if(tail==head) tail=p;
  92. }
  93. template<typename T>void List<T>::InsertRear(Node<T> *p){
  94. p->link=tail->link;
  95. tail->link=p;
  96. tail=p;
  97. }
  98. template<typename T>void List<T>::InsertOrder(Node<T> *p){
  99. Node<T> *tempP=head->link,*tempQ=head; //tempQ指向tempP前面的一个节点
  100. while(tempP!=NULL){
  101. if(p->info<tempP->info)break; //找第一个比插入结点大的结点,由tempP指向
  102. tempQ=tempP;
  103. tempP=tempP->link;
  104. }
  105. tempQ->InsertAfter(p); //插在tempP指向结点之前,tempQ之后
  106. if(tail==tempQ) tail=tempQ->link;
  107. }
  108. template<typename T>Node<T>* List<T>::DeleteNode(Node<T>* p){
  109. Node<T>* tempP=head;
  110. while(tempP->link!=NULL&&tempP->link!=p) tempP=tempP->link;
  111. if(tempP->link==tail) tail=tempP;
  112. return tempP->RemoveAfter(); //本函数所用方法可省一个工作指针,与InsertOrder比较
  113. }
  114. template<typename T>Node<T>* List<T>::CreatNode(T data){ //建立新节点
  115. Node<T>*tempP=new Node<T>(data);
  116. return tempP;
  117. }
  118. template<typename T>class DeQue:public List<T>{
  119. public:
  120. DeQue(){};
  121. ~DeQue(){};
  122. void EnDeQueTail(T data){
  123. InsertRear(CreatNode(data));
  124. }
  125. void EnDeQueHead(T data){
  126. InsertFront(CreatNode(data));
  127. }
  128. bool IsEmpty(){return head==tail;}
  129. T DeDeQueTail(){
  130. Node<T> *tempP=head;
  131. T data;
  132. assert(!IsEmpty());
  133. while(tempP->link!=NULL&&tempP->link!=tail) tempP=tempP->link;
  134. if(tempP->link==tail) tail=tempP;
  135. tempP=tempP->link;
  136. tail->link=NULL;
  137. data=tempP->info;
  138. delete tempP;
  139. return data;
  140. }
  141. T DeDeQueHead(){
  142. Node<T> *tempP;
  143. T data;
  144. assert(!IsEmpty());
  145. tempP=head->link;
  146. if(tempP==tail) tail=head;
  147. head->link=tempP->link; //把头结点后的第一个节点从链中脱离
  148. data=tempP->info;
  149. delete tempP;
  150. return data;
  151. }
  152. };