题目:链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。场景:一个年级,相当链表A该年级5个班,每个班5个人,相当于链表B1–B5做一个学生成绩管理系统学生成绩有语文 数学 英语

#include <stdio.h>
#include <stdlib.h>

//该成绩管理系统由双链表嵌套完成,可完成m个班级,每个班级n个学生的成绩管理,输出学生信息,输出最高分、最低分、平均分,m、n由输入获取
struct Class    //班级结构体
{
    char *Class;
    struct Class *next;
    struct Student *Stuhead;
};

struct Student  //学生结构体
{
    char *name;
    int Chinese;
    int Math;
    int English;
    int Sum;
    struct Student *next;
};

struct Class *Chead = NULL;     //定义全局变量,避免太多传参而出错
struct Student *Shead = NULL;


void printStudentMes()      //输出学生信息
{
    struct Class *p1;
    p1 = Chead;
    struct Student *p2 = NULL;
    while(p1!=NULL){        //嵌套
        p2 = p1->Stuhead;
        while(p2!=NULL){
                printf("%s班的%s语文成绩为%d分\n",p1->Class,p2->name,p2->Chinese);
                printf("%s班的%s数学成绩为%d分\n",p1->Class,p2->name,p2->Math);
                printf("%s班的%s英语成绩为%d分\n",p1->Class,p2->name,p2->English);
                printf("%s班的%s总成绩为%d分\n",p1->Class,p2->name,p2->Sum);
                putchar('\n');
                p2 = p2->next;
        }
        p1 = p1->next;
    }
}
struct Student* AddStudentNode(struct Student *head,struct Student *new)  //尾插法创建学生链表
{
    struct Student *p = head;
    if(head==NULL){
            head = new;
            return head;
        }
    while(p->next!=NULL){
            p=p->next;
        }
    p->next = new;
    return head;
}

struct Student *ScanfStudent(struct Student *head,int Students)      //输入学生信息
{
    int j;
    for(j=0;j<Students;j++){
        struct Student *new = (struct Student*)malloc(sizeof(struct Student));
        new -> name = (struct Student *)malloc(sizeof(struct Student));
        new -> next = NULL;
        printf("请输入学生姓名:\n");
        scanf("%s",new->name);
        printf("请输入学生语文成绩:\n");
        scanf("%d",&(new->Chinese));
        printf("请输入学生数学成绩:\n");
        scanf("%d",&(new->Math));
        printf("请输入学生英语成绩:\n");
        scanf("%d",&(new->English));
        new->Sum = new->Chinese + new->Math + new->English;
        head = AddStudentNode(head,new);
    }
    return head;
}
struct Class* AddClassNode(struct Student *head,struct Student *new)    //增加班级节点
{
    struct Class *p = Chead;
    if(Chead==NULL){
            Chead = new;
            return Chead;
        }
        while(p->next!=NULL){
            p=p->next;
        }
        p->next = new;
        return Chead;


}
struct Class *CreatClass(int Classes,int Students) //创建班级链表
{
    int i;
    for(i=0;i<Classes;i++){
        struct Class *new;
        new = (struct Class*)malloc(sizeof(struct Class));
        new->Class = (struct Class*)malloc(sizeof(struct Class));
        new -> next = NULL;
        new -> Stuhead = NULL;
        printf("请输入班级:\n");
        scanf("%s",new->Class);
        new -> Stuhead = ScanfStudent(Shead,Students);
        Chead = AddClassNode(Chead,new);
    }
    return Chead;
}

int GetSumMax() //求成绩最大值
{
    int Max;
    struct Class *p1;
    p1 = Chead;
    struct Student *p2 = NULL;
    Max = p1-> Stuhead -> Sum;
    while(p1!=NULL){
        p2 = p1->Stuhead;
        while(p2!=NULL){

            if(p2->Sum>Max){
                Max = p2->Sum;
            }
            p2 = p2->next;
        }

        p1 = p1->next;
    }

    return Max;
}

int GetSumMin() //求成绩最小值
{
    int Min;
    struct Class *p1;
    p1 = Chead;
    struct Student *p2 = NULL;
    Min = p1-> Stuhead -> Sum;
    while(p1!=NULL){
        p2 = p1->Stuhead;
        while(p2!=NULL){

            if(p2->Sum<Min){
                Min = p2->Sum;
            }
            p2 = p2->next;
        }
        p1 = p1->next;
    }
    return Min;
}

float GetSumAverage(int m,int n)    //注意传参 m为班级,n为学生人数
{
    float total = 0;
    struct Class *p1;
    p1 = Chead;
    struct Student *p2 = NULL;
    while(p1!=NULL){
        p2 = p1->Stuhead;
        while(p2!=NULL){
            total += p2->Sum;
            p2 = p2->next;
        }
        p1 = p1->next;
    }
    return total/(float)(m*n);
}

int main()
{
    int m;
    int n;
    int Max;
    int Min;
    float Average;
    printf("请输入总班级数:\n");
    scanf("%d",&m);
    printf("请输入班级人数:\n");
    scanf("%d",&n);

    CreatClass(m,n);
    Max = GetSumMax();
    Min = GetSumMin();
    Average = GetSumAverage(m,n);
    printStudentMes();
    printf("总分最高的是%d\n总分最低的是:%d\总分平均分是:%f\n",Max ,Min,Average);
    return 0;
}
 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunshime.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值