#|数据结构-双向循环链表

单向循环链表:
单链表通过首尾连接可以构成单向循环链表
#|数据结构-双向循环链表
文章图片


双向循环链表:
双向链表进行首尾连接
#|数据结构-双向循环链表
文章图片

当问题中涉及到需要 "循环往复" 地遍历表中数据时,就需要使用双向循环链表。
创建双向链表:

//创建双向循环链表 line* initLine(line * head){ head=(line*)malloc(sizeof(line)); head->prior=NULL; head->next=NULL; head->data=https://www.it610.com/article/1; line * list=head; for (int i=2; i<=3; i++) { line * body=(line*)malloc(sizeof(line)); body->prior=NULL; body->next=NULL; body->data=https://www.it610.com/article/i; list->next=body; body->prior=list; list=list->next; } //通过以上代码,已经创建好双线链表,接下来将链表的首尾节点进行双向连接 list->next=head; head->prior=list; return head; }

通过向 main 函数中调用 initLine 函数,就可以成功创建一个存储有 {1,2,3} 数据的双向循环链表,
#include #include typedef struct line{ struct line * prior; int data; struct line * next; }line; line* initLine(line * head); void display(line * head); int main() { line * head=NULL; head=initLine(head); display(head); return 0; } //创建双向循环链表 line* initLine(line * head){ head=(line*)malloc(sizeof(line)); head->prior=NULL; head->next=NULL; head->data=https://www.it610.com/article/1; line * list=head; for (int i=2; i<=3; i++) { line * body=(line*)malloc(sizeof(line)); body->prior=NULL; body->next=NULL; body->data=https://www.it610.com/article/i; list->next=body; body->prior=list; list=list->next; } //通过以上代码,已经创建好双线链表,接下来将链表的首尾节点进行双向连接 list->next=head; head->prior=list; return head; } //输出链表的功能函数 void display(line * head){ line * temp=head; //由于是循环链表,所以当遍历指针temp指向的下一个节点是head时,证明此时已经循环至链表的最后一个节点 while (temp->next!=head) { if (temp->next==NULL) { printf("%d\n",temp->data); }else{ printf("%d->",temp->data); } temp=temp->next; } //输出循环链表中最后一个节点的值 printf("%d",temp->data); }

输出结果:
【#|数据结构-双向循环链表】#|数据结构-双向循环链表
文章图片


    推荐阅读