学生成绩管理系统,通过两个链表,分别代表学生和班级的链表
班级的链表作为学生链表的头
可以输入成绩,学生成绩有数学,语文,和英语,找出学生成绩总分的最高分和最低分,并求出平均成绩
首先定义两个结构体,一个表示班级的结构体,一个表示为学生的结构体
//学生结构体
typedef struct Student
{
int xueHao;
int yuWen;
int shuXue;
int yingYu;
int zongFen;
float average;
struct Student *next;
}STU,*PSTU;
//班级结构体
typedef struct Class
{
int banJiZongShu;
int xueShengShu;
struct Student *stu;//指向学生结构体
struct Class *next;
}CLA,*PCLA;
在班级结构体定义一个指针,指向学生结构体,这样就可以通过班级结构体进行学生的信息输入,改变
int panDuanFenShu(int fenShu)//判断输入成绩是否输入错误
{
while(1){
if(fenShu<0 || fenShu>150){
printf("输入错误,请重新输入\n");
scanf("%d",&fenShu);
}else{
return fenShu;
}
}
}
PSTU chuangJianStudent(PSTU stuHead,int banJiShu,int i)
{
PSTU p=NULL;
PSTU newNode;
//初始化学生结构体的内容
newNode=(PSTU)malloc(sizeof(STU));
newNode->next=NULL;
newNode->xueHao=i;
printf("请输入%d班学号%d的学生信息:\n",banJiShu,i);
printf("请输入学号%d学生的语文成绩\n",i);
scanf("%d",&newNode->yuWen);
newNode->yuWen=panDuanFenShu(newNode->yuWen);
printf("请输入学号%d学生的数学成绩\n",i);
scanf("%d",&newNode->shuXue);
newNode->shuXue=panDuanFenShu(newNode->shuXue);
printf("请输入学号%d学生的英语成绩\n",i);
scanf("%d",&newNode->yingYu);
newNode->yingYu=panDuanFenShu(newNode->yingYu);
newNode->zongFen=(newNode->yuWen)+(newNode->shuXue)+(newNode->yingYu);
newNode->average=(float)newNode->zongFen/3;
//使用尾插法创建新的学生节点
if(stuHead==NULL){
stuHead=newNode;
return stuHead;
}else{
p=stuHead;
while(p->next!=NULL){
p=p->next;
}
p->next=newNode;
return stuHead;
}
}
PSTU inItStudentNode(int banJiShu,int renShu)
{
int i;
PSTU stuHead=NULL;
for(i=1;i<=renShu;i++){
stuHead=chuangJianStudent(stuHead,banJiShu,i);
}
return stuHead;
}
第一个函数去判断学生的成绩是否输入错误,如果输入错误就重新输入,直到输入正确为止
第二个函数是录入学生的信息,并通过尾插法的方式把一个班的学生连起来,数学,语文,英语的成绩,
第三个函数是生成几个学生,把学生通过第二个函数用尾插法连接起来。
PCLA chuangJianClass(PCLA claHead,int banJiShu,int banJiZongShu)
{
PCLA p1;
PCLA newNode1;
int renShu;//定义一个人的个数的变量
printf("请输入%d班学生的人数:",banJiShu);
scanf("%d",&renShu);
//初始化班级结构体的内容
newNode1=(PCLA)malloc(sizeof(CLA));
newNode1->next=NULL;
newNode1->xueShengShu=renShu;
newNode1->stu=inItStudentNode(banJiShu,renShu);
newNode1->banJiZongShu=banJiZongShu;
//使用尾插法创建班级
if(claHead==NULL){
claHead=newNode1;
return claHead;
}else{
p1=claHead;
while(p1->next!=NULL){
p1=p1->next;
}
p1->next=newNode1;
return claHead;
}
}
PCLA inItClassNode()
{
int i;
int banJiZongShu;
printf("请输入班级的数量:");
scanf("%d",&banJiZongShu);
PCLA claHead=NULL;
for(i=1;i<=banJiZongShu;i++){
claHead=chuangJianClass(claHead,i,banJiZongShu);//把当前班级数和班级的总数传过去
}
return claHead;
}
创建班级结构体,通过套娃的方式把这些东西套起来,在对班级结构体进行初始化的时候,使用创建学生的函数
newNode1->stu=inItStudentNode(banJiShu,renShu);
把班和学生联系起来。
打印函数和主函数
void xianShi1(PCLA claHead)
{
PSTU p1=NULL;
PCLA p2=NULL;
p2=claHead;
int i=0;
float average1=0;
int zongJi=0;
PSTU max=NULL;
PSTU min=NULL;
int banJiMax=1;
int banJiMin=1;
int xueShengZongShu=0;
max=p2->stu;//给最高分的学生结构体赋初值
min=max;
while(p2!=NULL){
p1=p2->stu;
++i;
xueShengZongShu+=p2->xueShengShu;
while(p1!=NULL){
printf("%d班第%d位同学成绩:",i,p1->xueHao);
printf("语文%d 数学%d 英语%d 总分%d 平均分%f\n",p1->yuWen,p1->shuXue,p1->yingYu,p1->zongFen,p1->average);
if(max->zongFen < p1->zongFen){
max=p1;
banJiMax=i;
}
if(min->zongFen > p1->zongFen){
min=p1;
banJiMin=i;
}
zongJi+=p1->zongFen;//对全年级的总分进行取总
p1=p1->next;
}
p2=p2->next;
average1=(float)zongJi/xueShengZongShu;//算出全年级学生的平均总成绩
}
printf("最高分%d,是%d班学号%d的学生\n",max->zongFen,banJiMax,max->xueHao);
printf("最低分%d,是%d班学号%d的学生\n",min->zongFen,banJiMin,min->xueHao);
printf("全年级的平均总分是%f\n",average1);
}
int main()
{
PCLA claHead=NULL;
claHead=inItClassNode();
xianShi1(claHead);
system("pause");
return 0;
}
同时还可以去创建学校的结构体,进行操作