循环双链表:
/***********循环双链表**********/
#include <stdio.h>
#include <stdlib.h>
typedef struct Dnode{ //循环双链表的数据结构
int data;
struct Dnode *prior,*next;
}LinkList;
LinkList *LinkList_Create(void) //循环双链表的创建函数
{
int n;
LinkList *head,*end,*node;
end=head=(LinkList *)malloc(sizeof(LinkList));
printf("请输入需要创建的循环双链表的大小:\n");
scanf("%d",&n);
printf("请依次输入%d个数值:\n",n);
while(n)
{
int data;
node=(LinkList *)malloc(sizeof(LinkList));
scanf("%d",&data);
node->data=data;
end->next=node;
node->prior=end;
end=node;
n--;
}
end->next=head; //尾指针的next指向头节点
head->prior=end; //头节点的prior指向尾节点,形成环
return head;
}
void LinkList_Insert(LinkList *head) //循环双链表的尾插法
{
int data;
LinkList *node,*temp;
temp=(LinkList *)malloc(sizeof(LinkList));
node=head->prior;
printf("请输入需要插入的数值:\n");
scanf("%d",&data);
temp->data=data;
node->next=temp;
temp->prior=node;
node=temp;
node->next=head;
}
LinkList *LinkList_Find(LinkList *head) //按值查找节点
{
int data;
LinkList *node;
node=head;
printf("请输入需要查找的数值:\n");
scanf("%d",&data);
while(node->next!=head)
{
node=node->next;
if(node->data==data)
{
printf("查找成功\n");
return node;
}
}
printf("查找失败\n");
return NULL;
}
void LinkList_Change(LinkList *head) //循环双链表修改节点的数值函数
{
int data;
LinkList *node;
node=LinkList_Find(head);
printf("请输入需要修改的值:\n");
scanf("%d",&data);
node->data=data;
printf("%d\n",node->data);
}
void LinkList_Delete(LinkList *head)
{
printf("循环双链表的删除操作:\n");
LinkList *node;
node=LinkList_Find(head);
node->prior->next=node->next;
node->next->prior=node->prior;
node=NULL;
free(node);
}
int main()
{
LinkList *start,*temp,*find;
temp=start=LinkList_Create();
LinkList_Insert(start);
//find=LinkList_Find(start);
//LinkList_Change(start);
LinkList_Delete(start);
//printf("%d\n",find->data);
while(start->next!=temp)
{
start=start->next;
printf("%d ",start->data);
}
return 0;
} //循环双链表的基本操作:增删改查
运行结果:
![](https://img-blog.csdnimg.cn/img_convert/ae1fc3b7dc4b1a5f6be303c23a472cfa.png)