2.13双向循环链表及创建(C语言)

我们知道,单链表通过首尾连接可以构成单向循环链表,如图 1 所示:


单向循环链表示意图
图 1 单向循环链表示意图


同样,双向链表也可以进行首尾连接,构成双向循环链表。如图 2 所示:


双向循环链表示意图
图 2 双向循环链表示意图


当问题中涉及到需要 "循环往复" 地遍历表中数据时,就需要使用双向循环链表。例如,前面章节我们对约瑟夫环问题进行了研究,其实约瑟夫环问题有多种玩法,每次顺时针报数后,下一轮可以逆时针报数,然后再顺时针......一直到剩下最后一个人。解决这个问题就需要使用双向循环链表结构。

双向循环链表的创建

创建双向循环链表,只需在创建完成双向链表的基础上,将其首尾节点进行双向连接即可。

C 语言实现代码如下:

 
  1. //创建双向循环链表
  2. line* initLine(line * head){
  3. head=(line*)malloc(sizeof(line));
  4. head->prior=NULL;
  5. head->next=NULL;
  6. head->data=1;
  7. line * list=head;
  8. for (int i=2; i<=3; i++) {
  9. line * body=(line*)malloc(sizeof(line));
  10. body->prior=NULL;
  11. body->next=NULL;
  12. body->data=i;
  13.  
  14. list->next=body;
  15. body->prior=list;
  16. list=list->next;
  17. }
  18. //通过以上代码,已经创建好双线链表,接下来将链表的首尾节点进行双向连接
  19. list->next=head;
  20. head->prior=list;
  21. return head;
  22. }


通过向 main 函数中调用 initLine 函数,就可以成功创建一个存储有 {1,2,3} 数据的双向循环链表,其完整的 C 语言实现代码为:

 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct line{
  4. struct line * prior;
  5. int data;
  6. struct line * next;
  7. }line;
  8.  
  9. line* initLine(line * head);
  10. void display(line * head);
  11. int main() {
  12. line * head=NULL;
  13. head=initLine(head);
  14. display(head);
  15. return 0;
  16. }
  17. //创建双向循环链表
  18. line* initLine(line * head){
  19. head=(line*)malloc(sizeof(line));
  20. head->prior=NULL;
  21. head->next=NULL;
  22. head->data=1;
  23. line * list=head;
  24. for (int i=2; i<=3; i++) {
  25. line * body=(line*)malloc(sizeof(line));
  26. body->prior=NULL;
  27. body->next=NULL;
  28. body->data=i;
  29.  
  30. list->next=body;
  31. body->prior=list;
  32. list=list->next;
  33. }
  34. //通过以上代码,已经创建好双线链表,接下来将链表的首尾节点进行双向连接
  35. list->next=head;
  36. head->prior=list;
  37. return head;
  38. }
  39.  
  40. //输出链表的功能函数
  41. void display(line * head){
  42. line * temp=head;
  43. //由于是循环链表,所以当遍历指针temp指向的下一个节点是head时,证明此时已经循环至链表的最后一个节点
  44. while (temp->next!=head) {
  45. if (temp->next==NULL) {
  46. printf("%d\n",temp->data);
  47. }else{
  48. printf("%d->",temp->data);
  49. }
  50. temp=temp->next;
  51. }
  52. //输出循环链表中最后一个节点的值
  53. printf("%d",temp->data);
  54. }

程序输出结果如下:

1->2->3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值