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

书籍源码

开发平台:

Visual C++

  1. #include<iostream>
  2. using namespace std;
  3. //首先看结点组织,采用结点类加数据类
  4. class Object{//数据类为抽象类
  5. public:
  6. Object(){}
  7. virtual bool operator>(Object &)=0;//纯虚函数,参数必须为引用或指针
  8. virtual bool operator!=(Object &)=0;//纯虚函数,参数必须为引用或指针
  9. virtual void Print()=0;//纯虚函数
  10. virtual ~Object(){} //析构函数可为虚函数,构造函数不行
  11. };
  12. class DblNode{
  13. Object* info;     //数据域用指针指向数据类对象
  14. DblNode *llink,*rlink;    //前驱(左链)、后继(右链)指针
  15. public:
  16. DblNode(); //生成头结点的构造函数
  17.     ~DblNode();
  18. void Linkinfo(Object* obj);
  19. friend class DblList;
  20. //以DblList为友元类,DblList可直接访问DblNode的私有函数,与结构一样方便,但更安全
  21. };
  22. DblNode::DblNode(){info=NULL;llink=rlink=NULL;}
  23. DblNode::~DblNode(){
  24. cout<<"删除结点类"<<'t';
  25. delete info;     //释放数据域
  26. }
  27. void DblNode::Linkinfo(Object * obj){info=obj;}
  28. //再定义双链表类,选择常用操作
  29. class DblList{
  30. DblNode *head,*current;
  31. public:
  32. DblList();//构造函数,生成头结点(空链表)
  33. ~DblList();//析构函数
  34. void MakeEmpty();//清空链表,只余表头结点
  35. void InsertFront(DblNode* p);      //可用来向前生成链表,在表头插入一个结点
  36. void InsertRear(DblNode* p);       //可用来向后生成链表,在表尾添加一个结点
  37. void InsertOrder(DblNode* p);  //按升序生成链表
  38. DblNode* CreatNode();//创建一个结点(孤立结点)
  39. DblNode* DeleteNode(DblNode* p);        //删除指定结点
  40. void PrintList();//打印链表的数据域
  41. int Length();//计算链表长度
  42. DblNode *Find(Object & obj);//搜索数据域与定值相同的结点,返回该结点的地址
  43. //其它操作
  44. };
  45. DblList::DblList(){//建立表头结点
  46. head=new DblNode();
  47. head->rlink=head->llink=head;
  48. current=NULL;
  49. }
  50. DblList::~DblList(){
  51. MakeEmpty();//清空链表
  52. cout<<"删除头结点:";
  53. delete head;
  54. }
  55. void DblList::MakeEmpty(){
  56. DblNode *tempP;
  57. while(head->rlink!=head){
  58. tempP=head->rlink;
  59. head->rlink=tempP->rlink;//把头结点后的第一个节点从链中脱离
  60. tempP->rlink->llink=head;//处理左指针
  61. delete tempP;           //删除(释放)脱离下来的结点
  62. }
  63. current=NULL;  //current指针恢复
  64. }
  65. void DblList::InsertFront(DblNode *p){
  66. p->llink=head;//注意次序
  67. p->rlink=head->rlink;
  68. head->rlink->llink=p;
  69. head->rlink=p;//最后做
  70. }
  71. void DblList::InsertRear(DblNode *p){
  72. p->rlink=head;//注意次序
  73. p->llink=head->llink;
  74. head->llink->rlink=p;
  75. head->llink=p;//最后做
  76. }
  77. void DblList::InsertOrder(DblNode* p){
  78. if(head==head->llink) {
  79. p->llink=head;//注意次序
  80. p->rlink=head->rlink;
  81. head->rlink->llink=p;
  82. head->rlink=p;//最后做
  83. }
  84. else{
  85. current=head->rlink;
  86. while(current!=head){
  87. if(*current->info>*p->info) break; //找第一个比插入结点大的结点
  88. current=current->rlink;
  89. }
  90. p->rlink=current;//注意次序
  91. p->llink=current->llink;
  92. current->llink->rlink=p;
  93. current->llink=p;//最后做
  94. }
  95. }
  96. DblNode* DblList::CreatNode(){//建立新节点
  97. current=new DblNode();
  98. return current;
  99. }
  100. DblNode* DblList::DeleteNode(DblNode* p){
  101. current=head->rlink;
  102. while(current!=head&&current!=p) current=current->rlink;
  103. if(current==head) current=NULL;
  104. else{//结点摘下
  105. p->llink->rlink=p->rlink;
  106. p->rlink->llink=p->llink;
  107. p->rlink=p->llink=NULL;
  108. }
  109. return current;
  110. }
  111. DblNode* DblList::Find(Object & obj){//对抽象类只能用“引用”
  112. current=head->rlink;
  113. while(current!=head&&*current->info!=obj) current=current->rlink;
  114. if(current==head) current=NULL;
  115. return current;//搜索成功返回该结点地址,不成功返回NULL
  116. }
  117. void DblList::PrintList(){
  118. current=head->rlink;
  119. while(current!=head){
  120. current->info->Print();
  121. current=current->rlink;
  122. }
  123. cout<<endl;
  124. }
  125. DblList::Length(){
  126. int count=0;
  127. current=head->rlink;
  128. while(current!=head){
  129. count++;
  130. current=current->rlink;
  131. }
  132. return count;
  133. }