/ ************************************************** **** ***********************************
此程序处理循环链表,并分别设置,插入,删除和释放链表的长度
并通过对操作员的限制以防止由于操作员的操作错误造成的不可想象的后果,此过程
强大的安全程序的详细信息如下:
*************************************************** ********************************** /
#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)//如果输入负数
{
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
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;
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)
{
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