题目
链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。
场景:一个年级,相当链表A
该年级5个班,每个班5个人,相当于链表B1–B5
做一个学生成绩管理系统
学生成绩有语文 数学 英语
功能: 录入成绩 找最三科总分的最高分 最低分 算出平均分
解题
我是定义两个结构体,相当于两个链表,学生信息和班级信息,打算在班级信息结构体中定义一个结构体指针指向学生信息。
参考代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//学生信息结构体
struct student
{
int data;
int chinese;
int math;
int english;
int sum;
float avg;
struct student *next;
};
//班级结构体
struct Class
{
int ClassNum;
struct student *messageHead;//定义一个结构体指针指向学生信息链表
struct Class *next;
};
//打印各个学生的相关信息
void printMessage(struct Class *head,int stunum,int Classnum)
{
int i;
int j;
int k=1;//用来计算第几个学生的
struct Class *p=head;
struct student *p2=NULL;
for(i=0;i<Classnum;i++){
p2=p->messageHead;//让p2指向class结构体里面指向学生信息的指针
for(j=0;j<stunum;j++){
printf("第%d班第%d个学生:学号 %d\n",p->ClassNum,k,p2->data);
printf("成绩:chinese:%d math:%d english:%d \n",p2->chinese,p2->math,p2->english);
printf("总分:%d 平均分:%f\n",p2->sum,p2->avg);
printf("---------------------------------\n");
k++;
p2=p2->next;
}
k=1;
p=p->next;
}
}
//使用头插法插入新的学生信息
struct student *insertStuMessage(struct student *head,struct student *newData2)
{
if(head == NULL){
head=newData2;
}else{
newData2->next=head;
head=newData2;
}
return head;
}
//录入学生的相关信息
struct student *stuMessage(struct student *head,int stunum,int Classnum)
{
int i;
int num=stunum;
int sum;
float avg;
struct student *newData;
for(i=0;i<stunum;i++){
newData=(struct student *)malloc(sizeof(struct student));
printf("请输入%d班第%d位学生学号\n",Classnum,num);
scanf("%d",&(newData->data));
printf("chinese:\n");
scanf("%d",&(newData->chinese));
printf("math:\n");
scanf("%d",&(newData->math));
printf("english:\n");
scanf("%d",&(newData->english));
sum=newData->chinese+newData->math+newData->english;
newData->sum=sum;
avg=(float)sum/3;
newData->avg=avg;
num--;
head=insertStuMessage(head,newData);//调用上面的头插法函数新建学生信息
}
return head;
}
//班级链表的操作
struct Class *ClassMessage(struct Class *head,int Classnum,int stunum)
{
int j;
int num=Classnum;
struct Class *p=head;
struct Class *newData=NULL;//用来新建信息的班级
struct student *stuHead;
for(j=0;j<Classnum;j++){
newData=(struct Class *)malloc(sizeof(struct Class));
newData->ClassNum=num;
stuHead=stuMessage(stuHead,stunum,num);
newData->messageHead=stuHead;
printf("#######################################\n");
num--;
if(p == NULL){
head = newData;
}else{
newData->next=head;
head=newData;
}
//newData=newData->next;
}
return head;
}
//找数学最高分的学生
void findMathMaxScore(struct Class *head,int Classnum,int stunum)
{
struct Class *pclass=head;
struct student *pstu;
int maxScore=0;
int stuHao;
int classHao;
int i;
int j;
for(i=0;i<Classnum;i++){
pstu=pclass->messageHead;
for(j=0;j<stunum;j++){
if(maxScore < pstu->math){
maxScore=pstu->math;
classHao=Classnum;
stuHao=pstu->data;
}
pstu=pstu->next;
}
pclass=pclass->next;
}
printf("-------------年级数学最高分--------------\n");
printf("数学最高分是: %d班 学号 %d 分数 %d分\n",classHao,stuHao,maxScore);
}
void findChineseMaxScore(struct Class *head,int Classnum,int stunum)
{
struct Class *pclass=head;
struct student *pstu;
int maxScore=0;
int stuHao;
int classHao;
int i;
int j;
for(i=0;i<Classnum;i++){
pstu=pclass->messageHead;
for(j=0;j<stunum;j++){
if(maxScore < pstu->chinese){
maxScore=pstu->chinese;
classHao=pclass->ClassNum;
stuHao=pstu->data;
}
pstu=pstu->next;
}
pclass=pclass->next;
}
printf("---------------年级语文最高分--------------\n");
printf("语文最高分是: %d班 学号 %d 分数 %d分\n",classHao,stuHao,maxScore);
}
void findEnglishMaxScore(struct Class *head,int Classnum,int stunum)
{
struct Class *pclass=head;
struct student *pstu;
int maxScore=0;
int stuHao;
int classHao;
int i;
int j;
for(i=0;i<Classnum;i++){
pstu=pclass->messageHead;
for(j=0;j<stunum;j++){
if(maxScore < pstu->english){
maxScore=pstu->english;
classHao=pclass->ClassNum;
stuHao=pstu->data;
}
pstu=pstu->next;
}
pclass=pclass->next;
}
printf("---------------年级英语最高分--------------\n");
printf("英语最高分是: %d班 学号 %d 分数 %d分\n",classHao,stuHao,maxScore);
}
void gradeAvg(struct Class *head,int Classnum,int stunum)
{
struct Class *pclass=head;
struct student *pstu;
int gradeSum=0;
int numOfStu;
float gradeAvg;
// float maxAvg;
int i;
int j;
for(i=0;i<Classnum;i++){
pstu=pclass->messageHead;
for(j=0;j<stunum;j++){
numOfStu++;
gradeSum+=pstu->sum;
pstu=pstu->next;
}
pclass=pclass->next;
}
gradeAvg=(float)gradeSum/numOfStu;
printf("---------------年级平均分--------------\n");
printf("年级平均分是%f\n",gradeAvg);
}
int main()
{
int a;
int b;
struct Class *head;
printf("请输入班级数量:\n");
scanf("%d",&a);
printf("请输入班级人数量:\n");
scanf("%d",&b);
head=ClassMessage(head,a,b);
printMessage(head,b,a);
findMathMaxScore(head,a,b);
findChineseMaxScore(head,a,b);
findEnglishMaxScore(head,a,b);
gradeAvg(head,a,b);
return 0;
}
运行结果
总结
在这期间遇到了一个很大问题我至今没有解决,希望有缘人看到帮我解答一下。我尝试在学生结构体体面添加 char *name,用来曾加学生的名字信息,可是遍历结果体的时候就出现段错误。
学生结构体的地方
录入的地方
遍历的地方
希望有大佬给我指点迷津!
感谢大佬指点了一下,加了名字的代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//学生信息结构体
struct student
{
int data;
char name[10];
int chinese;
int math;
int english;
int sum;
float avg;
struct student *next;
};
//班级结构体
struct Class
{
int ClassNum;
struct student *messageHead;//定义一个结构体指针指向学生信息链表
struct Class *next;
};
//打印各个学生的相关信息
void printMessage(struct Class *head,int stunum,int Classnum)
{
int i;
int j;
int k=1;//用来计算第几个学生的
struct Class *p=head;
struct student *p2=NULL;
for(i=0;i<Classnum;i++){
p2=p->messageHead;//让p2指向class结构体里面指向学生信息的指针
for(j=0;j<stunum;j++){
printf("第%d班第%d个学生:学号 %d 姓名:%s\n",p->ClassNum,k,p2->data,p2->name);
printf("成绩:chinese:%d math:%d english:%d \n",p2->chinese,p2->math,p2->english);
printf("总分:%d 平均分:%f\n",p2->sum,p2->avg);
printf("---------------------------------\n");
k++;
p2=p2->next;
}
k=1;
p=p->next;
}
}
//使用头插法插入新的学生信息
struct student *insertStuMessage(struct student *head,struct student *newData2)
{
if(head == NULL){
head=newData2;
}else{
newData2->next=head;
head=newData2;
}
return head;
}
//录入学生的相关信息
struct student *stuMessage(struct student *head,int stunum,int Classnum)
{
int i;
int num=stunum;
int sum;
float avg;
struct student *newData;
for(i=0;i<stunum;i++){
newData=(struct student *)malloc(sizeof(struct student));
printf("请输入%d班第%d位学生学号\n",Classnum,num);
scanf("%d",&(newData->data));
printf("请输入姓名:\n");
scanf("%s",newData->name);
printf("chinese:\n");
scanf("%d",&(newData->chinese));
printf("math:\n");
scanf("%d",&(newData->math));
printf("english:\n");
scanf("%d",&(newData->english));
sum=newData->chinese+newData->math+newData->english;
newData->sum=sum;
avg=(float)sum/3;
newData->avg=avg;
num--;
head=insertStuMessage(head,newData);//调用上面的头插法函数新建学生信息
}
return head;
}
//班级链表的操作
struct Class *ClassMessage(struct Class *head,int Classnum,int stunum)
{
int j;
int num=Classnum;
struct Class *p=head;
struct Class *newData=NULL;//用来新建信息的班级
struct student *stuHead;
for(j=0;j<Classnum;j++){
newData=(struct Class *)malloc(sizeof(struct Class));
newData->ClassNum=num;
stuHead=stuMessage(stuHead,stunum,num);
newData->messageHead=stuHead;
printf("#######################################\n");
num--;
if(p == NULL){
head = newData;
}else{
newData->next=head;
head=newData;
}
//newData=newData->next;
}
return head;
}
//找数学最高分的学生
void findMathMaxScore(struct Class *head,int Classnum,int stunum)
{
struct Class *pclass=head;
struct student *pstu;
int maxScore=0;
int stuHao;
int classHao;
int i;
int j;
char *name;
name = (char *)malloc(10);
for(i=0;i<Classnum;i++){
pstu=pclass->messageHead;
for(j=0;j<stunum;j++){
memset(name,0,10);
if(maxScore < pstu->math){
maxScore=pstu->math;
classHao=Classnum;
stuHao=pstu->data;
name=pstu->name;
}
pstu=pstu->next;
}
pclass=pclass->next;
}
printf("-------------年级数学最高分--------------\n");
printf("数学最高分是: %d班 学号 %d 姓名 %s 分数 %d分\n",classHao,stuHao,name,maxScore);
}
void findChineseMaxScore(struct Class *head,int Classnum,int stunum)
{
struct Class *pclass=head;
struct student *pstu;
int maxScore=0;
int stuHao;
int classHao;
int i;
int j;
char *name;
name = (char *)malloc(10);
for(i=0;i<Classnum;i++){
pstu=pclass->messageHead;
for(j=0;j<stunum;j++){
memset(name,0,10);
if(maxScore < pstu->chinese){
maxScore=pstu->chinese;
classHao=pclass->ClassNum;
stuHao=pstu->data;
name=pstu->name;
}
pstu=pstu->next;
}
pclass=pclass->next;
}
printf("---------------年级语文最高分--------------\n");
printf("语文最高分是: %d班 学号 %d 姓名 %s 分数 %d分\n",classHao,stuHao,name,maxScore);
}
void findEnglishMaxScore(struct Class *head,int Classnum,int stunum)
{
struct Class *pclass=head;
struct student *pstu;
int maxScore=0;
int stuHao;
int classHao;
int i;
int j;
char *name;
name = (char *)malloc(10);
for(i=0;i<Classnum;i++){
pstu=pclass->messageHead;
for(j=0;j<stunum;j++){
memset(name,0,10);
if(maxScore < pstu->english){
maxScore=pstu->english;
classHao=pclass->ClassNum;
stuHao=pstu->data;
name=pstu->name;
}
pstu=pstu->next;
}
pclass=pclass->next;
}
printf("---------------年级英语最高分--------------\n");
printf("英语最高分是: %d班 学号 %d 姓名 %s 分数 %d分\n",classHao,stuHao,name,maxScore);
}
void gradeAvg(struct Class *head,int Classnum,int stunum)
{
struct Class *pclass=head;
struct student *pstu;
int gradeSum=0;
int numOfStu;
float gradeAvg;
// float maxAvg;
int i;
int j;
for(i=0;i<Classnum;i++){
pstu=pclass->messageHead;
for(j=0;j<stunum;j++){
numOfStu++;
gradeSum+=pstu->sum;
pstu=pstu->next;
}
pclass=pclass->next;
}
gradeAvg=(float)gradeSum/numOfStu;
printf("---------------年级平均分--------------\n");
printf("年级平均分是%f\n",gradeAvg);
}
int main()
{
int a;
int b;
struct Class *head;
printf("请输入班级数量:\n");
scanf("%d",&a);
printf("请输入班级人数量:\n");
scanf("%d",&b);
head=ClassMessage(head,a,b);
printMessage(head,b,a);
findMathMaxScore(head,a,b);
findChineseMaxScore(head,a,b);
findEnglishMaxScore(head,a,b);
gradeAvg(head,a,b);
return 0;
}