C语言实现双向循环链表(附有源码)
一、双向循环链表的结构
以三个节点为例,双向循环链表结构如上图所示。每个节点都分为数据域和指针域,数据域是存储数据的;指针域存储前向指针和后向指针,前向指针指向该节点的上一个节点,后向指针指向该节点的下一个节点。循环链表是指首尾要相连,即第一个节点的前向指针指向最后一个节点,最后一个节点的后向指针指向第一个节点,形成一个环。
二、实现一个双向循环链表
1. 首先创建一个双向循环链表的节点
typedef struct Node
{
int data;
struct Node *Next;
struct Node *Pre;
}NODE, *HNODE;
2. 创建链表的菜单项、初始化、增、删、改、查等函数
//操作菜单
void menuDisplay(){
printf("菜单\n");
printf("*****************************\n");
printf("1、进入系统 0\n");
printf("2、创建链表 1\n");
printf("3、添加节点 2\n");
printf("4、删除节点 3\n");
printf("5、更改节点 4\n");
printf("6、查找数据 5\n");
printf("7、打印链表 6\n");
printf("8、删除链表 7\n");
printf("9、退出系统 8\n");
printf("*****************************\n");
}
//创建双向循环链表
HNode CreateLinkNode(void)
{
int i, length = 0, data = 0;
HNode p_new = NULL, pTail = NULL;
HNode head = (HNode)malloc(sizeof(NODE));
if (NULL == head)
{
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
head->data = 0;
head->next= head;
head->pre= head;
pTail = head;
printf("请输入想要创建链表的长度:");
scanf("%d", &length);
for (i=1; i<length+1; i++)
{
p_new = (HNode)malloc(sizeof(NODE));
if (NULL == p_new)
{
printf("内存分配失败!\n");
exit(EXIT_FAILURE);
}
printf("请输入第%d个节点元素值:", i);
scanf("%d", &data)