C語言程序設(shè)計(jì)——學(xué)生信息管理系統(tǒng)講課稿_第1頁
C語言程序設(shè)計(jì)——學(xué)生信息管理系統(tǒng)講課稿_第2頁
C語言程序設(shè)計(jì)——學(xué)生信息管理系統(tǒng)講課稿_第3頁
C語言程序設(shè)計(jì)——學(xué)生信息管理系統(tǒng)講課稿_第4頁
C語言程序設(shè)計(jì)——學(xué)生信息管理系統(tǒng)講課稿_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。C語言程序設(shè)計(jì)學(xué)生信息管理系統(tǒng)-C語言課程設(shè)計(jì)姓名:徐宗博學(xué)號(hào):*班級(jí):061092指導(dǎo)教師:曹老師2011年6月25日目錄第一章:實(shí)習(xí)內(nèi)容1.1實(shí)習(xí)內(nèi)容簡介(2)1.2程序代號(hào)說明(3)第二章:程序流程圖第三章:函數(shù)模塊介紹3.1讀取文件、存儲(chǔ)文件(6)3.2管理系統(tǒng)模塊(8)3.3恢復(fù)區(qū)系統(tǒng)模塊(12)3.4功能展示(12)第四章:實(shí)習(xí)總結(jié)(16)第五章:實(shí)習(xí)體會(huì)(17)附錄:參考文獻(xiàn)(19)源代碼(19)第一章:實(shí)習(xí)內(nèi)容1.1實(shí)習(xí)內(nèi)容簡介題目:學(xué)生通訊錄管理系統(tǒng)要求:1.可實(shí)現(xiàn)信息的添加、刪除,可

2、按學(xué)號(hào)、姓名查詢;2.學(xué)生信息必須包含學(xué)號(hào)、姓名、學(xué)院、專業(yè)、籍貫。地址、電話號(hào)碼;3.必須有注釋。日期:2011年6月20日至27日,共8個(gè)半天。地點(diǎn):信息樓301指導(dǎo)老師:曹雪蓮?fù)瓿汕闆r:程序可完成信息的添加,可按學(xué)號(hào)、姓名分別查詢;程序可按姓名、學(xué)號(hào)分別刪除,并在刪除前顯示刪除學(xué)生的全部信息;按姓名刪除,若出現(xiàn)同名情況,會(huì)依次出現(xiàn)系統(tǒng)提示是否刪除,可選擇刪除或跳過;在程序文件夾中有一“學(xué)生信息庫”的txt文件,可查看學(xué)生系統(tǒng)里全部學(xué)生信息;設(shè)置有一個(gè)恢復(fù)區(qū)系統(tǒng),可輸出、查詢刪除的信息,并在可同文件夾中“刪除信息庫”的txt文件中查看刪除信息;總體結(jié)構(gòu)如下:1.2程序代號(hào)說明代號(hào)說明結(jié)構(gòu)體

3、student結(jié)構(gòu)體stu全局變量num學(xué)號(hào)inf學(xué)生信息,包含左結(jié)構(gòu)體student全部信息n鏈表節(jié)點(diǎn)數(shù)量name姓名next本類型結(jié)構(gòu)體指針rhead恢復(fù)區(qū)鏈表頭指針academy學(xué)院searchnum目標(biāo)個(gè)數(shù)major專業(yè)province省份address地址phone電話號(hào)碼函數(shù)add增加delet刪除(按姓名或?qū)W號(hào))search查找search_num搜索學(xué)號(hào)search_name搜索姓名print輸出鏈表上信息print1輸出鏈表上單個(gè)節(jié)點(diǎn)的信息save以二進(jìn)制格式儲(chǔ)存數(shù)據(jù)txtsave以文本格式儲(chǔ)存數(shù)據(jù)crete從二進(jìn)制文件中讀取信息,建立鏈表deletinput將刪除信息導(dǎo)入恢

4、復(fù)區(qū)鏈表system管理系統(tǒng)主要程序recover恢復(fù)區(qū)系統(tǒng)主要程序此外,局部變量的含義比較固定:head鏈表頭指針,若與rhead一同出現(xiàn)則代表管理系統(tǒng)鏈表頭指針select、input為選擇的值filename文件名第二章:程序流程圖程序流程圖:本次實(shí)習(xí)我的思路就是,先從二進(jìn)制文件中讀取信息,形成鏈表,對(duì)鏈表進(jìn)行基本操作,如輸出、添加、刪除、查找。程序結(jié)束時(shí)將鏈表保存在二進(jìn)制文件和文本文件中。管理系統(tǒng)流程圖:運(yùn)行管理系統(tǒng)部分時(shí),先從文件“information.xls”中讀取數(shù)據(jù)(若無該文件則創(chuàng)建文件),構(gòu)建鏈表;后續(xù)操作都是對(duì)于鏈表進(jìn)行操作,如添加、查找、刪除、輸出等;離開該部分時(shí)則保存

5、鏈表里的信息到已存在的“information.xls”,并以ASCII形式存儲(chǔ)至“學(xué)生信息庫.txt”,方便檢查。恢復(fù)區(qū)系統(tǒng)流程圖:恢復(fù)區(qū)系統(tǒng)思路與管理系統(tǒng)思路類似,連函數(shù)調(diào)用都是一樣的,二進(jìn)制文件名為“dinformation.xls”,文本文件名為“刪除信息庫.txt”。具體函數(shù)模塊功能將在第三章中具體介紹。第三章:函數(shù)模塊介紹程序分為管理系統(tǒng)和恢復(fù)區(qū)系統(tǒng)兩部分和讀取文件、存儲(chǔ)文件四部分,以下分別介紹。3.1讀取文件、存儲(chǔ)文件讀取文件該函數(shù)模塊(程序名為creat)于管理系統(tǒng)或恢復(fù)區(qū)系統(tǒng)運(yùn)行前運(yùn)行,目的是讀取二進(jìn)制文件信息,構(gòu)建鏈表;若無目標(biāo)文件,則創(chuàng)建文件。返回值為頭指針。函數(shù)主體為:

6、structstu*p1,*p2;structstu*head;while(fread(&(p1-inf),LEN,1,fp)/讀取數(shù)據(jù)n=n+1;/若讀取數(shù)據(jù)成功節(jié)點(diǎn)數(shù)加一if(n=1)head=p1;/給頭結(jié)點(diǎn)賦值elsep2-next=p1;/加新的結(jié)構(gòu)體p2=p1;p1=(structstu*)malloc(LENS);fclose(fp);p2-next=NULL;/尾結(jié)點(diǎn)處指針置0return(head);存儲(chǔ)文件該函數(shù)模塊分為兩部分,以二進(jìn)制形式存儲(chǔ)鏈表信息(程序名為save)和以文本形式存儲(chǔ)(程序名為txtsave)。二進(jìn)制形式文件是為了讀取文件,優(yōu)點(diǎn)是快速;文本文件是為了方便

7、檢查,優(yōu)點(diǎn)是明確可見。無返回值。二進(jìn)制形式存儲(chǔ)程序?yàn)椋簐oidsave(structstu*head,charfilename20)/存儲(chǔ)鏈表信息FILE*fp;structstu*p;p=head;fp=fopen(filename,wb);/以二進(jìn)制方式打開文件while(p!=NULL)&fwrite(&(p-inf),LEN,1,fp)/寫入文件p=p-next;fclose(fp);/其中head為鏈表頭指針,filename為存儲(chǔ)文件名,在主函數(shù)中已有定義。存儲(chǔ)在文本文件程序?yàn)椋簐oidtxtsave(structstu*head,charfilename20)/以文本形式將鏈表輸

8、入文件FILE*fp;structstu*p;p=head;fp=fopen(filename,w);/以文本形式打開while(p!=NULL)/鏈表不到盡頭不停止fprintf(fp,%ld,(p-inf).num);/向文本文件中寫入數(shù)據(jù)fprintf(fp,%10s,(p-inf).name);fprintf(fp,%10s,(p-inf).academy);fprintf(fp,%10s,(p-inf).majoy);fprintf(fp,%10s,(p-inf).province);fprintf(fp,%10s,(p-inf).address);fprintf(fp,%20sn,

9、(p-inf).phone);p=p-next;3.2管理系統(tǒng)模塊管理系統(tǒng)(名為system)主要有四個(gè)函數(shù)功能部分,分別為添加、刪除、查找、輸出,以下依次介紹:添加該模塊函數(shù)名為add,無返回值,參數(shù)為鏈表頭指針,功能為向已建立的鏈表中從鍵盤上輸入信息。函數(shù)主體為:structstu*p1,*p2;/建立結(jié)構(gòu)體指針p2=head;p1=(structstu*)malloc(LENS);/輸入信息printf(n學(xué)號(hào)(輸入數(shù)值請小于32756):);scanf(%d,&(p1-inf).num);printf(n姓名:);scanf(%s,(p1-inf).name);printf(n學(xué)院:)

10、;scanf(%s,(p1-inf).academy);printf(n專業(yè):);scanf(%s,(p1-inf).majoy);printf(n省份:);scanf(%s,(p1-inf).province);printf(n地址:);scanf(%s,(p1-inf).address);printf(n電話號(hào)碼:);scanf(%s,(p1-inf).phone);while(p2-next)!=NULL)/移動(dòng)指針到鏈表尾p2=p2-next;p2-next=p1;/移動(dòng)指針p2=p1;p2-next=NULL;刪除函數(shù)名為delet,返回值為指向結(jié)構(gòu)體的鏈表頭指針,參數(shù)為鏈表頭指針,

11、可按姓名和學(xué)號(hào)刪除。若按姓名刪除時(shí),為防止同名情況,則查詢到一個(gè)目標(biāo),就顯示出信息,并提示是否刪除。1.按學(xué)號(hào)查找的函數(shù)主體為:printf(請輸入擬刪除學(xué)生學(xué)號(hào):n);longsnum=0;scanf(%ld,&snum);structstu*p1,*p2;p1=head;while(snum!=p1-inf.num&p1-next!=NULL)/p1指向的學(xué)號(hào)不是要找的節(jié)點(diǎn),并且后面還有節(jié)點(diǎn)p2=p1;p1=p1-next;/p1后移if(snum=p1-inf.num)/找到目標(biāo)print1(p1);deletinput(p1);/print1()為輸出相應(yīng)指針指向的節(jié)點(diǎn)信息deleti

12、nput()為向恢復(fù)區(qū)系統(tǒng)鏈表輸入信息的函數(shù),在后續(xù)3.3中會(huì)提及if(p1=head)head=p1-next;/若p1指向頭節(jié)點(diǎn),將第二個(gè)節(jié)點(diǎn)位置賦予headelsep2-next=p1-next;/否則將下一結(jié)點(diǎn)位置賦給前一節(jié)點(diǎn)位置n-;elseprintf(該學(xué)生不存在);return(head);2.按姓名查找(包含同名情況):intselect=0,count=0;/selet選擇刪除與否,count代表刪除次數(shù)charsname20;/定義要搜的名字structstu*p1,*p2;p1=head,p2=head;printf(請輸入學(xué)生姓名:n);scanf(%s,sname)

13、;/輸入學(xué)號(hào)while(p1!=NULL)/歷遍鏈表if(strcmp(sname,p1-)=0)/與目標(biāo)名字是否一致,相同為0print1(p1);/若符合姓名條件,顯示信息printf(刪除該生信息?n刪除選1n按其它鍵不刪除n);/保證達(dá)到目標(biāo)姓名時(shí)顯示學(xué)生信息,可選擇不刪除scanf(%d,&select);if(select!=1)p2=p1;p1=p1-next;continue;/不刪除就再次循環(huán)elsen-;deletinput(p1);count+;/刪除數(shù)加一if(p1=head)head=p1-next;/刪除信息elsep2-next=p1-next;/更改指針,繞過目

14、標(biāo)p2=p1;p1=p1-next;if(count=0)printf(該生信息不存在);/若未刪除則視為未發(fā)現(xiàn)目標(biāo)學(xué)生return(head);查找函數(shù)名為search,參數(shù)為鏈表頭指針,無返回值。其中查找可按姓名與學(xué)號(hào)進(jìn)行查找,若找到目標(biāo)即出現(xiàn)在屏幕;若出現(xiàn)同名情況,則依次顯示。查找與刪除函數(shù)語句類似,但是刪除要求目標(biāo)的前一個(gè)節(jié)點(diǎn)的指針與目標(biāo)節(jié)點(diǎn)的指針都能知道;而查找要求則低多了。因?yàn)檫@個(gè)原因,在加上我是先寫的查找,所以刪除中未調(diào)用查找函數(shù)。按學(xué)號(hào)查找函數(shù)主體如下:longsnum;/定義要查詢學(xué)號(hào)變量printf(請輸入學(xué)號(hào):n);scanf(%ld,&snum);/輸入學(xué)號(hào)while(

15、p!=NULL)/歷遍鏈表p=search_num(p,snum);/此為調(diào)用函數(shù),效果是查找到與目標(biāo)相同的信息然后返回相應(yīng)指針if(p!=NULL)print1(p);/若查找到目標(biāo),輸出elsebreak;p=p-next;/傳遞指針,繼續(xù)按姓名查找函數(shù)主體如下:charsname20;/定義要查詢姓名的變量printf(請輸入姓名:n);scanf(%s,sname);/輸入姓名while(p!=NULL)p=search_name(p,sname);/與上文中search_num類似,返回同名目標(biāo)的指針if(p!=NULL)print1(p);/若查找到目標(biāo),輸出elsebreak;p

16、=p-next;/傳遞指針輸出函數(shù)名為print,參數(shù)為鏈表頭指針head,無返回值。函數(shù)作用就是沿鏈表依次輸出學(xué)生信息。函數(shù)主體為:printf(全體學(xué)生數(shù)據(jù)如下:n);if(n=0)printf(無學(xué)生信息);return;/若節(jié)點(diǎn)為0則返回structstu*p;p=head;while(p!=NULL)/循環(huán)輸出printf(n學(xué)號(hào)%d,(p-inf).num);printf(n姓名%s,(p-inf).name);printf(n學(xué)院%s,(p-inf).academy);printf(n專業(yè)%s,(p-inf).majoy);printf(n省份%s,(p-inf).provinc

17、e);printf(n地址%s,(p-inf).address);printf(n電話號(hào)碼%sn,(p-inf).phone);p=p-next;3.3恢復(fù)區(qū)系統(tǒng)模塊恢復(fù)區(qū)系統(tǒng)(其名為recover)是為了顯示被刪除信息而建立的,在函數(shù)運(yùn)行之初便建立了恢復(fù)區(qū)鏈表,頭指針設(shè)為rhead,與管理系統(tǒng)頭指針head相區(qū)別。并且,rhead被設(shè)為全局變量,方便被函數(shù)調(diào)用?;謴?fù)區(qū)系統(tǒng)主要有查找、輸出功能,其功能模塊基本調(diào)用管理系統(tǒng)的函數(shù),所以不再贅述。而恢復(fù)區(qū)的輸入函數(shù),即管理區(qū)刪除信息時(shí)將信息輸入恢復(fù)區(qū)鏈表的函數(shù),上文已提及,即deletinput,此為連接恢復(fù)區(qū)與管理系統(tǒng)的橋梁,只不過是單行的。函數(shù)

18、為:voiddeletinput(structstu*p)/將刪除信息導(dǎo)入恢復(fù)區(qū)鏈表,p為要?jiǎng)h除信息的指針structstu*p1,*p2;p1=rhead;/恢復(fù)區(qū)鏈表頭節(jié)點(diǎn)位置while(p1-next!=NULL)/指針置于鏈表尾端p1=p1-next;p2=p1;p1=(structstu*)malloc(LENS);/復(fù)制結(jié)構(gòu)體信息p1-inf.num=p-inf.num;strcpy(p1-,p-);strcpy(p1-inf.academy,p-inf.academy);/復(fù)制字符數(shù)組,以下類似strcpy(p1-inf.majoy,p-inf.majoy);strcpy(p1-

19、vince,p-vince);strcpy(p1-inf.address,p-inf.address);strcpy(p1-inf.phone,p-inf.phone);p2-next=p1;p1-next=NULL;/鏈表尾設(shè)為NULL以上程序函數(shù)模塊基本介紹完畢,由于篇幅有限,很多函數(shù)模塊只摘錄了主體,若仍有疑惑處,可參考附錄中的源代碼。3.4功能展示主界面:管理系統(tǒng):voidsystem()添加:voidadd(structstu*head)可連續(xù)添加查找:voidsearch(structstu*head)刪除:structstu*delet(structstu*head)按學(xué)號(hào)刪除:

20、按姓名查詢,可面對(duì)重名情況:輸出:voidprint(structstu*head)恢復(fù)區(qū)系統(tǒng)菜單:voidrecover()文本形式保存:voidsave(structstu*head,charfilename20)刪除信息導(dǎo)入恢復(fù)區(qū)鏈表:voiddeletinput(structstu*p)第四章:實(shí)習(xí)總結(jié)本次實(shí)習(xí),我制作了兩個(gè)版本的程序,一個(gè)是簡版,一個(gè)是升級(jí)版。其實(shí),簡版就是管理系統(tǒng),升級(jí)版在簡版的基礎(chǔ)上還包含了恢復(fù)區(qū)系統(tǒng)。這也算是實(shí)現(xiàn)了程序的升級(jí)吧,安全性方面算是達(dá)標(biāo)了。本次實(shí)習(xí)的不足主要有:1實(shí)用性不足。程序中學(xué)生信息定義的是長整型,故范圍有限,不能大于32756,否則就會(huì)溢出;如

21、果定義為無符號(hào)的長整,也不過翻一番而已,并未增添多少位,我校學(xué)號(hào)可是有11位。但這樣方便比較給變量賦值,并且在查找中已有查找姓名字符串的應(yīng)用了,用長整型豐富了查找類型;其實(shí)完全可以定義學(xué)號(hào)為字符型數(shù)組,雖說浪費(fèi)空間,但是方便輸入較長數(shù)值,且比較也很方便,可以直接調(diào)用查找姓名字符串的函數(shù)。2程序中函數(shù)模塊利用率不高,除了讀取、存儲(chǔ)、查找、輸出這四個(gè)模塊被兩個(gè)系統(tǒng)調(diào)用外,其他刪除、添加只有管理系統(tǒng)用到;倒是print1這么一個(gè)輸出單一節(jié)點(diǎn)信息的程序被調(diào)用多次;3函數(shù)模塊十分龐大,很多程序語句充斥在其中,沒有很好的分成幾部分子函數(shù),方便調(diào)用,這也導(dǎo)致了函數(shù)調(diào)用率不高;4因?yàn)樗悸吩颍绦蛑杏腥齻€(gè)全局

22、變量,不利于程序的移植,可移植性不高;5程序中查找模塊與刪除模塊沒有結(jié)合好,導(dǎo)致在刪除中又查找了一遍;說到底還是目標(biāo)不一樣,查找函數(shù)只要求目標(biāo)節(jié)點(diǎn)的指針,而刪除函數(shù)要前一個(gè)節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)的指針,而且鏈表是單向的,知道后一個(gè)節(jié)點(diǎn)但不能知道前一個(gè)節(jié)點(diǎn)。若用雙向鏈表,那樣就可以將刪除與查找較好的結(jié)合在一起了。6恢復(fù)區(qū)只有查找、輸出功能,沒有恢復(fù)與刪除功能,如此只能添加不能刪除,恢復(fù)區(qū)文件會(huì)越來越大;因?yàn)闀r(shí)間問題沒有建立恢復(fù)函數(shù),其實(shí)建立也不難,只是會(huì)與恢復(fù)區(qū)導(dǎo)入函數(shù)類似,再增加一全局變量而已;7使用鏈表所以未排序。如果要給鏈表排序,可以在插入信息時(shí)就按順序插入,但是這勢必增加程序運(yùn)行負(fù)擔(dān),而且效率不

23、高,因?yàn)殒湵硎菃蜗虻???梢杂枚鏄洌绻菢拥脑捫示透叨嗔?,但是二叉樹我還不會(huì)。8.程序視圖就是C語言的黑框,沒有美觀可言。C+的視圖好一些,我也想過用C+編譯一個(gè)窗口,然后在程序中調(diào)用。但是C+還沒學(xué)會(huì),而且在調(diào)試程序的過程中遇到一些困難讓我遺忘了這個(gè)想法,曾看程序看到凌晨兩點(diǎn),所以想法沒有實(shí)踐。9.在軟件技術(shù)普及的今天,做個(gè)數(shù)據(jù)庫已是小菜一碟,很到軟件可以使用,如MicrosoftOfficeAccess,并且功能極其強(qiáng)大,比我花了幾天時(shí)間做出來的高級(jí)不知多少倍。與那些專業(yè)程序相比,我的這程序不值一提,也就是練習(xí)練習(xí)C語言而已。第五章:實(shí)習(xí)感受此次實(shí)習(xí)在一個(gè)涼爽的夏日開始,這在武漢極反常

24、。因?yàn)槲覀兛荚嚮究纪炅?,只剩下一門英語了,所以實(shí)習(xí)時(shí)間比較充裕。實(shí)習(xí)的題目也不算太難,思路很清晰,總共三步走:1.讀取文件;2.處理鏈表;3.保存文件。操作的主體是鏈表,原以為會(huì)很輕松,但還是遇到很多問題,以前上課時(shí)從未想到過。經(jīng)歷過基本一天都在看程序的時(shí)間,我發(fā)現(xiàn)我懂的太少,要學(xué)的太多。對(duì)文件的操作我一直都沒注意,現(xiàn)在才發(fā)現(xiàn)其樂無窮;以前覺得鏈表很難,現(xiàn)在輕松寫出程序。學(xué)習(xí)與實(shí)踐果然是不可分割的。實(shí)習(xí)中,大家八仙過海各顯神通,用鏈表是比較傳統(tǒng)的,而且節(jié)省內(nèi)存,有的用數(shù)組,這也可以理解,方便使用,排序便利;有的直接用文件C語句查詢、刪除,讓我大開眼界,文件還能這么用!在寫報(bào)告時(shí)看到一篇用指針

25、數(shù)組做的程序,相當(dāng)有意思。發(fā)現(xiàn)水平還是不夠,同學(xué)可以用C語言編出一個(gè)比較漂亮的界面,還可以隨意調(diào)用文件操作,實(shí)在讓人贊嘆不已。此次實(shí)習(xí)加強(qiáng)了我對(duì)鏈表的理解,很多以前迷糊的概念得到了明確,亦讓我感到C語言強(qiáng)大之處,直接操作內(nèi)存,實(shí)在很暴力。一句詩概括此次實(shí)習(xí),“山重水復(fù)疑無路,柳暗花明又一村”;如今C語言實(shí)習(xí)已然結(jié)束,但是對(duì)于計(jì)算機(jī)語言的學(xué)習(xí)決不能放松,“雄關(guān)漫道真如鐵,而今邁步從頭越”?,F(xiàn)在的世界是信息化的,我們現(xiàn)在對(duì)于Matlab的要求也很大,C語言也是其基礎(chǔ)。路漫漫其修遠(yuǎn)兮,吾將上下而求索。感謝曹老師抽出時(shí)間將C語言實(shí)習(xí)提前和這八天來的指導(dǎo),同時(shí)亦感謝大家這些天來的支持與幫助,此外額外感謝

26、武漢夏天罕見的涼爽天氣,感謝生活。附錄參考書目1.譚浩強(qiáng)著C語言程序設(shè)計(jì)2005年7月第3版298-299、300、302-303、338頁2./view/4be08c81e53a580216fcfefb.html吳煌堅(jiān)學(xué)長的實(shí)習(xí)報(bào)告源代碼#include#include#include#defineNULL0#defineLENsizeof(structstudent)#defineLENSsizeof(structstu)structstudent/學(xué)生信息結(jié)構(gòu)體longnum;/學(xué)生學(xué)號(hào)charname20;/學(xué)生姓名characademy20;/學(xué)院charmajoy10;/專業(yè)cha

27、rprovince10;/省份charaddress20;/地址charphone11;/電話號(hào)碼;structstu/帶學(xué)生信息結(jié)構(gòu)體的鏈表單位structstudentinf;structstu*next;/后續(xù)鏈表地址;intn;/記錄節(jié)點(diǎn)個(gè)數(shù)intsearchnum;/搜索個(gè)數(shù),保證未搜索到時(shí)可顯示沒搜到structstu*rhead;/方便全局調(diào)用恢復(fù)區(qū)鏈表structstu*creat(charfilename120)/創(chuàng)建鏈表,從文件中讀取數(shù)據(jù),返回頭指針structstu*head;/鏈表頭指針structstu*p1,*p2;/指針變量p1=p2=(structstu*)ma

28、lloc(LENS);FILE*fp;/打開文件讀取數(shù)據(jù)if(fp=fopen(filename1,rb)=NULL)/若文件不存在則建立文件printf(暫無任何學(xué)生信息n);fp=fopen(filename1,wb+);/建立文件fclose(fp);p1-next=NULL;return(p1);else/讀取文件信息,建立鏈表n=0;/此時(shí)無結(jié)點(diǎn)head=p1;while(fread(&(p1-inf),LEN,1,fp)n=n+1;if(n=1)head=p1;/給頭結(jié)點(diǎn)賦值elsep2-next=p1;/加新的結(jié)構(gòu)體p2=p1;p1=(structstu*)malloc(LENS

29、);fclose(fp);p2-next=NULL;/尾結(jié)點(diǎn)處指針置0return(head);voidsave(structstu*head,charfilename20)/存儲(chǔ)鏈表信息FILE*fp;structstu*p;p=head;fp=fopen(filename,wb);/以二進(jìn)制方式打開文件while(p!=NULL)&fwrite(&(p-inf),LEN,1,fp)/寫入文件p=p-next;fclose(fp);voiddeletinput(structstu*p)/將刪除信息導(dǎo)入恢復(fù)區(qū)鏈表structstu*p1,*p2;p1=rhead;/恢復(fù)區(qū)鏈表頭節(jié)點(diǎn)位置whil

30、e(p1-next!=NULL)/指針置于鏈表尾端p1=p1-next;p2=p1;p1=(structstu*)malloc(LENS);/復(fù)制結(jié)構(gòu)體信息p1-inf.num=p-inf.num;strcpy(p1-,p-);strcpy(p1-inf.academy,p-inf.academy);strcpy(p1-inf.majoy,p-inf.majoy);strcpy(p1-vince,p-vince);strcpy(p1-inf.address,p-inf.address);strcpy(p1-inf.phone,p-inf.phone);p2-next=p1;p1-next=NU

31、LL;voidtxtsave(structstu*head,charfilename20)/以文本形式將鏈表輸入文件FILE*fp;structstu*p;p=head;fp=fopen(filename,w);/以文本形式打開while(p!=NULL)/鏈表不到盡頭不停止fprintf(fp,%ld,(p-inf).num);/向文本文件中寫入數(shù)據(jù)fprintf(fp,%10s,(p-inf).name);fprintf(fp,%10s,(p-inf).academy);fprintf(fp,%10s,(p-inf).majoy);fprintf(fp,%10s,(p-inf).provi

32、nce);fprintf(fp,%10s,(p-inf).address);fprintf(fp,%20sn,(p-inf).phone);p=p-next;voidprint1(structstu*p)/輸出單個(gè)學(xué)生結(jié)構(gòu)體信息printf(n學(xué)號(hào)%d,(p-inf).num);printf(n姓名%s,(p-inf).name);printf(n學(xué)院%s,(p-inf).academy);printf(n專業(yè)%s,(p-inf).majoy);printf(n省份%s,(p-inf).province);printf(n地址%s,(p-inf).address);printf(n電話號(hào)碼%s

33、n,(p-inf).phone);structstu*search_name(structstu*p,charsname20)/按姓名搜索while(p!=NULL)if(strcmp(sname,p-)=0)+searchnum;return(p);/若查找到目標(biāo),返回指針p=p-next;if(searchnum=0)printf(沒有該學(xué)生信息);return(NULL);/返回NULL以保證返回值structstu*search_num(structstu*p,longsnum)/按學(xué)號(hào)搜索while(p!=NULL)if(snum=(p-inf.num)+searchnum;retu

34、rn(p);/若查找到目標(biāo),返回指針p=p-next;if(searchnum=0)printf(沒有該學(xué)生信息);return(NULL);/返回NULL以保證返回值voidadd(structstu*head)/添加信息intinput=1;/給輸入按鈕賦初值structstu*p1,*p2;/建立結(jié)構(gòu)體指針p2=head;while(input!=0)printf(請選擇:n輸入0返回主菜單n輸入1繼續(xù)n);scanf(%d,&input);/輸入按鈕賦值if(input=0)break;/判斷是否返回主菜單if(n=0)/鏈表無節(jié)點(diǎn),給*head填充數(shù)據(jù)printf(n學(xué)號(hào)(輸入數(shù)值請

35、小于32756):);scanf(%d,&(head-inf).num);printf(n姓名:);scanf(%s,(head-inf).name);printf(n學(xué)院:);scanf(%s,(head-inf).academy);printf(n專業(yè):);scanf(%s,(head-inf).majoy);printf(n省份:);scanf(%s,(head-inf).province);printf(n地址:);scanf(%s,(head-inf).address);printf(n電話號(hào)碼:);scanf(%s,(head-inf).phone);n+;p2-next=NULL

36、;continue;/增加節(jié)點(diǎn),節(jié)點(diǎn)數(shù)n加1,同時(shí)跳出此次循環(huán),進(jìn)入下一次p1=(structstu*)malloc(LENS);/輸入信息printf(n學(xué)號(hào)(輸入數(shù)值請小于32756):);scanf(%d,&(p1-inf).num);printf(n姓名:);scanf(%s,(p1-inf).name);printf(n學(xué)院:);scanf(%s,(p1-inf).academy);printf(n專業(yè):);scanf(%s,(p1-inf).majoy);printf(n省份:);scanf(%s,(p1-inf).province);printf(n地址:);scanf(%s,(

37、p1-inf).address);printf(n電話號(hào)碼:);scanf(%s,(p1-inf).phone);while(p2-next)!=NULL)/移動(dòng)指針到鏈表尾p2=p2-next;p2-next=p1;/移動(dòng)指針p2=p1;p2-next=NULL;n+;/節(jié)點(diǎn)數(shù)加1voidsearch(structstu*head)/搜索信息searchnum=0;if(n=0)printf(此時(shí)無數(shù)據(jù));return;/節(jié)點(diǎn)數(shù)為0狀態(tài)structstu*p;p=head;printf(請輸入擬搜索信息:n);printf(按姓名查找請按1n按學(xué)號(hào)查找請按2n);/分類查找intinput=

38、0;scanf(%d,&input);/導(dǎo)入分類if(input=1)/按姓名查找charsname20;printf(請輸入姓名:n);scanf(%s,sname);/輸入姓名while(p!=NULL)p=search_name(p,sname);if(p!=NULL)print1(p);/若查找到目標(biāo),輸出elsebreak;p=p-next;/傳遞指針elseif(input=2)/按學(xué)號(hào)查找longsnum;printf(請輸入學(xué)號(hào):n);scanf(%ld,&snum);/輸入學(xué)號(hào)while(p!=NULL)p=search_num(p,snum);if(p!=NULL)prin

39、t1(p);/若查找到目標(biāo),輸出elsebreak;p=p-next;/傳遞指針elseprintf(輸入錯(cuò)誤);return;structstu*delet(structstu*head)/刪除信息if(n=0)printf(無學(xué)生信息);return(head);intinput=0;/選擇變量:學(xué)號(hào)、姓名printf(按姓名刪除請按1n按學(xué)號(hào)刪除請按2n);/分類刪除scanf(%d,&input);if(input=2)/按學(xué)號(hào)刪除(學(xué)號(hào)默認(rèn)唯一)printf(請輸入擬刪除學(xué)生學(xué)號(hào):n);longsnum=0;scanf(%ld,&snum);structstu*p1,*p2;p1=h

40、ead;while(snum!=p1-inf.num&p1-next!=NULL)/p1指向的學(xué)號(hào)不是要找的節(jié)點(diǎn),并且后面還有節(jié)點(diǎn)p2=p1;p1=p1-next;/p1后移if(snum=p1-inf.num)/找到目標(biāo)print1(p1);deletinput(p1);if(p1=head)head=p1-next;/若p1指向頭節(jié)點(diǎn),將第二個(gè)節(jié)點(diǎn)位置賦予headelsep2-next=p1-next;/否則將下一結(jié)點(diǎn)位置賦給前一節(jié)點(diǎn)位置n-;elseprintf(該學(xué)生不存在);return(head);elseif(input=1)/按姓名刪除(姓名可以重復(fù))intselect=0,c

41、ount=0;/選擇刪除與否charsname20;structstu*p1,*p2;p1=head,p2=head;printf(請輸入學(xué)生姓名:n);scanf(%s,sname);/輸入學(xué)號(hào)while(p1!=NULL)/歷遍鏈表if(strcmp(sname,p1-)=0)print1(p1);/若符合姓名條件,顯示信息printf(刪除該生信息?n刪除選1n按其它鍵不刪除n);/保證達(dá)到目標(biāo)姓名時(shí)顯示學(xué)生信息,可選擇不刪除scanf(%d,&select);if(select!=1)p2=p1;p1=p1-next;continue;/不刪除就再次循環(huán)elsen-;deletinpu

42、t(p1);count+;/刪除數(shù)加一if(p1=head)head=p1-next;/刪除信息elsep2-next=p1-next;/更改指針,繞過目標(biāo)p2=p1;p1=p1-next;if(count=0)printf(該生信息不存在);/若未刪除則視為未發(fā)現(xiàn)目標(biāo)學(xué)生return(head);elseprintf(輸入錯(cuò)誤);return(head);voidprint(structstu*head)/輸出全部數(shù)據(jù)數(shù)據(jù)printf(全體學(xué)生數(shù)據(jù)如下:n);if(n=0)printf(無學(xué)生信息);return;/若節(jié)點(diǎn)為0則返回structstu*p;p=head;while(p!=NULL)/循環(huán)輸出printf(n學(xué)號(hào)%d,(p-inf).num);printf(n姓名%s,(p-inf).name);printf(n學(xué)院%s,(p-inf).academy);printf(n專業(yè)%s,(p-inf).majoy);printf(n省份%s,(p-inf).province);printf(n地址%s,(p-inf).address

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論