双向循环链表和它名字的表意一样,就是把双向链表的两头连接,使其成为了一个环状链表。只需要将表中最后一个节点的next指针指向头节点,头节点的prior指针指向尾节点,链表就能成环儿,如图所示:
需要注意的是,虽然双向循环链表成环状,但本质上还是双向链表,因此在双向循环链表中,依然能够找到头指针和头节点等。双向循环链表和双向链表相比,唯一的不同就是双向循环链表首尾相连,其他都完全一样。
注意:因为我上面已经讲了双向链表,所以这里只注重讲他们的实现差异。另因为带头节点会更好操作,所以我的代码都有头节点。
1、双向循环链表的创建
初始化时需要将头节点的next和prior都指向自己。
//1、初始化双向循环链表(带头节点)
Status initLinkList(LinkList *list){
//创建头节点
*list = malloc(sizeof(Node));
if (*list == NULL) {
return ERROR;
}
//前驱和后继都指向自己
(*list)->prior = *list;
(*list)->data = -1;
(*list)->next = *list;
printf("已初始化链表~\n");
return OK;
}
2、遍历双向循环链表
注意它的尾节点的next不再是Null,而是头节点
//2、遍历双向循环链表
void printfLinkLisk(LinkList list){
printf("遍历链表:\n");
if (list == NULL || list->next == list) {
printf("这是一个空链表\n