C語言利用鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)
鏈表是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),結(jié)構(gòu)體指針在這里得到了充分的利用。
鏈表可以動(dòng)態(tài)的進(jìn)行存儲(chǔ)分配,也就是說,鏈表是一個(gè)功能極為強(qiáng)大的數(shù)組,他可以在節(jié)點(diǎn)中定義多種數(shù)據(jù)類型,還可以根據(jù)需要隨意增添,刪除,插入節(jié)點(diǎn)。
鏈表都有一個(gè)頭指針,一般以head來表示,存放的是一個(gè)地址。鏈表中的節(jié)點(diǎn)分為兩類,頭結(jié)點(diǎn)和一般節(jié)點(diǎn),頭結(jié)點(diǎn)是沒有數(shù)據(jù)域的。鏈表中每個(gè)節(jié)點(diǎn)都分為兩部分,一個(gè)數(shù)據(jù)域,一個(gè)是指針域。
說到這里你應(yīng)該就明白了,鏈表就如同車鏈子一樣,head指向第一個(gè)元素:第一個(gè)元素又指向第二個(gè)元素;……,直到最后一個(gè)元素,該元素不再指向其它元素,它稱為“表尾”,它的地址部分放一個(gè)“NULL”(表示“空地址”),鏈表到此結(jié)束。
作為有強(qiáng)大功能的鏈表,對(duì)他的操作當(dāng)然有許多,比如:鏈表的創(chuàng)建,修改,刪除,插入,輸出,排序,反序,清空鏈表的元素,求鏈表的長度等等。
本文就將利用C語言中的鏈表實(shí)現(xiàn)一個(gè)簡單的學(xué)生成績管理系統(tǒng)
示例代碼
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream> int choice = 0; int mima=123456; int zhanghao=123456; int summ=0;//學(xué)生總數(shù) int i=0,j=0,k=0;//數(shù)學(xué)英語樹脂不及格的人數(shù) using namespace std; typedef struct STUDENT { int num; //學(xué)號(hào) char name[15]; //姓名 char major[15]; //專業(yè) double math; //數(shù)學(xué)成績 double english; //英語成績 double shuzhi; //IKUN樹脂分 double average; //平均分 double sum; //總分 }student; typedef struct Node { student data; struct Node *next; }Node,*LinkList; void CreateList(LinkList &l); //創(chuàng)建鏈表 void ZenjaiNode(LinkList &l, student e); //增加節(jié)點(diǎn) int ShanchuNode(LinkList &l, int num); //刪除節(jié)點(diǎn) int XuigaiNode(LinkList &l, int num, student e); //修改節(jié)點(diǎn) int Chazhao(LinkList l, int num, student &e); //查找節(jié)點(diǎn) void ZenjiaStudent(LinkList &l); //增加學(xué)生 void ShanchuStudent(LinkList &l); //刪除學(xué)生 void XuigaiStudent(LinkList &l); //修改學(xué)生 void ChazhaoStudent(LinkList l); //查找學(xué)生 void XianshiStudent(LinkList l); //顯示學(xué)生 void menu(); //主菜單 void math(); void english(); void shuzhi(); void mathmax(); void englishmax(); void shuzhimax(); void CreateList(LinkList &l)//創(chuàng)建鏈表,頭節(jié)點(diǎn) { l=(LinkList)malloc(sizeof(Node)); l->next=NULL; } void ZenjiaNode(LinkList &l, student e)//尾插節(jié)點(diǎn) { Node*q=(LinkList)malloc(sizeof(Node)); q->data=e; q->next=NULL; Node*p=l; while(p->next) p=p->next; p->next=q; } int ShanchuNode(LinkList &l, int num)//刪除節(jié)點(diǎn) { Node *p,*q; p=l; while(p->next) { q=p->next; if(num==(q->data).num) { if((q->data).math<60) i--; if((q->data).english<60) j--; if((q->data).shuzhi<60) k--; p->next=q->next; free(q); return 0;//刪除完成 } p=p->next; } return 1;//未找到 } int XuigaiNode(LinkList &l, int num, student e)//修改節(jié)點(diǎn) { Node *p,*q; p=l; while(p->next) { q=p->next; if(num==(q->data).num) { q->data=e; return 0;//修改完成 } p=p->next; } return 1;//修改失敗 } int ChazhaoNode(LinkList l, int num,student &e)//查找節(jié)點(diǎn) { Node *p,*q; p=l; while(p->next) { q=p->next; if(num==(q->data).num) { e=q->data; return 0;//查找完成 } p=p->next; } return 1;//查找失敗 } void ZenjiaStudent(LinkList &l) //增加學(xué)生 { summ++; student e; printf("小黑子請(qǐng)輸入你想錄入IKUN的成績吧!\n") ; printf("學(xué)號(hào)\n"); scanf("%d",&e.num); //getchar(); printf("姓名\n"); scanf("%s",e.name); //getchar(); printf("專業(yè)\n"); scanf("%s",e.major); //getchar(); printf("數(shù)學(xué)成績\n"); scanf("%lf",&e.math); printf("英語成績\n"); scanf("%lf",&e.english); printf("IKUN樹脂分\n"); scanf("%lf",&e.shuzhi); e.average=(e.math+e.english+e.shuzhi)/3; e.sum=e.math+e.english+e.shuzhi; ZenjiaNode(l, e); system("pause"); } void ShanchuStudent(LinkList &l) //刪除學(xué)生 { summ--; int num; printf("請(qǐng)輸入要?jiǎng)h除的IKUN的學(xué)號(hào)\n"); scanf("%d",&num); if(ShanchuNode( l, num)==1) printf("查找失敗哎呦,你個(gè)黑子冒充IKUN,香翅撈飯食不食\n"); else { printf("刪除成功了,獎(jiǎng)勵(lì)一個(gè)蛋\n"); } system("pause"); } void XuigaiStudent(LinkList &l) //修改學(xué)生信息 { student e; int num; char x; printf("請(qǐng)輸入要修改IKUN的學(xué)號(hào)\n"); scanf("%d",&num); printf("請(qǐng)重新輸入信息吧\n"); printf("請(qǐng)輸入學(xué)號(hào)\n"); scanf("%d",&e.num); printf("請(qǐng)輸入姓名\n"); scanf("%s",e.name); printf("請(qǐng)輸入專業(yè)\n"); scanf("%s",e.major); printf("請(qǐng)輸入數(shù)學(xué)成績\n"); scanf("%lf",&e.math); printf("請(qǐng)輸入英語成績\n"); scanf("%lf",&e.english); printf("請(qǐng)輸入樹脂分\n"); scanf("%lf",&e.shuzhi); e.average=(e.math+e.english+e.shuzhi)/3; e.sum=e.math+e.english+e.shuzhi; if( XuigaiNode(l,num,e)==1) printf("未找到該IKUN\n"); else printf("修改完成\n"); system("pause"); } void ChazhaoStudent(LinkList l) //查找學(xué)生 { student e; int num; printf("請(qǐng)輸入要查找的IKUN學(xué)號(hào)\n"); scanf("%d",&num); if(ChazhaoNode( l, num,e)==1) printf("沒有找到哦\n"); else { printf("學(xué)號(hào) 姓名 專業(yè) 數(shù)學(xué)成績 英語成績 樹脂分 平均分 總分\n"); printf("%-8d%-8s%-8s%-11.2f%-11.2f%-10.2f%-10.2f%-10.2f\n",e.num,e.name,e.major,e.math,e.english,e.shuzhi,e.average,e.sum); system("pause"); } } void XianshiStudent(LinkList l) //顯示學(xué)生 { printf("學(xué)號(hào) 姓名 專業(yè) 數(shù)學(xué)成績 英語成績 樹脂分 平均分 總分\n"); Node *p=l; student e; while(p->next) { e=(p->next)->data; printf("%-8d%-8s%-8s%-11.2f%-11.2f%-10.2f%-10.2f%-10.2f\n",e.num,e.name,e.major,e.math,e.english,e.shuzhi,e.average,e.sum); p=p->next; }system("pause"); } void paixu(LinkList l)//總分排序 { student e; Node *p,*q; p=l->next; if(p->next==NULL) printf("請(qǐng)輸入IKUN之后再來吧\n"); else { while(p->next!=NULL) { q=p->next; while(q!=NULL) { if(p->data.average<q->data.average) { e=p->data; p->data=q->data; q->data=e; } q=q->next; } p=p->next; } printf("排序成功\n"); } system("pause"); } void math(LinkList l)//數(shù)學(xué)不及格 { Node *p; student e; p=l; while(p->next!=NULL) { e=(p->next)->data; if(e.math<60) { printf("數(shù)學(xué)不及格學(xué)員如下:\n"); printf("姓名:%s 成績:%.2f\n",e.name,e.math); } p=p->next; i++; } if(i==0&&summ!=0) { printf("所有人都及格了呢\n"); } else if(summ==0) printf("系統(tǒng)人數(shù)為0,請(qǐng)?zhí)砑有畔⒑笤僭嘰n"); system("pause"); } void english(LinkList l)//英語不及格 { Node *p; student e; p=l; while(p->next!=NULL) { e=(p->next)->data; if(e.english<60) { printf("英語不及格學(xué)員如下:\n"); printf("姓名:%s 成績:%.2f\n",e.name,e.english); j++; } p=p->next; } if(j==0&&summ!=0) { printf("所有人都及格了呢\n"); } else if(summ==0) printf("系統(tǒng)人數(shù)為0,請(qǐng)?zhí)砑有畔⒑笤僭嘰n"); system("pause"); } void shuzhi(LinkList l)//樹脂不及格 { Node *p; student e; p=l; while(p->next!=NULL) { e=(p->next)->data; if(e.shuzhi<60) { printf("樹脂不及格學(xué)員如下:\n"); printf("姓名:%s 成績:%.2f\n",e.name,e.shuzhi); k++; } p=p->next; } if(k==0&&summ!=0) { printf("所有人都及格了呢\n"); } else if(summ==0) printf("系統(tǒng)人數(shù)為0,請(qǐng)?zhí)砑有畔⒑笤僭嘰n"); system("pause"); } void mathmax(LinkList l) { Node *p,*q; double max; student e,f; p=l; q=p->next; e=(p->next)->data; max=e.math; while(q->next!=NULL) { f=(q->next)->data; if(f.math>max) max=f.math; q=q->next; } p=l; q=l->next; printf("數(shù)學(xué)最高分為:\n"); while(p->next!=NULL) { f=(p->next)->data; if(f.math==max) printf("學(xué)生:%s 成績:%lf\n",f.name,f.math); p=p->next; } if(summ==0) printf("系統(tǒng)人數(shù)為0,請(qǐng)?zhí)砑有畔⒑笤僭嘰n"); system("pause"); } void englishmax(LinkList l) { Node *p,*q; double max; student e,f; p=l; q=p->next; e=(p->next)->data; max=e.english; while(q->next!=NULL) { f=(q->next)->data; if(f.english>max) max=f.english; q=q->next; } p=l; q=l->next; printf("英語最高分為:\n"); while(p->next!=NULL) { f=(p->next)->data; if(f.english==max) printf("學(xué)生:%s 成績:%lf\n",f.name,f.english); p=p->next; } if(summ==0) printf("系統(tǒng)人數(shù)為0,請(qǐng)?zhí)砑有畔⒑笤僭嘰n"); system("pause"); } void shuzhimax(LinkList l) { Node *p,*q; double max; student e,f; p=l; q=p->next; e=(p->next)->data; max=e.shuzhi; while(q->next!=NULL) { f=(q->next)->data; if(f.shuzhi>max) max=f.shuzhi; q=q->next; } p=l; q=l->next; printf("樹脂最高分為:\n"); while(p->next!=NULL) { f=(p->next)->data; if(f.shuzhi==max) printf("學(xué)生:%s 成績:%lf\n",f.name,f.shuzhi); p=p->next; } if(summ==0) printf("系統(tǒng)人數(shù)為0,請(qǐng)?zhí)砑有畔⒑笤僭嘰n"); system("pause"); } void menu() { system("cls"); printf(" ***************IKUN成績管理系統(tǒng)***************\n"); printf(" \t** **\n"); printf(" \t** author:南工第一IKUN **\n"); printf(" \t** **\n"); printf(" ** 1.錄入新的IKUN的成績 **\n"); printf(" ** 2.按學(xué)號(hào)刪除IKUN的成績 **\n"); printf(" ** 3.按學(xué)號(hào)修改IKUN的成績 **\n"); printf(" ** 4.查找IKUN的成績 **\n"); printf(" ** 5.顯示IKUN們的成績 **\n"); printf(" \t** 6.根據(jù)總分排序 **\n"); printf(" \t** 7.顯示數(shù)學(xué)不及格的IKUN **\n"); printf(" \t** 8.顯示英語不及格的IKUN **\n"); printf(" \t** 9.顯示樹脂不及格的小黑子 **\n"); printf(" \t** 10.查看數(shù)學(xué)最高分 **\n"); printf(" \t** 11.查看英語最高分 **\n"); printf(" \t** 12.查看樹脂最高分 **\n"); //printf(" ** 13.退出登錄 **\n"); printf(" \t** 13.保存數(shù)據(jù)到文件 **\n"); printf(" \t** 14.從文件中讀取數(shù)據(jù) **\n"); printf(" \t** 15.插入一個(gè)新學(xué)生 **\n"); printf(" ** 16.退出登錄 **\n"); printf(" ** 0.退出成績管理系統(tǒng) **\n"); printf(" **********************************************\n"); printf(" 請(qǐng)輸入你想進(jìn)行的操作:0-13 \n"); } void xuigai2()//找回密碼之后登錄 { int mi=0; int caozuo=0; int zhang=0; int anns=0; while(1) { printf("請(qǐng)輸入你的賬號(hào)\n"); scanf("%d",&zhang); printf("請(qǐng)輸入你的密碼\n"); scanf("%d",&mi); if(mi==mima&&zhang==zhanghao) { choice = 1; printf("登錄成功!\n"); system("pause"); system("cls"); break; } else { system("cls"); anns++; if(anns<5) printf("賬號(hào)或密碼有誤,請(qǐng)重新輸入\n"); if(anns==5) printf("你干嘛哎呦,都錯(cuò)五次了,好好想想再來吧!\n"); } if(anns==5)break; } } void zhaohui()//找回密碼 { int guodu; int guodu2; int zhang;//輸入要找回密碼的賬號(hào) while(1) { printf("請(qǐng)輸入要找回密碼的賬號(hào)\n"); scanf("%d",&zhang); if(zhang==123456) { printf("請(qǐng)輸入更改后的密碼:"); scanf("%d",&guodu); printf("請(qǐng)?jiān)俅屋斎敫暮蟮拿艽a:"); scanf("%d",&guodu2); if(guodu==guodu2) { mima=guodu2; printf("修改成功,請(qǐng)登陸吧\n"); system("pause"); xuigai2(); break; } else { system("cls"); printf("兩次輸入不同,修改失敗,請(qǐng)重新輸入賬號(hào)\n"); } } else { system("cls"); printf("該賬號(hào)不存在,請(qǐng)重新輸入賬號(hào)\n"); } } } void charu(LinkList l) { Node *p,*y; int num2; printf("請(qǐng)輸入要插入的位置(誰之后)\n"); scanf("%d",&num2); p=l->next; while(p!=NULL) { if(num2==p->data.num) { y=p->next; summ++; student e; printf("小黑子請(qǐng)輸入你想錄入IKUN的成績吧!\n") ; printf("學(xué)號(hào)\n"); scanf("%d",&e.num); printf("姓名\n"); scanf("%s",e.name); printf("專業(yè)\n"); scanf("%s",e.major); printf("數(shù)學(xué)成績\n"); scanf("%lf",&e.math); printf("英語成績\n"); scanf("%lf",&e.english); printf("IKUN樹脂分\n"); scanf("%lf",&e.shuzhi); e.average=(e.math+e.english+e.shuzhi)/3; e.sum=e.math+e.english+e.shuzhi; Node*q=(LinkList)malloc(sizeof(Node)); q->data=e; q->next=y; p->next=q; printf("插入成功\n"); break; } else p=p->next; } if(p==NULL) printf("插入失敗\n"); system("pause"); } void guanli()//登錄界面 { int mi=0; int caozuo=0; int zhang=0; int anns=0; /*printf(" **********登錄界面**********\n"); printf(" ** 賬號(hào): **\n"); printf(" ** 密碼: **\n"); printf(" ** 輸入0找回密碼 **\n"); printf(" ****************************\n");*/ printf(" **********登錄界面**********\n"); printf(" ** 1管理員登錄1 **\n"); printf(" ** ovo **\n"); printf(" ** 0找回密碼0 **\n"); printf(" ****************************\n"); printf("請(qǐng)輸入想進(jìn)行的操作:0-1\n"); scanf("%d",&caozuo); if(caozuo==1) { while(1) { printf("請(qǐng)輸入你的賬號(hào)\n"); scanf("%d",&zhang); printf("請(qǐng)輸入你的密碼\n"); scanf("%d",&mi); if(mi==mima&&zhang==zhanghao) { choice = 1; printf("登錄成功!\n"); system("pause"); system("cls"); break; } else { system("cls"); anns++; if(anns<5) printf("賬號(hào)或密碼有誤,請(qǐng)重新輸入\n"); if(anns==5) printf("你干嘛哎呦,都錯(cuò)五次了,好好想想再來吧!\n"); } if(anns==5)break; } } else if(caozuo==0) { zhaohui(); } } void ReadFile(LinkList &l)//從文件中讀取數(shù)據(jù) { FILE *fp; fp=fopen("D:/b.txt","r"); if(fp==NULL) { printf("Can not open the file\n"); exit(1); } else { CreateList(l); student e; while(fscanf(fp,"%d %s %s %lf %lf %lf %lf %lf\n",&e.num,e.name,e.major,&e.math,&e.english,&e.shuzhi,&e.average,&e.sum)!=EOF) { ZenjiaNode(l,e); } printf("已成功讀取數(shù)據(jù)\n"); } system("pause"); fclose(fp); } void WriteFile(LinkList &l)//保存數(shù)據(jù)到文件 { FILE *fp ; fp = fopen("D:/b.txt", "w"); if(fp == NULL) { printf("Can not open the file\n"); exit(1); } Node *p = l->next; student e; while(p!=NULL ) { fprintf(fp,"%-8d ",p->data.num); fprintf(fp,"%-8s ",p->data.name); fprintf(fp,"%-8s ",p->data.major); fprintf(fp,"%-16lf ",p->data.math); fprintf(fp,"%-16lf ",p->data.english); fprintf(fp,"%-16lf ",p->data.shuzhi); fprintf(fp,"%-16lf ",p->data.average); fprintf(fp,"%-16lf ",p->data.sum); fprintf(fp,"\n"); p = p -> next; } printf("保存成功\n"); fclose(fp); system("pause"); } int main() { int x; LinkList l; CreateList(l); guanli(); while(choice) { menu(); scanf("%d", &choice); switch(choice) { case 1: ZenjiaStudent(l);//增加學(xué)生 break; case 2: ShanchuStudent(l); //刪除學(xué)生 break; case 3: XuigaiStudent(l);//修改學(xué)生 break; case 4: ChazhaoStudent(l);//查找學(xué)生 break; case 5: XianshiStudent(l); //顯示所有學(xué)生 break; case 6: paixu(l);//排序 break; case 7:math(l);//數(shù)學(xué)不及格 break; case 8:english(l);//英語不及格 break; case 9:shuzhi(l);//樹脂不及格 break; case 10:mathmax(l); break; case 11:englishmax(l); break; case 12:shuzhimax(l); break; case 13:WriteFile(l); break; case 14:ReadFile(l); break; case 15:charu(l); break; case 16:system("cls"); guanli(); break; default:printf("謝謝您的使用\n"); break; } } return 0; }
以上就是C語言利用鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于C語言學(xué)生成績管理系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(102.二叉樹層序遍歷)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(102.二叉樹層序遍歷),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07解析C語言中結(jié)構(gòu)體struct的對(duì)齊問題
這篇文章主要介紹了C語言中結(jié)構(gòu)體struct的對(duì)齊問題,作者深入到內(nèi)存分配方面來進(jìn)行解析,需要的朋友可以參考下2016-04-04C++ 中cerr和cout的區(qū)別實(shí)例詳解
這篇文章主要介紹了C++ 中cerr和cout的區(qū)別實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09C++?Boost?weak_ptr智能指針超詳細(xì)講解
智能指針是一種像指針的C++對(duì)象,但它能夠在對(duì)象不使用的時(shí)候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個(gè)2022-11-11C/C++產(chǎn)生隨機(jī)數(shù)函數(shù)簡單介紹
這篇文章主要為大家詳細(xì)介紹了C/C++產(chǎn)生隨機(jī)數(shù)函數(shù)的實(shí)現(xiàn)方法,如何使用C/C++產(chǎn)生隨機(jī)數(shù)函數(shù),感興趣的小伙伴們可以參考一下2016-04-04VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn)
這篇文章主要介紹了VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03