Ex7_6.h
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:4k
源码类别:

书籍源码

开发平台:

Visual C++

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