版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第C語言鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)目錄一、課程設(shè)計(jì)題目及內(nèi)容二、主要設(shè)計(jì)思路三、程序源碼及具體注釋(1)預(yù)處理指令(2)類型定義(3)函數(shù)原型(4)main函數(shù)定義(5)其他函數(shù)定義四、運(yùn)行示例五、注意事項(xiàng)本文實(shí)例為大家分享了C語言基于鏈表實(shí)現(xiàn)學(xué)生成績管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
一、課程設(shè)計(jì)題目及內(nèi)容
程序名稱:學(xué)生成績管理系統(tǒng)
功能要求:錄入學(xué)生成績,修改學(xué)生成績,統(tǒng)計(jì)每個(gè)學(xué)生的總分及平均分并能根據(jù)學(xué)生的平均成績排序,查詢學(xué)生成績,輸出學(xué)生成績單。能夠保存學(xué)生成績,實(shí)現(xiàn)文件的讀寫。界面簡潔大方,易操作。
二、主要設(shè)計(jì)思路
以鏈表作為數(shù)據(jù)結(jié)構(gòu)存儲學(xué)生成績等信息,然后圍繞鏈表編寫一堆函數(shù)來實(shí)現(xiàn)一堆功能
程序開始時(shí)會讀取文件數(shù)據(jù)到鏈表,結(jié)束時(shí)會把更新后的鏈表中的信息重新寫入到文件中,以實(shí)現(xiàn)數(shù)據(jù)的保存
三、程序源碼及具體注釋
(1)預(yù)處理指令
導(dǎo)入stdlib.h是因?yàn)闀玫絤alloc函數(shù)和free函數(shù)
導(dǎo)入string.h是因?yàn)闀玫絪trcmp函數(shù)
(2)類型定義
1.student類型定義
一個(gè)student變量代表一組學(xué)生信息
typedefstruct{
charname[NAME_LEN+1];//姓名
intnumber;
//學(xué)號
intchinese;
//語文
intmath;
//數(shù)學(xué)
intenglish;
//英語
intaverage;
//平均分
intsum;
//總分
}student;
//用于存儲單個(gè)學(xué)生的信息
2.studentNode類型定義
一個(gè)studentNode變量代表一個(gè)學(xué)生節(jié)點(diǎn)
typedefstructnode{
studentstu;
//數(shù)據(jù)域,存儲學(xué)生信息
structnode*next;
//指針域,指向下一個(gè)節(jié)點(diǎn)
}studentNode;
//學(xué)生節(jié)點(diǎn)
3.studentList類型定義
一個(gè)studentList變量代表一個(gè)學(xué)生鏈表
typedefstruct{
studentNode*head;
//頭指針
studentNode*tail;
//尾指針
intcount;
//學(xué)生節(jié)點(diǎn)總數(shù)
}studentList;
//學(xué)生鏈表
(3)函數(shù)原型
voidinitialize(studentList*L);//初始化鏈表,創(chuàng)建頭節(jié)點(diǎn)
voidenter(studentList*L);
//錄入鏈表
voiddisplay(studentList*L);
//輸出鏈表
voidfind(studentList*L);
//查找某節(jié)點(diǎn)
voidmodify(studentList*L);
//修改某節(jié)點(diǎn)
voidsort(studentList*L);
//降序重新建表并輸出
voidwrite(studentList*L);
//寫入文件,邊寫邊釋放空間
voidread(studentList*L);
//讀取文件,邊讀邊建表
(4)main函數(shù)定義
開頭會創(chuàng)建并初始化一個(gè)鏈表,然后把文件的信息讀到鏈表中
通過一個(gè)無限循環(huán)里面套一個(gè)switch來實(shí)現(xiàn)與用戶互動
結(jié)尾會把鏈表中的信息寫到文件中,然后銷毀鏈表
intmain(){
//互動界面
printf("
**************學(xué)生成績管理系統(tǒng)**************\n");
printf("
*
1.錄入新的學(xué)生成績
*\n");
printf("
*
2.按姓名修改學(xué)生成績
*\n");
printf("
*
3.按姓名查詢學(xué)生成績
*\n");
printf("
*
4.輸出全部學(xué)生的成績
*\n");
printf("
*
5.按平均分輸出學(xué)生成績
*\n");
printf("
*
6.退出學(xué)生成績管理系統(tǒng)
*\n");
printf("
********************************************\n");
printf("
\n");
//創(chuàng)建學(xué)生鏈表
studentList*L=(studentList*)malloc(sizeof(studentList));
//初始化學(xué)生鏈表
initialize(L);
//從文件里讀取數(shù)據(jù)到鏈表
read(L);
//互動界面是用一個(gè)無限循環(huán)和一個(gè)switch寫的
while(1){
intcode;
printf("請輸入你想進(jìn)行的操作對應(yīng)的數(shù)字:");
scanf("%d",code);
switch(code){
case1:
enter(L);
break;
case2:
modify(L);
break;
case3:
find(L);
break;
case4:
display(L);
break;
case5:
sort(L);
break;
case6:
write(L);
free(L-head);
//頭節(jié)點(diǎn)被銷毀
free(L);
//鏈表被銷毀
return0;
default:
printf("%d是無效的數(shù)字,請重新輸入!\n\n",code);
break;
}
}
return0;
}
(5)其他函數(shù)定義
1.initialize函數(shù)定義
接收一個(gè)鏈表指針作為參數(shù)
創(chuàng)建一個(gè)頭節(jié)點(diǎn),不存儲任何信息,讓鏈表的頭尾指針都指向它
鏈表的初始長度設(shè)為0
voidinitialize(studentList*L){
//創(chuàng)建頭節(jié)點(diǎn)
studentNode*s=(studentNode*)malloc(sizeof(studentNode));
s-next=NULL;
//初始化鏈表:
//頭尾指針均指向頭節(jié)點(diǎn),初始長度為零
L-head=s;
L-tail=s;
L-count=0;
}
2.enter函數(shù)定義
接收一個(gè)鏈表指針作為參數(shù)
讓用戶鍵入信息并存到新節(jié)點(diǎn)中
把新節(jié)點(diǎn)插進(jìn)鏈表中
voidenter(studentList*L){
//創(chuàng)建新節(jié)點(diǎn)
studentNode*s=(studentNode*)malloc(sizeof(studentNode));
//鍵入信息并存到新節(jié)點(diǎn)中
printf("請輸入學(xué)生姓名:");
scanf("%s",s-);
printf("請輸入學(xué)生學(xué)號:");
scanf("%d",s-stu.number);
printf("請輸入語文成績:");
scanf("%d",s-stu.chinese);
printf("請輸入數(shù)學(xué)成績:");
scanf("%d",s-stu.math);
printf("請輸入英語成績:");
scanf("%d",s-stu.english);
s-stu.sum=s-stu.chinese+s-stu.math+s-stu.english;
s-stu.average=s-stu.sum/3;
//若鏈表為空,將尾指針指向新節(jié)點(diǎn)
if(L-head==L-tail){
L-tail=s;
}
//將新節(jié)點(diǎn)插進(jìn)鏈表頭部(頭插法)
s-next=L-head-next;
L-head-next=s;
L-count++;
//輸出互動信息
printf("信息錄入成功!\n\n");
}
3.display函數(shù)定義
遍歷鏈表輸出就完事兒了
voiddisplay(studentList*L){
printf("共有%d組學(xué)生數(shù)據(jù):\n",L-count);
printf("姓名\t\t學(xué)號\t\t語文\t\t數(shù)學(xué)\t\t英語\t\t總分\t\t平均分\n");
//創(chuàng)建一節(jié)點(diǎn)指針指向頭節(jié)點(diǎn)
studentNode*p;
p=L-head;
//遍歷鏈表輸出
while(p-next){
p=p-next;
printf("%s",p-);
printf("\t\t%d",p-stu.number);
printf("\t\t%d",p-stu.chinese);
printf("\t\t%d",p-stu.math);
printf("\t\t%d",p-stu.english);
printf("\t\t%d",p-stu.sum);
printf("\t\t%d",p-stu.average);
printf("\n");
}
printf("\n");
}
4.find函數(shù)定義
voidfind(studentList*L){
//讓用戶輸入要查找的學(xué)生
printf("請輸入學(xué)生姓名:");
charname[NAME_LEN+1];
scanf("%s",name);
//遍歷鏈表對比名字
studentNode*p=L-head-next;
while(p){
//符合了就輸出并結(jié)束函數(shù)
if(strcmp(p-,name)==0){
printf("姓名\t\t學(xué)號\t\t語文\t\t數(shù)學(xué)\t\t英語\t\t總分\t\t平均分\n");
printf("%s",p-);
printf("\t\t%d",p-stu.number);
printf("\t\t%d",p-stu.chinese);
printf("\t\t%d",p-stu.math);
printf("\t\t%d",p-stu.english);
printf("\t\t%d",p-stu.sum);
printf("\t\t%d",p-stu.average);
printf("\n\n");
return;
}
//名字不符合就下一個(gè)
p=p-next;
}
//遍歷完里都沒找到這個(gè)名字
printf("沒找到這個(gè)%s的信息!\n\n",name);
}
5.modify函數(shù)定義
voidmodify(studentList*L){
//讓用戶輸入要修改的學(xué)生
printf("請輸入學(xué)生姓名:");
charname[NAME_LEN+1];
scanf("%s",name);
//遍歷鏈表對比名字
studentNode*p=L-head-next;
while(p){
//符合了就讓用戶重新鍵入并結(jié)束函數(shù)
if(strcmp(p-,name)==0){
printf("請重新輸入信息:\n");
printf("請輸入學(xué)生學(xué)號:");
scanf("%d",p-stu.number);
printf("請輸入語文成績:");
scanf("%d",p-stu.chinese);
printf("請輸入數(shù)學(xué)成績:");
scanf("%d",p-stu.math);
printf("請輸入英語成績:");
scanf("%d",p-stu.english);
p-stu.sum=p-stu.chinese+p-stu.math+p-stu.english;
p-stu.average=p-stu.sum/3;
printf("信息修改成功!\n\n");
return;
}
//名字不符合就下一個(gè)
p=p-next;
}
//遍歷完里都沒找到這個(gè)名字
printf("沒找到這個(gè)%s的信息!\n\n",name);
}
6.sort函數(shù)定義
voidsort(studentList*L){
//兩個(gè)節(jié)點(diǎn)都沒有排個(gè)屁序
if(L-count2){
printf("鏈表排序完成!\n");
display(L);
return;
}
//插入排序
studentNode*p,*pre,*tmp;
//p指向第二個(gè)學(xué)生節(jié)點(diǎn)
p=L-head-next;
//鏈表從頭節(jié)點(diǎn)和第一個(gè)學(xué)生節(jié)點(diǎn)處斷開
L-head-next=NULL;
//從第一個(gè)學(xué)生節(jié)點(diǎn)開始一直往后循環(huán)
while(p){
//存好下一個(gè)節(jié)點(diǎn)的指針
tmp=p-next;
//找到插入位置
pre=L-head;
while(pre-next!=NULLpre-next-stu.averagep-stu.average)
pre=pre-next;
//更新尾指針
if(pre-next==NULL){
L-tail=p;
}
//插入
p-next=pre-next;
pre-next=p;
//跳到下一個(gè)
p=tmp;
}
printf("鏈表排序完成!\n");
display(L);
}
7.write函數(shù)定義
此函數(shù)用于把鏈表中的信息保存到文件中并且銷毀所有節(jié)點(diǎn)(頭節(jié)點(diǎn)除外)
voidwrite(studentList*L){
//打開文件流
FILE*fp=fopen(FILE_NAME,"w");
if(fp==NULL){
printf("文件%s打開失敗\n",FILE_NAME);
exit(EXIT_FAILURE);
}
//將學(xué)生節(jié)點(diǎn)總數(shù)輸出在第一行
fprintf(fp,"%d\n",L-count);
//創(chuàng)建一節(jié)點(diǎn)指針指向頭節(jié)點(diǎn)
studentNode*p;
p=L-head-next;
//遍歷鏈表,一組數(shù)據(jù)作為一行輸出
while(p){
fprintf(fp,"%s",p-);
fprintf(fp,"%d",p-stu.number);
fprintf(fp,"%d",p-stu.chinese);
fprintf(fp,"%d",p-stu.math);
fprintf(fp,"%d",p-stu.english);
fprintf(fp,"%d",p-stu.sum);
fprintf(fp,"%d",p-stu.average);
fprintf(fp,"\n");
//輸出完成之后釋放節(jié)點(diǎn)空間
studentNode*next=p-next;
free(p);
p=next;
}
//關(guān)閉文件流
fclose(fp);
//互動信息
printf("數(shù)據(jù)已保存!謝謝使用,再見!\n");
}
8.read函數(shù)定義
此函數(shù)用于把文件中的信息讀取到鏈表中并且創(chuàng)建節(jié)點(diǎn)(頭節(jié)點(diǎn)除外)
voidread(studentList*L){
//打開文件流
F
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 外勤機(jī)械工安全生產(chǎn)意識競賽考核試卷含答案
- 成品礦運(yùn)送工崗前基礎(chǔ)操作考核試卷含答案
- 信息通信網(wǎng)絡(luò)線務(wù)員安全意識測試考核試卷含答案
- 抽紗挑編工保密能力考核試卷含答案
- 2025年中原科技學(xué)院馬克思主義基本原理概論期末考試模擬題附答案
- 2024年灤縣輔警招聘考試真題匯編附答案
- 2024年重慶工程職業(yè)技術(shù)學(xué)院輔導(dǎo)員招聘備考題庫附答案
- 2024年鄭州信息科技職業(yè)學(xué)院輔導(dǎo)員考試筆試真題匯編附答案
- 企業(yè)信息化安全防護(hù)與應(yīng)急處置實(shí)務(wù)操作手冊
- 2025四川省成都市公務(wù)員考試數(shù)量關(guān)系專項(xiàng)練習(xí)題及參考答案1套
- 中深度鎮(zhèn)靜紅外線全身熱療方法課件
- 第四單元地理信息技術(shù)的應(yīng)用課件 【高效課堂+精研精講】高中地理魯教版(2019)必修第一冊
- 魯科版高中化學(xué)必修一教案全冊
- 管理養(yǎng)老機(jī)構(gòu) 養(yǎng)老機(jī)構(gòu)的服務(wù)提供與管理
- 提高隧道初支平整度合格率
- 2022年環(huán)保標(biāo)記試題庫(含答案)
- 2023年版測量結(jié)果的計(jì)量溯源性要求
- 建筑能耗與碳排放研究報(bào)告
- GB 29415-2013耐火電纜槽盒
- 中國古代經(jīng)濟(jì)試題
- 真空采血管的分類及應(yīng)用及采血順序課件
評論
0/150
提交評論