问题遇到的现象和发生背景
输入如下十个学生的成绩数据,每个学生信息包括 学号 、姓名 、考试成绩 ,实验成绩。同时计算每个学生的总评成绩( =考试成绩60% + 实验成绩40%)并保存至每个结构体的totalmark。输入格式如下:
71250 李霞 95 82
69753 李友友 88 86
12254 东方亮 87 88
61256 张男 73 85
30258 孙杰 25 88
11260 柯以乐 82 76
33262 谢涛 91 85
29263 叶林 80 75
22483 陈翔 80 76
71525 王子 71 88
编写函数实现建立链表:struct student * create( int n), n是学生人数。函数中输入n个学生的信息,同时计算总评成绩,按照总评成绩从高到低的方式形成有序链表。返回链表头指针。
问题相关代码,请勿粘贴截图
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define len sizeof(stu)
typedef struct student
{
float stunum;
char name[20];
float examscore;
float labscore;
float totalmark;
struct student * next;
} stu ;
//定义全局变量.m,t,s[20]用于交换变量
int i=0;
float t=0,m=0;
char s[20];
stu *p;
stu *create(int n)//n是学生人数
{
stu *head,*p1,*p2;
printf("依次输入学生 学号 姓名 考试成绩 实验成绩\n");
for(i=0;i<n;i++)//建立链表
{
p1=malloc(len);
if(i=0)
{
head=p2=p1;//开始head p1 p2都指向新节点
scanf("%f %s %f %f",&p1->stunum,&p1->name,&p1->examscore,&p1->labscore);
p1->next=NULL;
}
else
{
p2->next=p1;
p2=p1;//先将末尾节点指向新节点,在将p2指向新节点
scanf("%f %s %f %f",&p1->stunum,&p1->name,&p1->examscore,&p1->labscore);
p1->next=NULL;
}
}
for(i=0;i<n;i++)//计算学生总评成绩
{
p->totalmark=0.6*p->examscore+0.4*p->labscore;
}
for(i=0;i<n;i++)//按成绩对学生进行排序
{
for(p=head,p=p->next,p1=head;p1;p=p->next,p1=p1->next)
{
if(p1->totalmark<p->totalmark)
{
m=p->totalmark;p->totalmark=p1->totalmark;p1->totalmark=m;
t=p->stunum;p->stunum=p1->stunum;p1->stunum=t;
m=p->examscore;p->examscore=p1->examscore;p1->examscore=m;
m=p->labscore;p->labscore=p1->labscore;p1->labscore=m;
strcpy(s,p->name);strcpy(p->name,p1->name);strcpy(p1->name,s);//用到#include<string.h>
}
}
}
return head; //返回头指针
}
int main()
{
int n;
printf("输入学生人数:\n");
scanf("%d",&n);//输入学生人数
p=create(n); //p 赋值链表头指针
for(i=0;i<n;i++)
{
printf("stunum:%f name:%s examscore:%f labscore:%f totalmark:%f\n",p->stunum,p->name,p->examscore,p->labscore,p->totalmark);
}
return 0;
}
运行结果及报错内容
编译无错误 但不能正常运行:
输入学生人数:
10
依次输入学生 学号 姓名 考试成绩 实验成绩
Process exited after 3.497 seconds with return value 3221225477
请按任意键继续