实现双链表嵌套的简单学生信息管理

题目
链表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;
}
  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值