C語言利用鏈表實現學生成績管理系統(tǒng)
鏈表是一種常見的基礎數據結構,結構體指針在這里得到了充分的利用。
鏈表可以動態(tài)的進行存儲分配,也就是說,鏈表是一個功能極為強大的數組,他可以在節(jié)點中定義多種數據類型,還可以根據需要隨意增添,刪除,插入節(jié)點。
鏈表都有一個頭指針,一般以head來表示,存放的是一個地址。鏈表中的節(jié)點分為兩類,頭結點和一般節(jié)點,頭結點是沒有數據域的。鏈表中每個節(jié)點都分為兩部分,一個數據域,一個是指針域。
說到這里你應該就明白了,鏈表就如同車鏈子一樣,head指向第一個元素:第一個元素又指向第二個元素;……,直到最后一個元素,該元素不再指向其它元素,它稱為“表尾”,它的地址部分放一個“NULL”(表示“空地址”),鏈表到此結束。
作為有強大功能的鏈表,對他的操作當然有許多,比如:鏈表的創(chuàng)建,修改,刪除,插入,輸出,排序,反序,清空鏈表的元素,求鏈表的長度等等。
本文就將利用C語言中的鏈表實現一個簡單的學生成績管理系統(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;//學生總數 int i=0,j=0,k=0;//數學英語樹脂不及格的人數 using namespace std; typedef struct STUDENT { int num; //學號 char name[15]; //姓名 char major[15]; //專業(yè) double math; //數學成績 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é)點 int ShanchuNode(LinkList &l, int num); //刪除節(jié)點 int XuigaiNode(LinkList &l, int num, student e); //修改節(jié)點 int Chazhao(LinkList l, int num, student &e); //查找節(jié)點 void ZenjiaStudent(LinkList &l); //增加學生 void ShanchuStudent(LinkList &l); //刪除學生 void XuigaiStudent(LinkList &l); //修改學生 void ChazhaoStudent(LinkList l); //查找學生 void XianshiStudent(LinkList l); //顯示學生 void menu(); //主菜單 void math(); void english(); void shuzhi(); void mathmax(); void englishmax(); void shuzhimax(); void CreateList(LinkList &l)//創(chuàng)建鏈表,頭節(jié)點 { l=(LinkList)malloc(sizeof(Node)); l->next=NULL; } void ZenjiaNode(LinkList &l, student e)//尾插節(jié)點 { 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é)點 { 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é)點 { 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é)點 { 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) //增加學生 { summ++; student e; printf("小黑子請輸入你想錄入IKUN的成績吧!\n") ; printf("學號\n"); scanf("%d",&e.num); //getchar(); printf("姓名\n"); scanf("%s",e.name); //getchar(); printf("專業(yè)\n"); scanf("%s",e.major); //getchar(); printf("數學成績\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) //刪除學生 { summ--; int num; printf("請輸入要刪除的IKUN的學號\n"); scanf("%d",&num); if(ShanchuNode( l, num)==1) printf("查找失敗哎呦,你個黑子冒充IKUN,香翅撈飯食不食\n"); else { printf("刪除成功了,獎勵一個蛋\n"); } system("pause"); } void XuigaiStudent(LinkList &l) //修改學生信息 { student e; int num; char x; printf("請輸入要修改IKUN的學號\n"); scanf("%d",&num); printf("請重新輸入信息吧\n"); printf("請輸入學號\n"); scanf("%d",&e.num); printf("請輸入姓名\n"); scanf("%s",e.name); printf("請輸入專業(yè)\n"); scanf("%s",e.major); printf("請輸入數學成績\n"); scanf("%lf",&e.math); printf("請輸入英語成績\n"); scanf("%lf",&e.english); printf("請輸入樹脂分\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) //查找學生 { student e; int num; printf("請輸入要查找的IKUN學號\n"); scanf("%d",&num); if(ChazhaoNode( l, num,e)==1) printf("沒有找到哦\n"); else { printf("學號 姓名 專業(yè) 數學成績 英語成績 樹脂分 平均分 總分\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) //顯示學生 { printf("學號 姓名 專業(yè) 數學成績 英語成績 樹脂分 平均分 總分\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("請輸入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)//數學不及格 { Node *p; student e; p=l; while(p->next!=NULL) { e=(p->next)->data; if(e.math<60) { printf("數學不及格學員如下:\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)人數為0,請?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("英語不及格學員如下:\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)人數為0,請?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("樹脂不及格學員如下:\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)人數為0,請?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("數學最高分為:\n"); while(p->next!=NULL) { f=(p->next)->data; if(f.math==max) printf("學生:%s 成績:%lf\n",f.name,f.math); p=p->next; } if(summ==0) printf("系統(tǒng)人數為0,請?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("學生:%s 成績:%lf\n",f.name,f.english); p=p->next; } if(summ==0) printf("系統(tǒng)人數為0,請?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("學生:%s 成績:%lf\n",f.name,f.shuzhi); p=p->next; } if(summ==0) printf("系統(tǒng)人數為0,請?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.按學號刪除IKUN的成績 **\n"); printf(" ** 3.按學號修改IKUN的成績 **\n"); printf(" ** 4.查找IKUN的成績 **\n"); printf(" ** 5.顯示IKUN們的成績 **\n"); printf(" \t** 6.根據總分排序 **\n"); printf(" \t** 7.顯示數學不及格的IKUN **\n"); printf(" \t** 8.顯示英語不及格的IKUN **\n"); printf(" \t** 9.顯示樹脂不及格的小黑子 **\n"); printf(" \t** 10.查看數學最高分 **\n"); printf(" \t** 11.查看英語最高分 **\n"); printf(" \t** 12.查看樹脂最高分 **\n"); //printf(" ** 13.退出登錄 **\n"); printf(" \t** 13.保存數據到文件 **\n"); printf(" \t** 14.從文件中讀取數據 **\n"); printf(" \t** 15.插入一個新學生 **\n"); printf(" ** 16.退出登錄 **\n"); printf(" ** 0.退出成績管理系統(tǒng) **\n"); printf(" **********************************************\n"); printf(" 請輸入你想進行的操作:0-13 \n"); } void xuigai2()//找回密碼之后登錄 { int mi=0; int caozuo=0; int zhang=0; int anns=0; while(1) { printf("請輸入你的賬號\n"); scanf("%d",&zhang); printf("請輸入你的密碼\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("賬號或密碼有誤,請重新輸入\n"); if(anns==5) printf("你干嘛哎呦,都錯五次了,好好想想再來吧!\n"); } if(anns==5)break; } } void zhaohui()//找回密碼 { int guodu; int guodu2; int zhang;//輸入要找回密碼的賬號 while(1) { printf("請輸入要找回密碼的賬號\n"); scanf("%d",&zhang); if(zhang==123456) { printf("請輸入更改后的密碼:"); scanf("%d",&guodu); printf("請再次輸入更改后的密碼:"); scanf("%d",&guodu2); if(guodu==guodu2) { mima=guodu2; printf("修改成功,請登陸吧\n"); system("pause"); xuigai2(); break; } else { system("cls"); printf("兩次輸入不同,修改失敗,請重新輸入賬號\n"); } } else { system("cls"); printf("該賬號不存在,請重新輸入賬號\n"); } } } void charu(LinkList l) { Node *p,*y; int num2; printf("請輸入要插入的位置(誰之后)\n"); scanf("%d",&num2); p=l->next; while(p!=NULL) { if(num2==p->data.num) { y=p->next; summ++; student e; printf("小黑子請輸入你想錄入IKUN的成績吧!\n") ; printf("學號\n"); scanf("%d",&e.num); printf("姓名\n"); scanf("%s",e.name); printf("專業(yè)\n"); scanf("%s",e.major); printf("數學成績\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(" ** 賬號: **\n"); printf(" ** 密碼: **\n"); printf(" ** 輸入0找回密碼 **\n"); printf(" ****************************\n");*/ printf(" **********登錄界面**********\n"); printf(" ** 1管理員登錄1 **\n"); printf(" ** ovo **\n"); printf(" ** 0找回密碼0 **\n"); printf(" ****************************\n"); printf("請輸入想進行的操作:0-1\n"); scanf("%d",&caozuo); if(caozuo==1) { while(1) { printf("請輸入你的賬號\n"); scanf("%d",&zhang); printf("請輸入你的密碼\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("賬號或密碼有誤,請重新輸入\n"); if(anns==5) printf("你干嘛哎呦,都錯五次了,好好想想再來吧!\n"); } if(anns==5)break; } } else if(caozuo==0) { zhaohui(); } } void ReadFile(LinkList &l)//從文件中讀取數據 { 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("已成功讀取數據\n"); } system("pause"); fclose(fp); } void WriteFile(LinkList &l)//保存數據到文件 { 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);//增加學生 break; case 2: ShanchuStudent(l); //刪除學生 break; case 3: XuigaiStudent(l);//修改學生 break; case 4: ChazhaoStudent(l);//查找學生 break; case 5: XianshiStudent(l); //顯示所有學生 break; case 6: paixu(l);//排序 break; case 7:math(l);//數學不及格 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語言利用鏈表實現學生成績管理系統(tǒng)的詳細內容,更多關于C語言學生成績管理系統(tǒng)的資料請關注腳本之家其它相關文章!
相關文章
VS2019 更新MSDN并創(chuàng)建快捷方式的實現
這篇文章主要介紹了VS2019 更新MSDN并創(chuàng)建快捷方式的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03