这是一个删除结点并输出的程序,总共有三个链表
错误为:当删除最后一个链表也就是3时程序发生错误,停止运行。
求大家帮忙解解决!
#include <stdio.h>
#define NUll 0
#include <stdlib.h>
struct stu
{
char name[6];
int xuehao;
int grade;
struct stu *next;
};
typedef struct stu STU;
main()
{
STU *p,*p_start,*p2,*p_print,*p_charu,*p_charu2;
int i,xuehao;
//输入
for (i=0;i<3;i++)
{
p=(STU *)malloc(sizeof(STU));
printf("请输入学生姓名:\n");
scanf("%s",&p->name);
printf("请输入学生的学号:\n");
scanf("%d",&p->xuehao);
printf("请输入学生的成绩:\n");
scanf("%d",&p->grade);
if (i==0)
p2=p_start=p;
else
{
p2->next=p;
p2=p;
if (i==2)
p->next=NULL;
}
}
//链表的删除
p_charu=p_start;
printf("请输入要删除的学号\n");
scanf("%d",&xuehao);
while (1)
{
p_charu2=p_charu->next;
if (p_charu->next->xuehao==xuehao)
{
p_charu->next=p_charu->next->next;
free(p_charu2);
break;
}
if (p_charu->xuehao==xuehao)
{
p_start=p_charu->next;
free(p_charu);
break;
}
p_charu=p->next;
}
}
你的问题在p_charu = p->next;这一句,p是你用来接收输入的,在你删除的部分没有任何关系,改成p_charu = p_charu->next;就可以了。
另外你的还有一个问题,就是如果删除了第一个后,你没有更新p_start,这会导致你在最后输出的时候,第一个是错误的。不信你可以试一下。
我重写了删除部分
4.设置当前节点为当前节点的下一个节点,进入下一个循环
最后的输出部分也用while而没有固定节点个数,免得万一输入前面输入的不是3个,还需要更改这里的代码。下面的是完整代码
#include <stdio.h>
#define NUll 0
#include <stdlib.h>
struct stu
{
char name[6];
int xuehao;
int grade;
struct stu *next;
};
typedef struct stu STU;
main()
{
STU *p, *p_start, *p2, *p_print, *p_charu, *p_charu2;
int i, xuehao;
//输入
for (i = 0; i < 3; i++)
{
p = (STU *)malloc(sizeof(STU));
printf("请输入学生姓名:\n");
scanf("%s", &p->name);
printf("请输入学生的学号:\n");
scanf("%d", &p->xuehao);
printf("请输入学生的成绩:\n");
scanf("%d", &p->grade);
if (i == 0)
p2 = p_start = p;
else
{
p2->next = p;
p2 = p;
if (i == 2)
p->next = NULL;
}
}
//printf("%d", p_start->next->next->next);
//printf("%d", p_start->next->next->xuehao);
//链表的插入
p_charu = p_start;
printf("请输入要删除的学号\n");
scanf("%d", &xuehao);
p_charu2 = NULL;
while(p_charu)
{
if (p_charu->xuehao == xuehao)
{
if (p_charu2 != NULL) p_charu2->next = p_charu->next;
else p_start = p_charu->next;
free(p_charu);
break;
}
p_charu2 = p_charu;
p_charu = p_charu->next;
}
//输出
p_print = p_start;
while(p_print)
{
printf("学生姓名为:%s\n", p_print->name);
printf("学生的学号为:%d\n", p_print->xuehao);
printf("学生的分数为:%d\n",p_print->grade);
p_print = p_print->next;
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。