前言
- 本节主要进行C语言数据结构双循环链表的学习。
1.双循环链表介绍
- 循环双链表是对双链表的改进,将尾结点与头结点建立连接,使得尾结点可以直接查找到头结点,头结点也能够直接查找到头结点,以此来提高查找的效率。

2.双循环链表实现
- 实现内容与前章相同,1.初始化;2.插入节点:头插法、尾插法;3.删除节点;4.遍历链表。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct Node//定义数据结构,包含数据域和next域
{
int data;//data域
struct Node* pre;//pre指针域
struct Node* next;//next指针域
}Node;
Node* initList()//初始化头节点
{
Node* list=(Node*)malloc(sizeof(Node));//开辟空间,新建节点
list->data=0;//链表默认个数为0
list->pre=list;//链表为空,故头节点pre域循环指向自己
list->next=list;//链表为空,故头节点next域循环指向自己
return list;
}
void headInsert(Node* list,int data)//头插法
{
Node* node = (Node*)malloc(sizeof(Node));//开辟空间,新建节点
node->data = data;//data给到新建节点的数据域
node->pre = list;//pre指向头节点
node->next = list->next;//新建节点的next指向的是原先链表的第一个节点,也就是头节点指向的节点
list->next->pre=node;//循环的,不用考虑链表为空的情况,原第一个节点的pre前一个节点变成了新节点node
list->next = node;//头节点指向新建节点
list->data++;//插入链表使data域节点数加一
}
void tailInsert(Node* list,int data)//尾插法
{
Node* node = (Node*)malloc(sizeof(Node));//开辟空间,新建节点
node->data = data;//data给到新建节点的数据域
node->next=list;//新建节点node的next域指向头节点
node->pre=list->pre;//新建节点node的pre域指向头节点的前驱节点
list->pre->next=node;//头节点的前驱节点的next域指向新建节点node
list->pre=node;//头节点的前驱指向新建节点node
list->data++;//插入链表使data域节点数加一
}
bool delete(Node* list,int data)//删除
{
Node* node=list->next;//保存第一个节点开始,从它开始遍历
while(node!=list)//遍历,可使用头节点data进行for循环遍历
{
if(node->data==data)//找到data
{
node->pre->next=node->next;//将前一个节点的next指向要要删除节点的下一个节点
node->next->pre=node->pre;//不是最后一个节点,则将下一个节点的pre指向要要删除节点的前一个节点
free(node);//释放要铲除节点的堆内存空间
break;//退出循环
}
node = node->next;//未找到data则往后继续遍历
}
if(node!=list)//未遍历到头,说明删除成功
{
list->data--;
return true;
}
else return false;//能遍历到头,说明未找到data,删除失败报错
}
void printList(Node* list)//遍历操作
{
Node* node=list->next;//循环链表的第一个节点给到新建节点node,即头节点的下一个
while(node!=list)
{
printf("%d->",node->data);
node=node->next;
}
printf("NULL\n");
}
int main()
{
Node* list= initList();//初始化头节点,创捷链表节点
headInsert(list,5);
headInsert(list,4);
headInsert(list,3);
headInsert(list,2);
headInsert(list,1);
tailInsert(list,6);
tailInsert(list,7);
tailInsert(list,8);
tailInsert(list,9);
tailInsert(list,10);
printList(list);
printf("%d\n",delete(list,1));
printf("%d\n",delete(list,11));
printf("%d\n",delete(list,6));
printf("%d\n",delete(list,6));
printf("%d\n",delete(list,10));
printList(list);
system("pause");
}

参考资料:
链接1: UP从0到1带你手撕数据结构全集(C语言版)
链接2: 双向循环链表详解(C语言版)
1119

被折叠的 条评论
为什么被折叠?



