c语言链表根据学生学号删除学生信息的函数,这是我编写的错误的order_ID删除函数。求指点怎么编写正确的



#include#includetypedef struct student_infor{int studentID;float chinese;float English;float math;float P_avarage;float sum; struct student_infor*next;}student;
student*input(int n)
{int i;student*p,*stu=NULL;
for(i=0;istudentID,&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;}
student*output(student*p)
{ printf("学生学号:%d",p->studentID);
printf("语文成绩:%.1f",p->chinese);
printf("数学成绩:%.1f",p->math);
printf("英语成绩:%.1f",p->English);
printf("总分:%.1f",p->sum);
printf("加权平均分:%.1f\n",p->P_avarage);
}
void visit(student*stu,void(*fun)())
{ student*p;
for(p=stu;p!=NULL;p=p->next)
{(*fun)(p);}}
student*order_ID(student*p)
{ student*t,*s=NULL;
for(t=p;t!=NULL;t=t->next)
{
while((t->studentID)>(t->next->studentID))
{ s=t;
t=t->next;
t->next=s;}}
return p;}
int main()
{student*stu;
int n;
printf("请输入需要录入的学生人数(>0):\n");
scanf("%d",&n);
stu=input(n);
stu=order_ID(stu);
visit(stu,output);
return 0;
}

你好歹提供完整的代码啊,我还要给你补全,累死人啊
给你修改好了排序这部分,自己好好理解一下吧
student *order_ID(student*p)
{
student *t,*s, *tmp1,*tmp2 , tmp3;
for(t=p;t!=NULL;t=t->next)
{
for(s=t->next;s!=NULL;s=s->next)
{
if ( (t->studentID) > (s->studentID) )
{
//交换 采用结构体赋值的方式,不进行链表的拆接。
tmp1=t->next; 保存原t的后继
tmp2=s->next; 保存原s的后继
tmp3=*t ; 交换两个结构的数据,指针不交换
*t=*s ;
*s=tmp3 ;
t->next=tmp1; 恢复后继,保持原链表结构
s->next=tmp2;
}
}
}
return p;
}
如果有兴趣你可以自己研究一下拆链的方法, 这需要考虑的内容较多,一头结点发生变化怎么办?二拆链时,要记住前趋结点,相对来说较为复杂。
还有一种方法:采用带头结点的链表,每次取出最小的,拆出来,建立新表!这个相对容易一些来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-15
#include#include 这里故意遗漏了什么?追问

哦这是我复制粘贴的时候漏了#include
#include

相似回答