c语言数据结构:用链表追加删除学生信息,我编写的追加学生信息程序,不知道哪里错了,希望大神指点
每个学生的成绩信息包括:学号、语文、数学、英语、总分、加权平均分;采用链表存储若干学生的成绩信息:可以在链表末尾追加新学生的成绩信息;可以根据学号,删除该学生的成绩信息。...
每个学生的成绩信息包括:学号、 语文、数学、英语、总分、加权平均分;采用链表存储若干学生的成绩信息:可以在链表末尾追加新学生的成 绩信息;可以根据学号,删除该学生的成绩信 息。
#include <stdio.h>
#include <stdlib.h>
typedef struct student_infor
{int studentID; float chinese;float math;float English;float sum;float P_avarage;struct student_infor *next;}student;
student*input(int n)
{
int i;student*p,*stu;
for(i=0,stu=NULL;i<n;i++)
{
p=(student*)malloc(sizeof(student));
printf("请输入第%d个学生:\n学生的学号:\n语文成绩:\n数学成绩:\n英语成绩:\n",i+1);
scanf("%d %f %f %f",&p->studentID,&p->chinese,&p->math,&p->English);
p->sum=(p->chinese)+(p->math)+(p->English);
p->P_avarage=(p->chinese)*0.3+(p->math)*0.5+(p->English)*0.2;
p->next=stu;
stu=p;}
return stu;}
void output(student*p)
{
printf("输出学生信息:\n");
printf("学生学号:%d",p->studentID);
printf("语文成绩:%.1f",p->chinese);
printf("数学成绩:%.1f",p->math);
printf("英语成绩:%.1f",p->English);
printf("总分:%.1f",p->sum);
printf("加权平均分:%.1f",p->P_avarage);
}
void visit(student* stu,void(*fun)())
{student *p;
for(p=stu;p!=NULL;p=p->next)
{(*fun)(p);}
}
void delect(student*p,int ID)
{printf("请输入需要删除的学生学号:\n");
scanf("%d",&ID);
student*t=NULL,*s=NULL;
s=p;
t=p->next;
while(t)
{
if((t->studentID)==ID)
{s->next=t->next;}
else{t=t->next;s=s->next;}}
}
int main()
{
int n,m,ID;student*p,*stu;
printf("请输入需要录入的学生人数:\n");
scanf("%d",&n);
stu=input(n);
delect(p,ID);
visit(stu,output);
return 0;
} 展开
#include <stdio.h>
#include <stdlib.h>
typedef struct student_infor
{int studentID; float chinese;float math;float English;float sum;float P_avarage;struct student_infor *next;}student;
student*input(int n)
{
int i;student*p,*stu;
for(i=0,stu=NULL;i<n;i++)
{
p=(student*)malloc(sizeof(student));
printf("请输入第%d个学生:\n学生的学号:\n语文成绩:\n数学成绩:\n英语成绩:\n",i+1);
scanf("%d %f %f %f",&p->studentID,&p->chinese,&p->math,&p->English);
p->sum=(p->chinese)+(p->math)+(p->English);
p->P_avarage=(p->chinese)*0.3+(p->math)*0.5+(p->English)*0.2;
p->next=stu;
stu=p;}
return stu;}
void output(student*p)
{
printf("输出学生信息:\n");
printf("学生学号:%d",p->studentID);
printf("语文成绩:%.1f",p->chinese);
printf("数学成绩:%.1f",p->math);
printf("英语成绩:%.1f",p->English);
printf("总分:%.1f",p->sum);
printf("加权平均分:%.1f",p->P_avarage);
}
void visit(student* stu,void(*fun)())
{student *p;
for(p=stu;p!=NULL;p=p->next)
{(*fun)(p);}
}
void delect(student*p,int ID)
{printf("请输入需要删除的学生学号:\n");
scanf("%d",&ID);
student*t=NULL,*s=NULL;
s=p;
t=p->next;
while(t)
{
if((t->studentID)==ID)
{s->next=t->next;}
else{t=t->next;s=s->next;}}
}
int main()
{
int n,m,ID;student*p,*stu;
printf("请输入需要录入的学生人数:\n");
scanf("%d",&n);
stu=input(n);
delect(p,ID);
visit(stu,output);
return 0;
} 展开
1个回答
展开全部
一、delect(p,ID); 这里p是NULL
二、void delect(student*p,int ID) 这里有可以会改变头结点,可是你的函数不能如实反应这种情况,变化后的链表头会找不到了,需要修改
程序已调试好,请验收
/**
.....
请输入第3个学生:
学生的学号:
语文成绩:
数学成绩:
英语成绩:
3
3
3
3
输出学生信息:
学生学号:3语文成绩:3.0数学成绩:3.0英语成绩:3.0总分:9.0加权平均分:3.0
输出学生信息:
学生学号:2语文成绩:2.0数学成绩:2.0英语成绩:2.0总分:6.0加权平均分:2.0
输出学生信息:
学生学号:1语文成绩:1.0数学成绩:1.0英语成绩:1.0总分:3.0加权平均分:1.0
请输入需要删除的学生学号:
3
输出学生信息:
学生学号:2语文成绩:2.0数学成绩:2.0英语成绩:2.0总分:6.0加权平均分:2.0
输出学生信息:
学生学号:1语文成绩:1.0数学成绩:1.0英语成绩:1.0总分:3.0加权平均分:1.0
请按任意键继续. . .
**/
追问
想问一下这里的student *temp=t; temp是什么
追答
要释放的结点。
链表中的结点在删除时,删除掉的结点要进行释放
所有明显的malloc\alloc等都要用明显的free去释放,不要指望系统自动处理。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询