参考:实现双链表嵌套的简单学生信息管理
作者:三速何时sub20
发布时间: 2020-07-20 10:44:40
网址:https://blog.csdn.net/weixin_44234294/article/details/107458155?spm=1001.2014.3001.5501

参考:双链表嵌套实现简单学生成绩管理系统
作者:0~∞
发布时间: 2021-06-14 22:43:56
网址:https://blog.csdn.net/m0_47561451/article/details/117913579?spm=1001.2014.3001.5501

目录

  • 题目
  • 思路
  • 参考代码
  • 运行结果
  • 问题探索

题目

场景:一个年级,相当于链表A,该年级5个班,每个班5个人,相当于链表B1–B5。功能:录入学生基本信息和成绩,找出最高分、最低分、平均分。

思路

这个系统是一个双链表系统(班级和学生),母链表(班级)的每一个节点包含一个子链表(学生)的头节点,可以根据这个思想来创建(头插法、尾插法)和遍历链表,核心就是建立好这个双链表,其他的可以根据遍历链表来找出最高分、最低分、平均分。如图:

参考代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>//函数的声明(先定义的函数先使用了 可以不用声明)
struct Class *ClassMessage(struct Class *head,int Classnum,int stunum);
struct student *stuMessage(struct student *head,int stunum,int Classnum);
struct student *insertStuMessage(struct student *head,struct student *newData2);
void printMessage(struct Class *head,int stunum,int Classnum);
void findMathMaxScore(struct Class *head,int Classnum,int stunum);
void findChineseMaxScore(struct Class *head,int Classnum,int stunum);
void findEnglishMaxScore(struct Class *head,int Classnum,int stunum);
void gradeAvg(struct Class *head,int Classnum,int stunum);//学生信息结构体
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;
};//1、班级和学生链表(嵌套)创建
struct Class *ClassMessage(struct Class *head,int Classnum,int stunum)
{int j;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 = j+1;                                             //班级链表的内容stuHead=stuMessage(stuHead,stunum,j+1);//嵌套创建学生链表newData->messageHead=stuHead;                                        //班级链表的内容printf("#######################################\n");if(p == NULL){head = newData;}else{newData->next=head;//头插法                                  //班级链表的内容head=newData;}}return head;
}//录入一个学生信息
struct student *stuMessage(struct student *head,int stunum,int Classnum)
{int i;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,i+1);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));newData->sum=newData->chinese+newData->math+newData->english;newData->avg=(float)newData->sum/3;head=insertStuMessage(head,newData);//调用上面的头插法函数新建学生信息}return head;}//头插法插入到学生信息链表
struct student *insertStuMessage(struct student *head,struct student *newData2)
{if(head == NULL){head=newData2;}else{newData2->next=head;head=newData2;}return head;}//2、班级和学生链表的遍历打印
void printMessage(struct Class *head,int stunum,int Classnum)
{int i;int j;struct Class *p=head;//本来的链表头复制一份给P 用来自增遍历链表 这样就不会改变原有的链表形态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,j+1,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");        p2=p2->next;}p=p->next;}}//3、链表遍历找数学最高分的学生
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=pclass->ClassNum;stuHao=pstu->data;}pstu=pstu->next;}pclass=pclass->next;}printf("-------------年级数学最高分--------------\n");printf("数学最高分是: %d班 学号 %d 分数 %d分\n",classHao,stuHao,maxScore);}//4、链表遍历找语文最高分的学生
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);}//5、链表遍历找英语最高分的学生
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);}//6、链表遍历计算年级均分
void gradeAvg(struct Class *head,int Classnum,int stunum)
{struct Class *pclass=head;struct student *pstu;int gradeSum=0;int numOfStu;float gradeAvg;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);   //1、班级、学生链表的创建printMessage(head,b,a);        //2、班级、学生链表的遍历打印findMathMaxScore(head,a,b);    //3、数学最高findChineseMaxScore(head,a,b); //4、语文最高findEnglishMaxScore(head,a,b); //5、英语最高gradeAvg(head,a,b);            //6、年级均分system("pause");return 0;
}

运行结果

仔细观察,链表遍历输出学生信息的时候,发现遍历的顺序是从2班学号为2的学生开始往后遍历的,这是因为我们使用的是头插法创建链表,最后插入到链表的最先被遍历。

请输入班级数量:
2
请输入班级人数量:
2
请输入1班第1位学生学号
1
chinese:
87
math:
90
english:
45
请输入1班第2位学生学号
2
chinese:
78
math:
54
english:
67
#######################################
请输入2班第1位学生学号
1
chinese:
56
math:
89
english:
54
请输入2班第2位学生学号
2
chinese:
76
math:
89
english:
56
#######################################
第2班第1个学生:学号 2
成绩:chinese:76 math:89 english:56
总分:221 平均分:73.666664
---------------------------------
第2班第2个学生:学号 1
成绩:chinese:56 math:89 english:54
总分:199 平均分:66.333336
---------------------------------
第1班第1个学生:学号 2
成绩:chinese:78 math:54 english:67
总分:199 平均分:66.333336
---------------------------------
第1班第2个学生:学号 1
成绩:chinese:87 math:90 english:45
总分:222 平均分:74.000000
---------------------------------
-------------年级数学最高分--------------
数学最高分是: 1班 学号 1 分数 90分
---------------年级语文最高分--------------
语文最高分是: 1班 学号 1 分数 87分
---------------年级英语最高分--------------
英语最高分是: 1班 学号 2 分数 67分
---------------年级平均分--------------
年级平均分是140.166672
请按任意键继续. . .

问题探索

在学生结构体体面添加 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;
}

双链表嵌套的简单学生信息管理系统相关推荐

  1. 用python制作一个学生信息管理软件_python实现简单学生信息管理系统

    python简单的学生信息管理系统-文件版,供大家参考,具体内容如下 功能如下 主函数部分 增加学生信息 修改学生信息 删除学生信息 查询学生 显示所有学生的信息 将数据录入文件 读取文件数据 学习文 ...

  2. jsp mysql简单仓库信息管理系统_基于jsp+mysql的JSP简单学生信息管理系统

    运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以. IDE环境: Eclipse,Myeclipse,IDEA都可以 tomcat环境: Tomcat 7.x, ...

  3. Java简单学生信息管理系统

    JAVA简单写学生信息管理系统,实现学生信息的输入.查询.修改.删除操作 package Week;import jdk.internal.util.xml.impl.Input;import jav ...

  4. 基于GUI+MySQL技术的简单学生信息管理系统

    简单的学生信息管理系统 1. 需求分析 1.1 系统总体分析 1.2 用户系统分析 2. 课题及任务功能描述 2.1 课题研究背景 2.2 功能描述 3. 总体设计 3.1 系统总体设计 3.2 系统 ...

  5. c语言饭卡管理系统链表文件,C语言《学生信息管理系统》链表+文件操作

    今天带来的是一个链表版本的<学生信息管理系统>,功能包括:添加.显示.查询.删除.保存.读取,等功能模块,链表是C语言的进阶内容,希望大家好好学习,这里的代码可能会有一些瑕疵,希望大家提供 ...

  6. Java——Web开发之MVC设计模式的学生信息管理系统(二)

    为什么这个标题为"(二)",其实是对于上一个特别简单学生信息管理系统里功能的完善. 所谓的"(一)"在这:学生信息管理系统(一) 系统实现的功能: 实现添加学生 ...

  7. 用python设计学生管理系统_基于python和tkinter实现的一个简单的学生信息管理系统...

    一个简单的学生信息管理系统基于python和tkinter 1.需求分析1.大学生信息管理系统使用tkinter接口创建一个窗口.使界面更漂亮.2. 实现与数据库的连接,教师和学生的信息可以保存或读取 ...

  8. 复习Java第一个项目学生信息管理系统 04(权限管理和动态挂菜单功能) python简单爬数据实例Java面试题三次握手和四次挥手生活【记录一个咸鱼大学生三个月的奋进生活】016

    记录一个咸鱼大学生三个月的奋进生活016 复习Java(学生信息管理系统04权限管理和动态挂菜单功能) 改写MainFrame的构造方法 新增LoginFrame的验证登录是否成功的代码 新增Logi ...

  9. c++ stl list实现简单的学生信息管理系统

    c++ stl list实现简单的学生信息管理系统 问题描述: 已知有20个学生记录(包括学号.姓名.成绩)的文件student.dat.要求编程序实现查询.排序.插入.删除诸功能. 系统的基本功能: ...

最新文章

  1. 接入新浪、腾讯微博和人人网的Android客户端实例 接入新浪、腾讯微博和人人网的Android客户端实例...
  2. go gin提交form表单请求
  3. sql 递归查询所有的下级
  4. 人工智能必看的 45 篇论文(附下载地址)
  5. [LeetCode] 9. Palindrome Number
  6. 6月15日起,刷卡机不能自选商户了,这样会有多少卡被封掉?
  7. 【jquery】find() 方法,filter()方法和children()方法
  8. js之数据类型的比较
  9. Jsp使用Cookie完成记住账号密码的功能
  10. spring学习---IOC--基于xml--bean管理--spring创建对象--spring注入属性--其他属性注入--外部bean--内部bean
  11. jsp:param能不能传递变量_变量、作用域与内存
  12. linux mint 19安装 kvm 软件包
  13. PyTorch搭建LeNet-5模型(在MNIST数据集上准确率接近100%)
  14. 最全的货币代码中文翻译.
  15. 山东春考c语言试题及答案,2020 年山东省春季高考技能考试 信息技术类专业试题...
  16. qq等级计算机在线,I'M QQ - QQ官方网站
  17. python价值算法_第十课-Python金融学基础——夏普比率(Sharpe-ratio)和资产组合价值(portfolio-value)...
  18. 只有他自己知道——生活所迫罢了
  19. 电影天堂,批量下载,简单实现
  20. python百钱百鸡问题_shell的循环与百鸡百钱问题

热门文章

  1. 【第二十七章】 springboot + zipkin(brave-okhttp实现)
  2. bootstrap-代码-内联代码
  3. linux下编译的PHP添加soap扩展
  4. J2SE综合对java util的总结 一
  5. Windows部署服务WDS实例
  6. JAVA方法 字符串与unicode的相互转换
  7. 《Sibelius 脚本程序设计》连载(十四) - 2.1 注释、语句、语句块
  8. 银行家舍入VS四舍五入(下):.NET发现之旅(四)
  9. 形象的列举-C# 枚举
  10. 学习笔记(52):Python实战编程-Radiobutton