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;
}