




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第C語言鏈表實現(xiàn)學(xué)生成績管理系統(tǒng)目錄一、課程設(shè)計題目及內(nèi)容二、主要設(shè)計思路三、程序源碼及具體注釋(1)預(yù)處理指令(2)類型定義(3)函數(shù)原型(4)main函數(shù)定義(5)其他函數(shù)定義四、運行示例五、注意事項本文實例為大家分享了C語言基于鏈表實現(xiàn)學(xué)生成績管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
一、課程設(shè)計題目及內(nèi)容
程序名稱:學(xué)生成績管理系統(tǒng)
功能要求:錄入學(xué)生成績,修改學(xué)生成績,統(tǒng)計每個學(xué)生的總分及平均分并能根據(jù)學(xué)生的平均成績排序,查詢學(xué)生成績,輸出學(xué)生成績單。能夠保存學(xué)生成績,實現(xiàn)文件的讀寫。界面簡潔大方,易操作。
二、主要設(shè)計思路
以鏈表作為數(shù)據(jù)結(jié)構(gòu)存儲學(xué)生成績等信息,然后圍繞鏈表編寫一堆函數(shù)來實現(xiàn)一堆功能
程序開始時會讀取文件數(shù)據(jù)到鏈表,結(jié)束時會把更新后的鏈表中的信息重新寫入到文件中,以實現(xiàn)數(shù)據(jù)的保存
三、程序源碼及具體注釋
(1)預(yù)處理指令
導(dǎo)入stdlib.h是因為會用到malloc函數(shù)和free函數(shù)
導(dǎo)入string.h是因為會用到strcmp函數(shù)
(2)類型定義
1.student類型定義
一個student變量代表一組學(xué)生信息
typedefstruct{
charname[NAME_LEN+1];//姓名
intnumber;
//學(xué)號
intchinese;
//語文
intmath;
//數(shù)學(xué)
intenglish;
//英語
intaverage;
//平均分
intsum;
//總分
}student;
//用于存儲單個學(xué)生的信息
2.studentNode類型定義
一個studentNode變量代表一個學(xué)生節(jié)點
typedefstructnode{
studentstu;
//數(shù)據(jù)域,存儲學(xué)生信息
structnode*next;
//指針域,指向下一個節(jié)點
}studentNode;
//學(xué)生節(jié)點
3.studentList類型定義
一個studentList變量代表一個學(xué)生鏈表
typedefstruct{
studentNode*head;
//頭指針
studentNode*tail;
//尾指針
intcount;
//學(xué)生節(jié)點總數(shù)
}studentList;
//學(xué)生鏈表
(3)函數(shù)原型
voidinitialize(studentList*L);//初始化鏈表,創(chuàng)建頭節(jié)點
voidenter(studentList*L);
//錄入鏈表
voiddisplay(studentList*L);
//輸出鏈表
voidfind(studentList*L);
//查找某節(jié)點
voidmodify(studentList*L);
//修改某節(jié)點
voidsort(studentList*L);
//降序重新建表并輸出
voidwrite(studentList*L);
//寫入文件,邊寫邊釋放空間
voidread(studentList*L);
//讀取文件,邊讀邊建表
(4)main函數(shù)定義
開頭會創(chuàng)建并初始化一個鏈表,然后把文件的信息讀到鏈表中
通過一個無限循環(huán)里面套一個switch來實現(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);
//互動界面是用一個無限循環(huán)和一個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é)點被銷毀
free(L);
//鏈表被銷毀
return0;
default:
printf("%d是無效的數(shù)字,請重新輸入!\n\n",code);
break;
}
}
return0;
}
(5)其他函數(shù)定義
1.initialize函數(shù)定義
接收一個鏈表指針作為參數(shù)
創(chuàng)建一個頭節(jié)點,不存儲任何信息,讓鏈表的頭尾指針都指向它
鏈表的初始長度設(shè)為0
voidinitialize(studentList*L){
//創(chuàng)建頭節(jié)點
studentNode*s=(studentNode*)malloc(sizeof(studentNode));
s-next=NULL;
//初始化鏈表:
//頭尾指針均指向頭節(jié)點,初始長度為零
L-head=s;
L-tail=s;
L-count=0;
}
2.enter函數(shù)定義
接收一個鏈表指針作為參數(shù)
讓用戶鍵入信息并存到新節(jié)點中
把新節(jié)點插進(jìn)鏈表中
voidenter(studentList*L){
//創(chuàng)建新節(jié)點
studentNode*s=(studentNode*)malloc(sizeof(studentNode));
//鍵入信息并存到新節(jié)點中
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é)點
if(L-head==L-tail){
L-tail=s;
}
//將新節(jié)點插進(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é)點指針指向頭節(jié)點
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;
}
//名字不符合就下一個
p=p-next;
}
//遍歷完里都沒找到這個名字
printf("沒找到這個%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;
}
//名字不符合就下一個
p=p-next;
}
//遍歷完里都沒找到這個名字
printf("沒找到這個%s的信息!\n\n",name);
}
6.sort函數(shù)定義
voidsort(studentList*L){
//兩個節(jié)點都沒有排個屁序
if(L-count2){
printf("鏈表排序完成!\n");
display(L);
return;
}
//插入排序
studentNode*p,*pre,*tmp;
//p指向第二個學(xué)生節(jié)點
p=L-head-next;
//鏈表從頭節(jié)點和第一個學(xué)生節(jié)點處斷開
L-head-next=NULL;
//從第一個學(xué)生節(jié)點開始一直往后循環(huán)
while(p){
//存好下一個節(jié)點的指針
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;
//跳到下一個
p=tmp;
}
printf("鏈表排序完成!\n");
display(L);
}
7.write函數(shù)定義
此函數(shù)用于把鏈表中的信息保存到文件中并且銷毀所有節(jié)點(頭節(jié)點除外)
voidwrite(studentList*L){
//打開文件流
FILE*fp=fopen(FILE_NAME,"w");
if(fp==NULL){
printf("文件%s打開失敗\n",FILE_NAME);
exit(EXIT_FAILURE);
}
//將學(xué)生節(jié)點總數(shù)輸出在第一行
fprintf(fp,"%d\n",L-count);
//創(chuàng)建一節(jié)點指針指向頭節(jié)點
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é)點空間
studentNode*next=p-next;
free(p);
p=next;
}
//關(guān)閉文件流
fclose(fp);
//互動信息
printf("數(shù)據(jù)已保存!謝謝使用,再見!\n");
}
8.read函數(shù)定義
此函數(shù)用于把文件中的信息讀取到鏈表中并且創(chuàng)建節(jié)點(頭節(jié)點除外)
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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 極限運動體驗營行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 水粉水彩畫創(chuàng)作在線平臺行業(yè)跨境出海項目商業(yè)計劃書
- 2025至2031年中國微處理雙顯示RS-485表行業(yè)投資前景及策略咨詢研究報告
- 海報與宣傳冊設(shè)計企業(yè)制定與實施新質(zhì)生產(chǎn)力項目商業(yè)計劃書
- 北京房地產(chǎn)AI應(yīng)用行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 演講與口才提升行業(yè)跨境出海項目商業(yè)計劃書
- 2025至2031年中國國際貨代管理系統(tǒng)行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國衛(wèi)星式油氣潤滑系統(tǒng)行業(yè)投資前景及策略咨詢研究報告
- 模擬面試實戰(zhàn)演練行業(yè)深度調(diào)研及發(fā)展項目商業(yè)計劃書
- 大密紋唱片AI應(yīng)用行業(yè)跨境出海項目商業(yè)計劃書
- 2024年安徽省高考物理試卷真題(含答案解析)
- 2023年燕舞集團(tuán)有限公司招聘筆試模擬試題及答案解析
- 電機(jī)檢測報告
- 上市合作合同協(xié)議書范本-IPO
- 最新消毒記錄表每日消毒表
- 自發(fā)冠脈夾層診療指南解讀
- 《一滴水經(jīng)過麗江》的課件
- 三級醫(yī)院服務(wù)能力指南2022
- 家庭室內(nèi)裝飾裝修工程驗收單
- 物流招標(biāo)文件模板(完整版)
- 電梯困人救援流程圖
評論
0/150
提交評論