c语言最简单循环链表,C语言循环链表的简单应用

本文介绍了一个处理循环链表的C程序,实现了在链表中插入、删除节点的功能,并通过检查输入限制来防止操作错误。程序确保了安全性的细节,包括检查节点位置的有效性及输入的正数验证。此外,还提供了释放链表内存和打印链表内容的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

608a2a6e23790f7fb3cc25d73cb6f324.png

/ ************************************************** **** ***********************************

此程序处理循环链表,并分别设置,插入,删除和释放链表的长度

并通过对操作员的限制以防止由于操作员的操作错误造成的不可想象的后果,此过程

强大的安全程序的详细信息如下:

*************************************************** ********************************** /

#include

#include

typedef struct stu //定义TYM结构类型

{

字符名称[20];

int得分;

struct stu * llink,* rlink; // llink是左链域指针,rlink是右链域指针

} TYM;

TYM * Insert(TYM * head)//插入节点函数

{

int i;

int pos,len;

TYM * a,* s,* p,* q;

printf(“ ***********插入************* \ n”);

if(head-> llink!= NULL)//如果链接列表存在

{

for(p = head-> rlink,i = 2; p!= head; p = p-> rlink,i ++); //检测链接列表的长度

printf(“位置(不超过%d): ”,i); //提示输入的值的范围

scanf(“%d”,&pos); //输入插入位置

while(pos <0 || pos> i)//如果输入负数

{

printf(“请输入正确的信息!\ n位置(不超过%d): ”,i);

scanf(“%d”,&pos); //输入插入位置

}

}

printf(“长度: \ t \ t \ t”);

scanf(“%d”,&len); //输入插入的节点数

while(len <0)//如果输入负数

{

3a733681699x2747479298b27.jpg

printf(“请输入正确的密码!\ n长度: \ t \ t \ t”);

scanf(“%d”,&len); //输入插入的节点数

}

如果(len == 0)返回头; //如果插入的节点数为0,则返回head

printf(“名称: \ tScore: \ n”);

a =(TYM *)calloc(1,sizeof(TYM)); //打开一个空格链表循环链表,并将该空格的首地址指定给

scanf(“%s%d”,a->名称,&a->得分); //分配给

for(p = a,i = 1; i {

q =(TYM *)malloc(sizeof(TYM)); //打开一个新空间

scanf(“%s%d”,q->名称,&q->分数); //将值分配到新空间

p-> rlink = q; //使p的右链接域的指针指向q

q-> llink = p; //使q的左链域指针指向p

p = q; //将p指向q

}

a-> llink = p; //使新链接列表的左链接域指针指向最后一个地址

p-> rlink = a; //使链接列表的最后一个变量的正确链接字段指针指向新链接列表的第一个地址

if(head-> llink == NULL)返回a; //如果链接列表存在,则返回a作为第一个地址

for(s = head,i = 1; i {

s = s-> rlink; //指向右边的下一个节点

}

q = s-> llink; //将s的左链域指针的值保存到q

p-> rlink = s; //使链接列表的最后一个变量的正确链接字段指针指向S

s-> llink = p; //使s的左侧链接域指针指向新链接列表的最后一个地址

a-> llink = q; //使新链接列表的第一个地址的左链接域指针指向q

q-> rlink = a; //使原始链表的断开节点的正确链接域指针指向新链表的第一个地址

return pos == 1?a: head; //如果插入的位置是第一个,则返回a作为第一个地址

}

TYM * DeleteNode(TYM * head)//删除节点功能

{

int pos,len,i;

TYM * s,* Llink,* Rlink;

if(head-> llink == NULL)返回头; //如果链接列表不存在,则返回head

9ad36369facd114cd7e7c100ab563b50.png

for(s = head-> rlink,i = 1; s!= head; s = s-> rlink,i ++); //检测链接列表的长度

printf(“ ***********删除************* \ n位置(不超过%d): \ t”,i);

scanf(“%d”,&pos); //输入要删除的节点的位置

while(pos <0 || pos> i)//如果输入负数

{

printf(“请输入正确的!\ n位置(不超过%d): \ t”,i);

scanf(“%d”,&pos); //输入要删除的节点的位置

}

printf(“长度(不超过%d): \ t \ t”,i);

scanf(“%d”,&len); //输入删除次数

while(len <0 || len> i-pos + 1)//如果输入负数

{

printf(“请输入正确的!\ n长度(不超过%d): \ t \ t”,i);

scanf(“%d”,&len); //输入删除次数

}

if(len == 0 || i == 1)返回头; //如果您不删除或仅删除一个节点,请返回head

for(s = head,i = 1; i {

s = s-> rlink;

}

for(i = 0; i {

Llink = s-> llink; //将删除点的左链接域指针保存到Llink

Rlink = s-> rlink; //将删除点的右链接域指针保存到Rlink

Rlink-> llink = Llink; //将删除点的右侧连接到左侧

Llink-> rlink = Rlink; //将删除点的左侧连接到右侧

免费; //释放删除点

s = Rlink; //指向右边的下一个

}

return pos == 1?s: head; //如果插入了第一个地址,则以S作为第一个地址

}

void Release(TYM * head)//发布功能

{

TYM * p,* q;

120355604.png

p = head-> rlink; //使p指向第一个地址右边的第一个地址

for(q = head; p!= q; head = p)//释放链接列表

{

p = head-> rlink; // p指向右侧的下一个地址

免费(头); //释放当前地址

}

if(head == q)//如果所有节点都已释放

printf(“ ********免费成功!********* \ n”);

}

void Print(TYM * head)//输出函数

{

TYM * p;

printf(“ ***********输出: ************ \ nName \ tscore \ n”);

for(printf(“%s \ t%d \ n”,head-> name,head-> score),p = head-> rlink; p!= head; p = p-> rlink)

{//输出整个链表

printf(“%s \ t%d \ n”,p->名称链表循环链表,p->得分); //输出当前节点数据

}

}

int main()

{

TYM * head,* p,* q;

int len,i;

printf(“ ************输入: ************ \ n”);

printf(“长度: \ t”);

scanf(“%d”,&len); //输入长度

while(len <0)//如果输入负数

{

printf(“请输入正确的字符!\ n”);

printf(“长度: \ t”);

scanf(“%d”,&len);

}

head =(TYM *)calloc(1,sizeof(TYM)); //打开一个空格并使其指向

if(len == 0)

{

9b1bc7e0bfc0959d6f496d21d20b131e.png

head-> llink = head-> rlink = NULL; //如果长度为0,则head的左右链域指针为空

}

其他

{

printf(“名称: \ tScore: \ n”);

scanf(“%s%d”,head-> name,&head-> score); //将值分配给头部

如果(len == 1)

head-> llink = head-> rlink = head; //如果长度为1,则使head的左右链域指针指向自身

其他

{

for(p = head,i = 1; i {

q =(TYM *)malloc(sizeof(TYM)); //打开新空间

scanf(“%s%d”,q->名称,&q->分数); //将值分配到新空间

p-> rlink = q; //使p的右链指针指向新空间

q-> llink = p; //使新空间的左链域指针指向p

p = q; //将p指向q

}

p-> rlink = head; //使最后一个地址点的正确链接域指针指向第一个地址

head-> llink = p; //使第一个地址的左链接域指针指向尾地址

}

}

if(head-> llink!= NULL)打印(头); //如果链接列表存在则输出

head =(TYM *)插入(head); //插入节点

if(head-> llink!= NULL)打印(头); //如果链接列表存在则输出

head =(TYM *)DeleteNode(head); //删除节点并返回第一个地址

if(head-> llink!= NULL)//如果链接列表存在

{

打印(头); //输出链接列表

发布(头); //释放链接列表

}

其他(头); //释放头

返回0;

}

/ *******************************************调试窗口***** ************************************************ /

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-270566-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值