以下c语言菜单(关于使用链表排序成绩)如何改动?

当我先进行case 1总分排序后,返回选择case 2单科排序时(或者先case 1再case 2)
为什么得不到单科排序的效果?(就好像排序函数时而可用时而不可用)

void main()
{
struct person *head,*head1;

int i,input=1;
printf(" Please input the date\n\n");
head=scan();
system("cls");
while(input==1)
{
printf(" Menu \n");
printf(" 1.计算总成绩并排名 \n");
printf("\n\n 2.单科成绩排名 \n\n");
printf("input decision:\n");
scanf("%d",&i);
system("cls");
switch(i)
{
case 1:print(sortsum(head));break;
case 2:print1(sortsubject(head));break;
default:;
}
printf(" 1.返回; \n");
printf(" 2.结束; \n");
printf("input decision:\n");
scanf("%d",&input);
system("cls");
}
}

struct person *sortsum(struct person *head)
{
struct person *p,*p1;
struct Date temp;
p=head;

while(p!=NULL)
{
p->Date.sum=0;
for(i=0;i<2;i++)
{
p->Date.sum+=p->Date.score[i];
}
p=p->next;
}

p=head;
while(p!=NULL)
{
p1=p->next;
while(p1!=NULL)
{
if(p->Date.sum<p1->Date.sum)temp=p->Date,p->Date=p1->Date,p1->Date=temp;
p1=p1->next;
}
p=p->next;
}

return (head);
}

你的代码不全,看不到具体链表构建。
从现有代码看:
1、建议结构指针初始化NULL(习惯)。struct person *head=NULL,*head1=NULL;
2、既然你定义了头指针head,正常习惯头指针是不存放数据的,只是next指向链表第一个节点。那么循环链表那里应该写while(p->next)而不是while(p!=NULL)。(除非你的head就是第一个节点)。
3、如像我上条所述,head是头指针,循环改成while(p->next),那么链表冒泡排序那里,p1=p->next;可以写p1=p->next->next;(当然你写p1=p->next;也不错,就是循环次数多点)
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-02-08
以上代码的问题是
temp=p->Date,p->Date=p1->Date,p1->Date=temp;这句
temp和Date都是结构体类型,结构体类型与数组类似,只能每个成员逐一复制,不能采取以上整体交换方法。追问

那为什么总分排序时使用这种方式又可以达到效果呢?

追答

你看一下你的运行结果,字符串name,就知道了,始终是原有顺序,没有任何交换。

追问

已解决了,问题在score[]我越界了,谢谢大神>o<

追答

好的

本回答被网友采纳
相似回答