C语言嵌套链表实现学生成绩管理系统

C语言嵌套链表实现学生成绩管理系统

第一次写博客,把学习过程记录下来,望大佬路过指正

如题

  • 链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。
    场景:一个年级,相当链表A,该年级5个班,每个班5个人,相当于链表B1–B5,做一个学生成绩管理系统。
    学生成绩有语文 数学 英语
    功能: 录入成绩 找三科总分的最高分 最低分 算出平均分
    实现代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student //学生信息结构体
{
    /* data */
    char name[20]; //姓名
    int number;    //学号
    int chinese;   //语文成绩
    int math;      //数学成绩
    int English;   //英语成绩
    int sum;
    float grade; //年级
    float Avrage
} Students;
typedef struct Classlist //节点
{
    struct student data;         //数据域
    struct Classlist *classNext; //指针域  指向下一个节点
} ClassList, ClassNode;
typedef struct gradelist
{
    struct Classlist *Class;
    struct gradelist *gradeNext;
} GradeList;

ClassList *pClasslist;
Students pStudent;
GradeList *pGradeList;
/*
    初始化链表 
    初始化成功返回1,失败返回0
*/
int InitClassList(ClassList **pList) //传入二级指针  改变链表的值
{
    *pList = (ClassList *)malloc(sizeof(ClassList)); // 为需要初始化的链表开辟空间
    if ((*pList) != NULL)
    {
        (*pList)->classNext = NULL; //尾节点的下一个 指向NULL
        return 1;
    }
    return 0;
}
Students InputData(Students StudentNode)
{
    printf("请依次输入学生的年级(用小数表示 1.1表示1年级1班)姓名 23学号,语文成绩,数学成绩,英语成绩\n");
    scanf("%f %s %d %d %d %d", &StudentNode.grade, StudentNode.name, &StudentNode.number, &StudentNode.chinese, &StudentNode.math, &StudentNode.English);
    return StudentNode;
}
/*
添加节点 
传入参数 链表名   数据域结构体
*/
ClassList *CreateClassList(ClassList *plist, int num, Students (*frave)(Students student))
{
    ClassNode *head = plist;
    ClassNode *Tail = head;
    int cnt = 1;
    Students Stu;
    while (cnt <= num) //如果尾节点的下一个不为空
    {
        /* code */
        printf("第%d个数据\n", cnt);
        ClassNode *NewNode = (ClassNode *)malloc(sizeof(ClassNode)); //为新节点开辟空间
        Stu = frave(Stu);
        /*  NewNode->data.grade = Stu.grade;      //年级
        strcpy(NewNode->data.name, Stu.name); //姓名
        NewNode->data.number = Stu.number;    //学号
        NewNode->data.chinese = Stu.chinese;  //语文
        NewNode->data.math = Stu.math;
        NewNode->data.English = Stu.English;
        */
        NewNode->data = Stu; //上边一串可用这个代替
        Tail->classNext = NewNode;
        Tail = NewNode;
        cnt++;
    }
    Tail->classNext = NULL;
    return plist;
}
/*
传入参数 班级链表
打印学生信息  
*/
void PrintfStudentInfo(ClassList *plist)
{
    plist->data.sum = plist->data.chinese + plist->data.math + plist->data.English;
    plist->data.Avrage = plist->data.sum / 3;
    printf(" %.1f  %s    %d       %d        %d         %d     %d   %.1f\n", plist->data.grade, \ 
    plist->data.name,
           plist->data.number, plist->data.chinese, plist->data.math,
           plist->data.English, plist->data.sum, plist->data.Avrage);
}
/*
遍历链表
传入参数 链表名   数据域结构体
*/
void TraverClassList(ClassList *plist, void (*Traver)(ClassList *plist))
{
    ClassList *head = plist->classNext; //从首节点开始遍历  而不是头结点
    while (head != NULL)
    {
        Traver(head);
        head = head->classNext;
    }
}
/*
//初始化 年级链表 
成功返回 1 失败返回 0
*/
int InitGradeList(GradeList **pGlist)
{
    (*pGlist) = (GradeList *)malloc(sizeof(GradeList));
    if ((*pGlist) != NULL)
    {
        (*pGlist)->gradeNext = NULL;
        return 1;
    }
    return 0;
}
/*
创建年级链表  
传入参数 年级链表名  班级链表 班级数  创建结点的函数指针
*/
void CreateGradeList(GradeList *pGlist, ClassList *plist, int ClassNum, Students (*frave)(Students student))
{
    GradeList *head = pGlist;
    GradeList *Tail = head;
    int num = 1;
    int StuNum;
    while (num <= ClassNum)
    {
        /* code */
        printf("请输入%d 班的人数\n", num);
        scanf("%d", &StuNum);
        printf("请输入 %d 班的成绩\n", num);
        GradeList *NewNode = (GradeList *)malloc(sizeof(GradeList));

        NewNode->Class = CreateClassList(plist, StuNum, frave);

        Tail->gradeNext = NewNode;
        Tail = NewNode;
        num++;
    }
    Tail->gradeNext = NULL;
}
/*
打印年级 所有学生信息
传入参数 链表名   
*/
void PrintInfo(GradeList *pGlist)
{
    GradeList *head = pGlist->gradeNext;
    int num = 1;
    while (head != NULL)
    {
        printf("        %d 班的学生成绩\n", num);
        printf("班级:姓名:学号:语文成绩:数学成绩:英语成绩: 总和:平均分\n");
        TraverClassList(head->Class, PrintfStudentInfo);
        head = head->gradeNext;
        num++;
    }
}

void datadeal(GradeList *pGlist)
{
    GradeList *head_g = pGlist->gradeNext; //获取首节点
    ClassList *head_c;
    int max = head_g->Class->classNext->data.sum; //层层寻找 先找到最开始的底层的成绩
    int min = head_g->Class->classNext->data.sum;
    while (head_g != NULL)
    {
        head_c = head_g->Class->classNext; //重点   每次二级链表的头数据节点指向 一级链表的下一个
        while (head_c != NULL)
        {
            if (head_c->data.sum < min)
                min = head_c->data.sum;
            if (head_c->data.sum > max)
                max = head_c->data.sum;
            head_c = head_c->classNext;
        }
        head_g = head_g->gradeNext;
    }
    printf("总分最高为 %d\n", max);
    printf("总分最低为 %d\n", min);
}
int main()
{
    int classnum;
    
    InitClassList(&pClasslist); //传入二级指针  改变链表的值
    InitGradeList(&pGradeList);
    while (1)
    {
        /* code */
        printf("**********年级学生成绩管理系统**********\n");
        printf("请输入需要录入的班级数\n");
        scanf("%d", &classnum);
        CreateGradeList(pGradeList, pClasslist, classnum, InputData);
        printf("学生的成绩信息:\n");
        PrintInfo(pGradeList);
        datadeal(pGradeList);
    }

    return 0;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值