双链表嵌套的简单学生信息管理系统
參考:實(shí)現(xiàn)雙鏈表嵌套的簡單學(xué)生信息管理
作者:三速何時(shí)sub20
發(fā)布時(shí)間: 2020-07-20 10:44:40
網(wǎng)址:https://blog.csdn.net/weixin_44234294/article/details/107458155?spm=1001.2014.3001.5501
參考:雙鏈表嵌套實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng)
作者:0~∞
發(fā)布時(shí)間: 2021-06-14 22:43:56
網(wǎng)址:https://blog.csdn.net/m0_47561451/article/details/117913579?spm=1001.2014.3001.5501
目錄
- 題目
- 思路
- 參考代碼
- 運(yùn)行結(jié)果
- 問題探索
題目
場景:一個(gè)年級(jí),相當(dāng)于鏈表A,該年級(jí)5個(gè)班,每個(gè)班5個(gè)人,相當(dāng)于鏈表B1–B5。功能:錄入學(xué)生基本信息和成績,找出最高分、最低分、平均分。
思路
這個(gè)系統(tǒng)是一個(gè)雙鏈表系統(tǒng)(班級(jí)和學(xué)生),母鏈表(班級(jí))的每一個(gè)節(jié)點(diǎn)包含一個(gè)子鏈表(學(xué)生)的頭節(jié)點(diǎn),可以根據(jù)這個(gè)思想來創(chuàng)建(頭插法、尾插法)和遍歷鏈表,核心就是建立好這個(gè)雙鏈表,其他的可以根據(jù)遍歷鏈表來找出最高分、最低分、平均分。如圖:
參考代碼
#include <stdio.h> #include <stdlib.h> #include <string.h>//函數(shù)的聲明(先定義的函數(shù)先使用了 可以不用聲明) 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);//學(xué)生信息結(jié)構(gòu)體 struct student {int data;int chinese;int math;int english;int sum;float avg;struct student *next; }; //班級(jí)結(jié)構(gòu)體 struct Class {int ClassNum;struct student *messageHead;//定義一個(gè)結(jié)構(gòu)體指針指向?qū)W生信息鏈表struct Class *next; };//1、班級(jí)和學(xué)生鏈表(嵌套)創(chuàng)建 struct Class *ClassMessage(struct Class *head,int Classnum,int stunum) {int j;struct Class *p=head;struct Class *newData=NULL;//用來新建信息的班級(jí)struct student *stuHead; for(j=0;j<Classnum;j++){ //班級(jí)鏈表的創(chuàng)建newData=(struct Class *)malloc(sizeof(struct Class));newData->ClassNum = j+1; //班級(jí)鏈表的內(nèi)容stuHead=stuMessage(stuHead,stunum,j+1);//嵌套創(chuàng)建學(xué)生鏈表newData->messageHead=stuHead; //班級(jí)鏈表的內(nèi)容printf("#######################################\n");if(p == NULL){head = newData;}else{newData->next=head;//頭插法 //班級(jí)鏈表的內(nèi)容head=newData;}}return head; }//錄入一個(gè)學(xué)生信息 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("請(qǐng)輸入%d班第%d位學(xué)生學(xué)號(hào)\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);//調(diào)用上面的頭插法函數(shù)新建學(xué)生信息}return head;}//頭插法插入到學(xué)生信息鏈表 struct student *insertStuMessage(struct student *head,struct student *newData2) {if(head == NULL){head=newData2;}else{newData2->next=head;head=newData2;}return head;}//2、班級(jí)和學(xué)生鏈表的遍歷打印 void printMessage(struct Class *head,int stunum,int Classnum) {int i;int j;struct Class *p=head;//本來的鏈表頭復(fù)制一份給P 用來自增遍歷鏈表 這樣就不會(huì)改變?cè)械逆湵硇螒B(tài)struct student *p2=NULL;for(i=0;i<Classnum;i++){p2=p->messageHead;//讓p2指向class結(jié)構(gòu)體里面指向?qū)W生信息的指針for(j=0;j<stunum;j++){printf("第%d班第%d個(gè)學(xué)生:學(xué)號(hào) %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、鏈表遍歷找數(shù)學(xué)最高分的學(xué)生 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("-------------年級(jí)數(shù)學(xué)最高分--------------\n");printf("數(shù)學(xué)最高分是: %d班 學(xué)號(hào) %d 分?jǐn)?shù) %d分\n",classHao,stuHao,maxScore);}//4、鏈表遍歷找語文最高分的學(xué)生 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("---------------年級(jí)語文最高分--------------\n");printf("語文最高分是: %d班 學(xué)號(hào) %d 分?jǐn)?shù) %d分\n",classHao,stuHao,maxScore);}//5、鏈表遍歷找英語最高分的學(xué)生 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("---------------年級(jí)英語最高分--------------\n");printf("英語最高分是: %d班 學(xué)號(hào) %d 分?jǐn)?shù) %d分\n",classHao,stuHao,maxScore);}//6、鏈表遍歷計(jì)算年級(jí)均分 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("---------------年級(jí)平均分--------------\n");printf("年級(jí)平均分是%f\n",gradeAvg); } int main() {int a;int b;struct Class *head; //其實(shí)也是個(gè)野指針printf("請(qǐng)輸入班級(jí)數(shù)量:\n");scanf("%d",&a);printf("請(qǐng)輸入班級(jí)人數(shù)量:\n");scanf("%d",&b);head=ClassMessage(head,a,b); //1、班級(jí)、學(xué)生鏈表的創(chuàng)建printMessage(head,b,a); //2、班級(jí)、學(xué)生鏈表的遍歷打印findMathMaxScore(head,a,b); //3、數(shù)學(xué)最高findChineseMaxScore(head,a,b); //4、語文最高findEnglishMaxScore(head,a,b); //5、英語最高gradeAvg(head,a,b); //6、年級(jí)均分system("pause");return 0; }運(yùn)行結(jié)果
仔細(xì)觀察,鏈表遍歷輸出學(xué)生信息的時(shí)候,發(fā)現(xiàn)遍歷的順序是從2班學(xué)號(hào)為2的學(xué)生開始往后遍歷的,這是因?yàn)槲覀兪褂玫氖穷^插法創(chuàng)建鏈表,最后插入到鏈表的最先被遍歷。
請(qǐng)輸入班級(jí)數(shù)量: 2 請(qǐng)輸入班級(jí)人數(shù)量: 2 請(qǐng)輸入1班第1位學(xué)生學(xué)號(hào) 1 chinese: 87 math: 90 english: 45 請(qǐng)輸入1班第2位學(xué)生學(xué)號(hào) 2 chinese: 78 math: 54 english: 67 ####################################### 請(qǐng)輸入2班第1位學(xué)生學(xué)號(hào) 1 chinese: 56 math: 89 english: 54 請(qǐng)輸入2班第2位學(xué)生學(xué)號(hào) 2 chinese: 76 math: 89 english: 56 ####################################### 第2班第1個(gè)學(xué)生:學(xué)號(hào) 2 成績:chinese:76 math:89 english:56 總分:221 平均分:73.666664 --------------------------------- 第2班第2個(gè)學(xué)生:學(xué)號(hào) 1 成績:chinese:56 math:89 english:54 總分:199 平均分:66.333336 --------------------------------- 第1班第1個(gè)學(xué)生:學(xué)號(hào) 2 成績:chinese:78 math:54 english:67 總分:199 平均分:66.333336 --------------------------------- 第1班第2個(gè)學(xué)生:學(xué)號(hào) 1 成績:chinese:87 math:90 english:45 總分:222 平均分:74.000000 --------------------------------- -------------年級(jí)數(shù)學(xué)最高分-------------- 數(shù)學(xué)最高分是: 1班 學(xué)號(hào) 1 分?jǐn)?shù) 90分 ---------------年級(jí)語文最高分-------------- 語文最高分是: 1班 學(xué)號(hào) 1 分?jǐn)?shù) 87分 ---------------年級(jí)英語最高分-------------- 英語最高分是: 1班 學(xué)號(hào) 2 分?jǐn)?shù) 67分 ---------------年級(jí)平均分-------------- 年級(jí)平均分是140.166672 請(qǐng)按任意鍵繼續(xù). . .問題探索
在學(xué)生結(jié)構(gòu)體體面添加 char *name,用來曾加學(xué)生的名字信息,可是遍歷結(jié)果體的時(shí)候就出現(xiàn)段錯(cuò)誤。
學(xué)生結(jié)構(gòu)體的地方
錄入的地方
遍歷的地方
感謝大佬指點(diǎn)了一下,加了名字的代碼如下
#include <stdio.h> #include <stdlib.h> #include <string.h> //學(xué)生信息結(jié)構(gòu)體 struct student {int data;char name[10];int chinese;int math;int english;int sum;float avg;struct student *next; }; //班級(jí)結(jié)構(gòu)體 struct Class {int ClassNum;struct student *messageHead;//定義一個(gè)結(jié)構(gòu)體指針指向?qū)W生信息鏈表struct Class *next; }; //打印各個(gè)學(xué)生的相關(guān)信息 void printMessage(struct Class *head,int stunum,int Classnum) {int i;int j;int k=1;//用來計(jì)算第幾個(gè)學(xué)生的struct Class *p=head;struct student *p2=NULL;for(i=0;i<Classnum;i++){p2=p->messageHead;//讓p2指向class結(jié)構(gòu)體里面指向?qū)W生信息的指針for(j=0;j<stunum;j++){printf("第%d班第%d個(gè)學(xué)生:學(xué)號(hào) %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;}} //使用頭插法插入新的學(xué)生信息 struct student *insertStuMessage(struct student *head,struct student *newData2) {if(head == NULL){head=newData2;}else{newData2->next=head;head=newData2;}return head;} //錄入學(xué)生的相關(guān)信息 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("請(qǐng)輸入%d班第%d位學(xué)生學(xué)號(hào)\n",Classnum,num);scanf("%d",&(newData->data));printf("請(qǐng)輸入姓名:\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);//調(diào)用上面的頭插法函數(shù)新建學(xué)生信息}return head;} //班級(jí)鏈表的操作 struct Class *ClassMessage(struct Class *head,int Classnum,int stunum) {int j;int num=Classnum;struct Class *p=head;struct Class *newData=NULL;//用來新建信息的班級(jí)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; } //找數(shù)學(xué)最高分的學(xué)生 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("-------------年級(jí)數(shù)學(xué)最高分--------------\n");printf("數(shù)學(xué)最高分是: %d班 學(xué)號(hào) %d 姓名 %s 分?jǐn)?shù) %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("---------------年級(jí)語文最高分--------------\n");printf("語文最高分是: %d班 學(xué)號(hào) %d 姓名 %s 分?jǐn)?shù) %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("---------------年級(jí)英語最高分--------------\n");printf("英語最高分是: %d班 學(xué)號(hào) %d 姓名 %s 分?jǐn)?shù) %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("---------------年級(jí)平均分--------------\n");printf("年級(jí)平均分是%f\n",gradeAvg); } int main() {int a;int b;struct Class *head;printf("請(qǐng)輸入班級(jí)數(shù)量:\n");scanf("%d",&a);printf("請(qǐng)輸入班級(jí)人數(shù)量:\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; }總結(jié)
以上是生活随笔為你收集整理的双链表嵌套的简单学生信息管理系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 接口限流实践
- 下一篇: java获取系统所有字体_java获取本