双向循环链表

  

<强>循环双向链表如下图所示:
双向循环链表”> <br/>  大家通过图来看与循环单链表基本是一样,代码的套路也基本一样,除了每个节点都多一个前驱。<br/>  很多和我一样的初学者都很困惑,单链表、双链表,还有循环链表为什么搞那么复杂,<强>很简单因为需求。</强> <br/>  学编程你不得不时刻容纳新知识,很多人没有去深入去学习,就像没有驱动一样。有单向就有双向,有双向就有循环,更多的需求让大家进步,就像人不懂得满足。<br/>  有些人问我,为什么别人能够把代码逻辑写的清晰,为什么如何别人能够那么优秀,很多人说:练习的多,敲代码量大,不得不否认确实有这方面因素,<强>但是我认为思考更为重要。大量的思考让这些编程员中脑子可以浮动出任何的算法与数据结构,这也许才是真正的灵魂。</强> <br/>  扯远了,再来一张构造双向链表的图,因为与单链表不同,所以格外做了一张图让刚学习的朋友们删除等参考,分享更多的知识。<br/> <img src=

  

代码如下:

  
 <代码> # include & lt; stdio.h>
  # include & lt; malloc.h>
  # include & lt; stdlib.h>
  
  typedef结构节点
  {
  int数据;
  结构节点*下;
  结构节点*之前;
  * PNode}节点;
  
  空白ControlLinkList (PNode PHead);//控制函数
  PNode CreateLinkList(无效);//构造双向循环链表
  int PositionLinkList (PNode PHead);//正向遍历
  空白ReverseLinkList (PNode PHead);//逆向遍历
  空白InsertLinkList (PNode PHead, int pos, int len);//插入某节点
  空白DeleteLinkList (PNode PHead, int pos);//删除某节点
  空白FindDLinkList (PNode PHead, int pos);//查询某节点
  空白ReleaseLinkList (PNode PHead);//释放链表
  空白ReversesLinkList (PNode人了);//反转链表,对于循环双向链表反转没有太大意义
  
  int主要(空白)
  {
  
  PNode PHead=CreateLinkList ();
  ControlLinkList (PHead);
  返回0;
  }
  
  PNode CreateLinkList(空白)
  {
  int len=0;
  int我;
  PNode PHead=(PNode) malloc (sizeof(节点));
  PNode r;
  如果(NULL==PHead)
  {
  printf("分配内存失败\ n”);
  退出(EXIT_FAILURE);
  }//初始化头
  PHead→数据=https://www.yisu.com/zixun/0;
  之前PHead ->=PHead;
  PHead下一步->=PHead;
  r=PHead;
  
  printf(“请输入构造几个节点:”);
  scanf (“% d”, len);
  
  (我=0;我& lt;兰;我+ +)
  {
  PNode p=(PNode) malloc (sizeof(节点));
  如果(NULL==p)
  {
  printf("分配内存失败\ n”);
  退出(EXIT_FAILURE);
  }
  
  printf("请输入数据:");
  scanf (“% d”,和p→数据);
  
  p→下=零;//后驱为NULL
  p→前=r;//前驱指向r也就是PHead头节点
  r→下=p;//然后r的后驱也就PHead的后驱指向p
  r=p;//最后r=p;
  }
  r→下=PHead;
  之前PHead→=r;//这两步完成了链表循环,头尾想指
  返回PHead;//循环双向链表返回头指针既可以正向反向遍历
  }
  
  int PositionLinkList (PNode PHead)
  {
  int i=0;
  PNode p=PHead→下;//PHead→下才是链表第一个元素
  而(零!=p和,PHead !=p)
  {
  我+ +;
  printf(“没有。% d=https://www.yisu.com/zixun/%d/n的数据”,我,p→数据);
  p=p→下;
  }
  printf("正向遍历成功”);
  返回我;
  }
  
  空白ReverseLinkList (PNode PHead)
  {
  int i=0;
  PNode p=PHead→之前;//指向了链表尾部r
  而(零!=p和,p !=PHead)
  {
  我+ +;
  printf(“没有。% d=https://www.yisu.com/zixun/%d/n的数据”,我,p→数据);
  p=p→之前;
  }
  printf(“逆向遍历成功\ n”);
  }
  
  空白InsertLinkList (PNode PHead, int pos, int数据)
  {
  int i=1;
  PNode p=PHead→下;
  PNode PNew=(PNode) malloc (sizeof(节点));
  如果(NULL==p)
  {
  printf("内存分配失败\ n”);
  退出(EXIT_FAILURE);
  }
  
  而(p !=零,,我!=pos-1)
  {
  我+ +;
  p=p→下;
  }
  
  PNew→数据=https://www.yisu.com/zixun/data;
  前p ->下一步->=PNew;
  PNew下=p -> -> next;
  p -> next=PNew;
  之前PNew ->=p;
  
  printf("插入成功\ n”);
  }
  
  空白FindLinkList (PNode PHead, int pos)
  {
  PNode p=PHead→下;
  int i=1;
  而(零!=p和,我!=pos)
  {
  我+ +;
  p=p→下;
  }
  printf(“没有。% d=https://www.yisu.com/zixun/%d/n的数据”,我,p→数据);
  }
  
  空白DeleteLinkList (PNode PHead, int pos)
  {
  int i=1;
  PNode p=PHead→下;
  PNode温度;
  而(零!=p和,我!=pos)
  {
  我+ +;
  p=p→下;
  }
  
  temp=p→下;//临时指向删除的节点
  下=p p→→下一步→下;//p→下一节点指向删除节点的下一个
  p→下一步→下一步→前=p;
  免费的(临时);
  printf("删除节点成功\ n”);
  }
  
  空白ReleaseLinkList (PNode PHead)
  {
  PNode p, q;
  p=PHead;
  q=p→下;
  而(q !=PHead)
  {
  p=;
  q=p→下;
  自由(p);
  }
  免费(PHead);
  printf("释放内存成功”);
  }
  
  空白ControlLinkList (PNode PHead)
  {
  int len=0;
  int pos=0;
  len=PositionLinkList (PHead);
  ReverseLinkList (PHead);
  printf(“请输入pos节点:”);
  scanf (“% d”,和pos);
  InsertLinkList (PHead pos 10);
  PositionLinkList (PHead);
  printf(“请输入查询的节点:”);
  scanf (“% d”,和pos);
  FindLinkList (PHead pos);
  printf(“请输入删除的节点:”);
  scanf (“% d”,和pos);
  DeleteLinkList (PHead pos);
  PositionLinkList (PHead);
  ReleaseLinkList (PHead);
  }

双向循环链表