C語言鏈表實現(xiàn)學(xué)生成績管理系統(tǒng)_第1頁
C語言鏈表實現(xiàn)學(xué)生成績管理系統(tǒng)_第2頁
C語言鏈表實現(xiàn)學(xué)生成績管理系統(tǒng)_第3頁
C語言鏈表實現(xiàn)學(xué)生成績管理系統(tǒng)_第4頁
C語言鏈表實現(xiàn)學(xué)生成績管理系統(tǒng)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論