输出时会中断,注释掉之后没有输出了;最后找到应该是链表排序的问题,但没找到哪里错了,求大佬解惑
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*定义单向链表类型StuLink,链表结点包含xh、xm、cj、dj、mc、nxet六个数据项
分别代表学生的学号、姓名、成绩、等级、名次和指向下一个结点的指针,
其中:学号、姓名、成绩是输入项,等级、名次是计算项*/
struct StuLink*Creat_Link(); //创建链表
struct StuLink*Rank_Link(struct StuLink*list); //计算名次
void display(struct StuLink *p); //输出一个节电的内容
struct StuLink*Sort_Link(struct StuLink *list,int n);//链表排序
struct StuLink*Output_Link(struct StuLink*list,int n);//链表按顺序输出
void menu1();
void menu2();
int main()
{
struct StuLink*list;
menu1();
list=Creat_Link ();
//display(list);Output_Link(list,0);
Rank_Link(list);
//Output_Link(list,1);
display(list);Output_Link(list,0);
printf("嘤嘤嘤");
return 0;
}
struct StuLink
{
int xh;
char xm[20];
int cj;
char dj;
int mc;
struct StuLink*next;
};
/* Creat_Link函数(10分):建立一个StuLink类型的学生链表,返回链表头指针
每个链表结点代表一个学生信息,要求输入学号、姓名和成绩
其中:学号从1开始按递增1自动生成,成绩必须在[0,100]区间的整数,当输入成绩为-1时,表示输入结束*/
struct StuLink*Creat_Link()
{
struct StuLink*list=0,*p1=0,*p2;int i=0;
int score;char name[20];
//list->xh =0;p2=list;
printf("\n输入成绩为-1,结束输入!\n");
printf("请输入学生姓名");
scanf("%s",name);
printf("请输入学生成绩");
scanf("%d",&score );
while(score!=-1)
{
if(score<0||score>100)
{
printf("输入成绩格式错误,请重新输入正确的学生成绩\n");
scanf("%d",&score );
continue ;
}
if( (p1=(struct StuLink*)malloc(sizeof(struct StuLink))) ==0)
{
printf("动态内存空间分配失败\n");
exit(0);
}
else
{
switch(score/10)
{
case 9:p1->dj='A';break; //计算等级
case 8:p1->dj='B';break;
case 7:p1->dj='C';break;
case 6:p1->dj='D';break;
default:p1->dj='E';
}
i++;
p1->xh =i;
p1->cj =score;
strcpy(p1->xm,name);
if(list==0)
list=p1;
else
p2->next=p1;
p2=p1;
printf("请输入学生姓名 ");
scanf("%s",name);
printf("请输入学生成绩 ");
scanf("%d",&score);
}
}
return list;
}
/*设计Rank_Link函数(10分):计算学生链表中每个学生的名次
名次规则:按成绩降序排名,从第1名开始依次排名,若出现并列名次,则名次需要叠加
例如,若出现5个并列第1名,则没有第2名,下一个名次是第6名,依此类推。*/
struct StuLink *Rank_Link(struct StuLink*list)
{
struct StuLink *p1,*p2;
p1=list;p2=list;;
while(p1)
{
while(p2)
{
p1->mc=1;
if(p1->cj<p2->cj) //算法:每一个节点的成绩都依次和list开始所有节点比较一遍
(p1->mc)++; //若有一个节点成绩更高,则名次变大1,成绩相同则不变;
p2=p1->next;
}
p1=p1->next;
}
return list;
}
/*设计Sort_Link函数(10分):按指定数据项的顺序【学号(升序),或者,成绩(降序)】对学生链表进行排序*/
struct StuLink*Sort_Link(struct StuLink *list,int n)
{
if(n=0) //若链表排序后改变了原学号排序方式和list,则其他函数诸多不变
{} //故此处可新建一个链表,按名次进行排序;返回新链表地址 (*****未完成*******)
//此处为判定排序方式;
}
/*设计Output_Link函数(10分):按指定数据项的顺序【学号(升序),或者,成绩(降序)】输出学生成绩表、各等级人数。
学生成绩表每行输出一个学生信息(依次为学号、姓名、成绩、等级和名次,各项间以1个空格隔开),各等级人数分行输出*/
void display(struct StuLink *p)
{
printf("学号 %d",p->xh);
printf("姓名 %s",p->xm);
printf("成绩 %d",p->cj);
printf("等级 %c",p->dj);
if(p->mc>1)
printf("名次 %d\n",p->mc);
else
printf("kong");
if(p->mc)
printf("名次 %d\n",p->mc);
else
printf("kong");
}
struct StuLink*Output_Link(struct StuLink *list,int n)
{
struct StuLink *Rank_Link(list);
int i=1,j=0;struct StuLink*p=NULL;p=list;
if(n==1) //如果按成绩名次输出
{
for(i=1;;i++)
{ if(p)
{
if(p->mc ==i)
{
j++;
display(p);
}
p=p->next;
} //算法:由i循环控制,从头结点到尾先找到第i名并输出;(ok)
else
if(j)
continue; //若上面判定是while(p),则p为空小循环停止后是否跳出第i词for循环进行下一次;
else
break; //遍历链表后若无对应名次则所有名次学生均已输出,跳出i的for循环
}
}
else
{
while(p)
{
display(p);
p=p->next;
}
}
return list;
}
void menu1 ()
{
printf("===============================================\n");
printf("|| 1--创建链表 2--链表维护 ||\n");
printf("|| 3--计算排序 4--统计分析 ||\n");
printf("|| 5--报表输出 0--退出 ||\n");
printf("===============================================\n");
printf(" 请输入菜单编号(0,1-5): ");
}