C语言循环双链表实现方法是什么
导读:这篇文章给大家分享的是“C语言循环双链表实现方法是什么”,文中的讲解内容简单清晰,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下“C语言循环双链表实现方法是什么”吧。 本文实例...
这篇文章给大家分享的是“C语言循环双链表实现方法是什么”,文中的讲解内容简单清晰,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下“C语言循环双链表实现方法是什么”吧。本文实例为大家分享了C语言实现循环双链表的具体代码,供大家参考,具体内容如下
#includestdio.h>
#includestdlib.h>
#includestdbool.h>
typedef int DataType;
typedef struct Node
{
DataType data;
// 数据域
struct Node * prior;
// 前趋指针
struct Node * next;
// 后继指针
}
LinkList;
LinkList* Init_List();
// 初始化循环双链表
bool Creat_List(LinkList * L);
// 创建链表
int Length_List(LinkList * L);
// 链表长度
bool Empty_List(LinkList * L);
// 判空
bool Insert_List(LinkList * L, int pos, DataType x);
// 插入
bool Delete_List(LinkList * L, int pos, DataType * x);
// 删除
bool Destroy_List(LinkList * L);
// 销毁链表
bool Traverse_List(LinkList * L);
// 遍历链表
int Prior_Value(LinkList * L, int pos);
// 前趋结点的值
int main()
{
DataType x;
int pos;
LinkList * L = Init_List();
if(Creat_List(L))
printf("链表构造成功!\n");
else
printf("链表构造失败!\n");
printf("遍历链表:");
Traverse_List(L);
printf("链表结点个数:%d\n\n", Length_List(L));
printf("输入要求前趋结点的结点:");
scanf("%d",&
pos);
printf("第%d个结点的前趋结点:%d\n\n",pos,Prior_Value(L, pos));
Insert_List(L, 2, 5);
printf("插入结点:第2个结点\n");
printf("插入元素:5\n");
printf("遍历链表:");
Traverse_List(L);
Delete_List(L, 3, &
x);
printf("删除结点:第3个结点\n");
printf("被删除元素:%d\n",x);
printf("遍历链表:");
Traverse_List(L);
if(Destroy_List(L))
printf("销毁成功!\n");
else
printf("销毁失败!\n");
return 0;
}
LinkList* Init_List()
{
LinkList * L = (LinkList *)malloc(sizeof(LinkList));
// 创建头结点
if(!L)
{
printf("申请空间失败!\n");
exit(-1);
}
L->
next = L->
prior = L;
// 空表,前趋指针和后继指针均指向其自身
return L;
// 返回头结点的地址
}
bool Creat_List(LinkList * L)
{
int i,n,val;
LinkList * p = L;
// 保证L始终指向头结点
printf("请输入循环双链表的结点个数:");
scanf("%d",&
n);
for(i=0;
in;
++i)
{
printf("第%d个结点:",i+1);
scanf("%d",&
val);
LinkList * q = (LinkList*)malloc(sizeof(LinkList));
q->
data = val;
p->
next = q;
q->
prior = p;
p = q;
}
p->
next = L;
// 保证最后一个结点的后继指针指向头结点
L->
prior = p;
// 保证头结点的前趋指针指向最后一个结点
return true;
}
int Length_List(LinkList * L)
{
int len = 0;
LinkList * p = L->
next;
while(p!=L) // 最后一个结点也要加上
{
len++;
p = p->
next;
}
return len;
}
bool Empty_List(LinkList * L)
{
if(L->
next==L&
&
L->
prior==L)
return true;
else
return false;
}
bool Insert_List(LinkList * L, int pos, DataType x)
{
int i = 1;
LinkList * p = L->
next;
if(pos1||pos>
Length_List(L))
return false;
while(ipos-1&
&
L!=p) // 指针移动到被插入结点的前一个结点
{
i++;
p = p->
next;
}
LinkList * q = (LinkList*)malloc(sizeof(LinkList));
q->
data = x;
q->
next = p->
next;
q->
prior = p;
p->
next->
prior = q;
p->
next = q;
return true;
}
bool Delete_List(LinkList * L, int pos, DataType * x)
{
int i = 1;
LinkList * p = L->
next;
if(pos1||pos>
Length_List(L))
return false;
while(ipos-1&
&
L!=p)
{
i++;
p = p->
next;
}
LinkList * q = p->
next;
*x = q->
data;
p->
next = q->
next;
q->
next->
prior = p;
free(q);
return true;
}
bool Destroy_List(LinkList * L)
{
// 将循环双链表变成单链表
LinkList * p = L->
next;
L->
next = NULL;
// 空表时, 头结点的前趋指针、后继指针都是指向其自身
L->
prior = NULL;
// 销毁时,头结点前趋指针、后继指针指向空
while(p)
{
LinkList * q = p->
next;
free(p);
p = q;
}
L = p = NULL;
return true;
}
bool Traverse_List(LinkList * L)
{
if(Empty_List(L))
return false;
LinkList * p = L->
next;
while(p!=L)
{
printf("%3d",p->
data);
p = p->
next;
}
printf("\n\n");
}
int Prior_Value(LinkList * L, int pos)
{
int i = 1;
LinkList * p = L->
next;
if(pos1||pos>
Length_List(L))
return false;
while(ipos&
&
L!=p) // 指向pos要求的结点
{
i++;
p = p->
next;
}
return p->
prior->
data;
}
关于“C语言循环双链表实现方法是什么”的内容就介绍到这,感谢各位的阅读,相信大家对C语言循环双链表实现方法是什么已经有了进一步的了解。大家如果还想学习更多知识,欢迎关注网络,小编将为大家输出更多高质量的实用文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: C语言循环双链表实现方法是什么
本文地址: https://pptw.com/jishu/654922.html
