c++如何实现双向循环链表

  介绍

这篇文章主要为大家展示了c++如何实现双向循环链表,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

<强>一、概念

1。在双链表中的每个结点应有两个链接指针:

, lLink→指向前驱结点,(前驱指针或者左链指针)

rLink→指向后继结点(后驱指针或者右链指针)

2。双链表常采用带附加头结点的循环链表方式:

第一:头指针,不存放数据,或者存放特殊要求的数据。它的lLink指向双链表的尾结点(最后一个结点),

它的rLink指向双链表的首结点(第一个有效结点)。链表的首结点的左链指针lLink和尾结点的右链指针

rLink都指向附加头结点。

<强>二,实现程序

1. dbllist。h

的ifndef DblList_h
  #定义DblList_h
  # include & lt; iostream>
  使用名称空间性病;
  
  模板& lt;类T>
  struct DblNode{//链表结点定义
  T数据;
  DblNode* lLink, * rLink;//链表前驱(左链)和后继(右链)指针
  DblNode (DblNode*左=NULL, DblNode*正确的=NULL): lLink(左),rLink(右){}//构造函数
  DblNode (T值,DblNode*左=NULL, DblNode*正确的=NULL):数据(值),lLink(左),rLink(右){}//构造函数
  };
  
  模板& lt;类T>
  类DblList{//双链表(双向循环链表)
  公众:
  DblList ();//构造函数:建立附加头结点
  ~ DblList ();//析构函数:释放所有存储
  空白createDblList ();//创建双向链表
  int长度()常量;//计算双链表的长度
  bool isEmpty ();//判双链表空否
  DblNode* getHead()常量;//取附加头结点
  空白setHead (DblNode* ptr);//设置附加头结点地址
  DblNode*搜索(const T x);//在链表中沿后继方向寻找等于给定值x的结点
  DblNoded *定位(int, int);//在链表中定位第i个结点,d=0按前驱方向,否则按后继方向
  bool插入(int i (const T x, int d);//在我第个结点后插入x, d=0按前驱方向,否则按后继方向
  bool删除(int i T, x, int d);//删除第i个结点,x带回删除其值,d=0按前驱方向,否则按后继方向
  无效的输出();//输出双链表中的数据
  私人:
  DblNode*第一;//附加头结点
  };
  
  模板& lt;类T>
  DblList ();
  如果(NULL==第一){
  cerr & lt; & lt;“动态分配内存空间失败!“& lt; & lt;endl;
  退出(1);
  }
  第一个→rLink=第一→lLink=第一;//指向自身
  }
  
  模板& lt;类T>
  DblList*当前=第一→rLink;
  而(当前!=){
  当前→rLink→lLink=当前→lLink;//从lLink链中摘下
  当前→lLink→rLink=当前→rLink;//从rLink链中摘下
  删除当前;//释放空间
  当前=第一→rLink;
  }
  删除第一;
  第一次=零;
  }
  
  模板& lt;类T>
  空白DblList*当前=第一;
  cout & lt; & lt;“请输入要输入的个数n:“;
  ,cin祝辞的在n;
  cout & lt; & lt;“请输入要输入的数:“& lt; & lt;endl;
  for (int i=0;我& lt;n;我+ +){
  ,cin祝辞的在薇尔;
  DblNode* newNode=new DblNode (val);
  如果(NULL==newNode) {
  cerr & lt; & lt;“动态分配内存空间失败!“& lt; & lt;endl;
  退出(1);
  }//尾插入
  首先,(当前→rLink !=)
  当前=当前→rLink;//往后继方向移动
  newNode→rLink=当前→rLink;
  当前→rLink=newNode;
  newNode→rLink→lLink=newNode;
  newNode→lLink=当前;
  当前=当前→rLink;//当前往后移
  }
  }
  
  模板& lt;类T>
  int DblList*当前=第一→rLink;
  int数=0;
  
  而(当前!=){
  当前=当前→rLink;
  数+ +;
  }
  返回计数;
  }
  
  模板& lt;类T>
  bool DblList
  DblNode* DblList
  空白DblList* ptr) {//设置附加头结点地址
  第一次=ptr;
  }
  
  模板& lt;类T>
  DblNode* DblListc++如何实现双向循环链表