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

参考:实现双链表嵌套的简单学生信息管理
作者:三速何时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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scrapy如何指定生成python3的项目_如何把阿里图标库的图标生成代码并应用于自己的项目...

有时候需要用很多图标去完成一定的页面效果和工作展现&#xff0c;框架内置的图标可能满足不了我们的需求&#xff0c;有个很好的图标库想必大家都知道-----就是阿里图标库。那么我们如何才能够把阿狸图标库的图标引用到自己的项目中呢&#xff1f;耐着性子往下看吧&#xff01…

win10系统无线服务器出错,win10系统中Wi-Fi证书错误的解决方法

wifi想必大家都很熟悉吧&#xff0c;这是很多用户们喜欢的无线网络&#xff0c;但是有时候会碰到一些wifi错误&#xff0c;比如有不少win10系统用户遇到wifi证书错误的情况&#xff0c;这样就会导致用户无法连接到网络或访问某个网站&#xff0c;该怎么处理呢&#xff0c;现在就…

subprocess模块

subprocess模块 subprocess可以根据命令的结果&#xff0c;正确的或者错误的分开存放 存放正确的结果 # import subprocess # objsubprocess.Popen(tasklist,shellTrue, # stdoutsubprocess.PIPE, # stderrsubprocess.PIPE, # …

通过EIGRP的 variance 参数实现非等价负载均衡

实验拓扑如上图所示我们使用EIGRP协议做通全网实现R1 的1.1.1.1 可以和 R4的4.4.4.4 进行通信 此时我们查看R1的路由表&#xff0c;查看去往4.4.4.4 的路由条目 通过拓扑图我们看到 R1去往4.4.4.4 是有两条路径的也就是 R1-R2-R4 和 R1-R3-R4 &#xff0c;但是在路由表中&…

echarts 获取点击的y轴数值_用 Python 自动获取NBA现役球员的职业生涯数据曲线

前言作为一个看了多年篮球的 NBA球迷&#xff0c;一直在想用 python 和篮球一起来写点什么加上最近在学习 pyecharts &#xff0c;所以就有了下面这篇文章&#xff1a;根据输入的球队和球员名字&#xff0c;自动生成该球员职业生涯数据曲线图&#xff01;✨ 效果火箭哈登勇士格…

重装系统后dns服务器未响应,dns服务器未响应,小编教你dns服务器未响应怎么解决...

连网时&#xff0c;出现连不上网络&#xff0c;用Windows网络诊断&#xff0c;诊断出的结果是“DNS服务器未响应”&#xff0c;遇到这样情况该怎样解决&#xff1f;在使用window系统的电脑上网过程中&#xff0c;常常会遇到DNS服务器未响应的问题&#xff0c;怎么办&#xff1f…

VMware虚拟机启动错误(正在被占用、内部错误)等问题

参考&#xff1a;VMware虚拟机启动错误&#xff08;正在被占用、内部错误&#xff09;等问题 作者&#xff1a;扫地僧- 发布时间&#xff1a;2019-09-20 15:02:55 网址&#xff1a;https://blog.csdn.net/weixin_42119153/article/details/101060183?spm1001.2014.3001.5501 目…

mt4 指标 涨跌幅 颜色k线_通达信指标公式源码阴线买股+黄金K线指标+源码

源码&#xff1a;TT2:DMA((((HIGH LOW) (CLOSE * 2)) / 4.15),0.9);TT1:REF(EMA(TT2,3),1);RSV:(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;K:SMA(RSV,3,1);D:SMA(K,3,1);J:3*K-2*D;LC:REF(CLOSE,1);RSI:((SMA(MAX((CLOSE - LC),0),3,1) / SMA(ABS((CLOSE - LC)),3,1)…

Windows Server 2008 R2 遗忘管理员密码后的解决方法-by iLync

思路是这样的&#xff1a;修改登录界面其他功能的链接&#xff0c;使之成为CMD的链接&#xff0c;在CMD命令里面定位到C:\\Windows\System32下&#xff0c;用net user 去修改账号和密码具体操作如下&#xff1a;一、使用Windows Server 2008 R2的安装光盘引导计算机启动。完成安…

面经——Linux相关

摘自&#xff1a;看完这些面试必问的Linux小知识&#xff0c;我保证你面试后会来给我的文章一键三连 作者&#xff1a;万里羊 发布时间&#xff1a;2021-04-09 21:55:23 网址&#xff1a;https://blog.csdn.net/weixin_44895651/article/details/115532107 作为一名以后想从事嵌…

android 权限动态申请

名字其实有点让人感觉高大上"权限动态申请",其实也没有什么, 以前做Android程序的时候,比如需要打开摄像头 那么需要在 然后就可以了, 但是Android6.0之后呢,有些权限必须手动让用户同意才可以,哪些权限需要用户手动同意,哪些不需要这里大家自行百度 现在说一下 直接…

php mysql installed_CentOS在使用yum install php-mysql安装php时报错的解决方法

由于此项目的apache只是用于下载功能和安装phpAdmin来查找数据库&#xff0c;而且之前已经安装了Mysql 5.6&#xff0c;于是在部署是都是直接使用yum命令方法安装。但在使用yum install php-mysql时报了一大堆的错误&#xff1a;from install of mysql-libs-5.1.69-1.el6_4.x86…

ppt转html5 带动画_我复刻了IPhone12这页发布会PPT

今年苹果发布会没有看&#xff0c;但是最近看到三石兄发了一篇关于发布会现场的这页PPT复刻的推文&#xff0c;它介绍的是利用直线辅助的方法来完成。三石兄相关推文&#xff1a;iPhone12发布会PPT&#xff0c;你也能做&#xff01;​mp.weixin.qq.com那么今天我们主要介绍如何…

tablemodel dapter区别

2019独角兽企业重金招聘Python工程师标准>>> 简单的原则&#xff1a; 如果查询部分字段用adapter 如果多表查询用adapter 如果考虑sql注入用adapter 如果增加、删除、修改、查询单个表的全部字段用tablemodel 转载于:https://my.oschina.net/shunshun/blog/92668

安卓短信加密_发短信控制车辆!苹果发布ios14,手机可作车钥匙

1.苹果宣布今后iPhone和Apple Watch可以作为开启和启动车辆的数字钥匙&#xff1b;2.支持该系统的第一款汽车将会是宝马5系&#xff1b;3.“车钥匙”功能将于下月推送&#xff0c;iOS13上也可使用&#xff1b;4.车主可以通过Apple的iMessage短信应用程序与其他五个人共享密钥&a…

ubuntu14测试mysql_在ubuntu14.04中安装Hammerora-2.10——测试mysql、oracle性能够的工具...

Hammerora—The Open Source Oracle Load Test Tool首先介绍一下Hammerora&#xff0c;从创作者对这个工具的标题描述可以看出&#xff0c;Hammerora是一款Oracle数据库负载测试工具。该工具可以在Oracle 8i、9i和10g等版本上使用。当前可以用在Linux/Unix和Windows上。初步实现…

哇嘎显示等待无服务器,vagaa搜索不到资源怎么回事?vagaa哇嘎搜索没反应的解决方法...

vagaa哇嘎是一款资源搜索神器&#xff0c;使用非常的简单&#xff0c;但是有网友反映&#xff0c;使用vagaa哇嘎搜索不到东西了&#xff0c;这是怎么回事&#xff0c;如果点击vagaa搜索没反应可能是搜索的问题&#xff0c;也可能是其他问题&#xff0c;一起来看看具体的解决方法…

内存四区(代码区 静态区 栈区 堆区)

参考&#xff1a;内存四区&#xff08;代码区 静态区 栈区 堆区&#xff09; 作者&#xff1a;今天天气眞好 发布时间&#xff1a; 2021-04-01 18:09:13 网址&#xff1a;https://blog.csdn.net/qq_51118175/article/details/115379779?spm1001.2014.3001.5501 内存相关博文&a…

webpack4 入门配置研究

1. 全局安装 npm install webpack webpack-cli webpack-dev-server -g 1.1&#xff09;输密文的密码&#xff08;电脑开机&#xff09; 1.2&#xff09;安装成功 2. 输入命令mkdir config dist src创建三个文件夹 3.输入命令npm init -y 4. 输入命令touch dist/index.html src/…

王者荣耀6月23服务器维护,王者荣耀6.23维护到什么时候?6月23日长枪掠火版本异常介绍...

王者荣耀6.23维护到什么时候&#xff1f;可能很多玩家对于今天更新的时间还不太清楚&#xff0c;下面就让浏览器小编为大家带来&#xff0c;王者荣耀6月23日长枪掠火版本异常介绍。亲爱的召唤师&#xff1a; “长枪掠火”版本更新后&#xff0c;我们收到反馈&#xff0c;本次在…