數(shù)據(jù)結(jié)構(gòu)家譜課程設(shè)計(jì)報(bào)告_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)家譜課程設(shè)計(jì)報(bào)告_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)家譜課程設(shè)計(jì)報(bào)告_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)家譜課程設(shè)計(jì)報(bào)告_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)家譜課程設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、家譜( 3-1)一、題目要求基本要求:從文件中讀入家庭成員建立家譜,以孩子兄弟表示法存儲(chǔ)?;竟δ埽杭易V管理,如:( 1)在家譜中添加新成員,并追加到文件中。( 2)輸出指定家庭的所有成員。( 3)確定指定成員在家族中的輩份(第幾代)。塵塵等等。二概要設(shè)計(jì)(1)功能部分:本程序共實(shí)現(xiàn)了 6 個(gè)功能分別為:1 . 讀出家譜并顯示2 .確定指定成員在家族中的輩份3 .輸出指定輩的所有成員4 .在家譜中添加新成員,并追加到文件中5 .輸出指定家庭的所有成員6 .退出本系統(tǒng)(2)各功能的算法思想:1. 讀出家譜并顯示2 / 10存儲(chǔ)結(jié)構(gòu)用棧,按照先顯示雙親,然后顯示其所有孩子的順序顯示所有的家庭成員。

2、2 .確定指定成員在家族中的輩份用求成員所在的二叉樹(shù)中的層數(shù)(按層遍歷二叉樹(shù))來(lái)確定,這里采用的是遞歸算法3 .輸出指定輩的所有成員此處定義了一個(gè)新的結(jié)構(gòu)體類(lèi)型(增加存儲(chǔ)節(jié)點(diǎn)所在的層數(shù)),定義如下:structBTNode *q;intloc;/ 存結(jié)點(diǎn)所在的層數(shù)qu10;并用一個(gè)隊(duì)列來(lái)比較顯示同輩分的所有成員。4 .在家譜中添加新成員,并追加到文件中首先,輸入一個(gè)新成員的名字;然后,輸入其雙親;之后,再添加到整個(gè)存儲(chǔ)二叉鏈表中。然后,再將新的存儲(chǔ)結(jié)構(gòu)寫(xiě)回到文件中。二叉鏈表的結(jié)點(diǎn)類(lèi)型為:typedefstruct nodeElemType data10;/ 存放成員的名字struct node

3、 *child;/ 其孩子指針struct node *brother;/ 其兄弟指針BTNode;5 .輸出指定家庭的所有成員首先,設(shè)一個(gè)棧,并設(shè)一個(gè)標(biāo)記位,先置1;然后,找到輸入的要待顯示的成員,將標(biāo)記位置0;再次,顯示其孩子和兄弟,依次下去直到顯示完其所有的親戚。6 .退出本系統(tǒng)通過(guò)一個(gè)輸入字符 q 來(lái)控制,每完成一個(gè)功能,系統(tǒng)提示是否要繼續(xù)操作:當(dāng)q為“微者“yk顯示菜單,程序繼續(xù)執(zhí)行;當(dāng) q 為其他字符時(shí),程序執(zhí)行結(jié)束,退出本系統(tǒng)。三、詳細(xì)設(shè)計(jì):通過(guò)一個(gè) do-while 語(yǔ)句來(lái)控制各個(gè)模塊的選擇和實(shí)現(xiàn)。1. 讀出家譜并顯示void display(BTNode *b)BTNode

4、*q10;/ 定義一個(gè)棧int front,rear;int k;BTNode *p;p=b;k=0;front=-1;rear=0;qrear=p;/ 頭結(jié)點(diǎn)先入棧while(frontdata ); / 頭結(jié)點(diǎn)出棧,并顯示printf();disbr(p-child);printf()n);if(p-child!=NULL) / 顯示其孩子rear+;qrear=p-child;if(p-brother!=NULL) / 顯示其兄弟 rear+;qrear=p-brother;2 .確定指定成員在家族中的輩分int generation(BTNode *b,int h,ElemType x

5、)/ 用遞歸的思想 int i;if(b=NULL)return(0);i=strcmp(b-data,x); / 比較是否相等if(i=0)return(h);int L=generation(b-child,h+1,x);if(L=0)L=generation(b-brother,h,x);return(L);3 .輸出指定輩的所有成員void layer(BTNode *t,int m) struct / 定義一個(gè)新的結(jié)點(diǎn)類(lèi)型,在孩子兄弟存儲(chǔ)結(jié)構(gòu)的基礎(chǔ)上添加一個(gè)數(shù)據(jù)域存其所在層數(shù)int loc;qu10;BTNode *q;int front,rear;BTNode *p;p=t;k=0

6、;front=-1;rear=0;qurear.q=p;qurear.loc=1;if( qurear.loc=m) / 找到 m 輩的即輸出printf(%c,p-data);while(frontchild!=NULL)rear+;qurear.q=p-child;qurear.loc=qufront.loc+1;if(m= qurear.loc)printf(%s,p-child-data);if(p-brother!=NULL)rear+;qurear.q=p-brother;qurear.loc=qufront.loc;if( qurear.loc=m)printf(%s ,p-br

7、other-data);4 .在家譜中添加新成員,并追加到文件中void add(BTNode *&b,ElemType y,ElemType x)void DispBTNode(BTNode *b,FILE *fp)char a10;int i=0;if(b!=NULL)while(b-datai!=0)ai=b-datai;i+;char filename20= ;FILE *fp;BTNode *p,*q;int i;p=FindNode(b,y);q=(BTNode *)malloc(sizeof(BTNode);else p=p-child;printf( 向文件中讀入新家譜 n);

8、scanf(%s,&filename);if(fp=fopen(filename,w)=NULL)elsefclose (fp);while(p-brother!=NULL)p=p-brother ;12 / 10for(i=0;xi!=0;i+)q-datai=xi;q-datai=0;q-child=q-brother=NULL;p-child=q;if(p-child =NULL)p-brother=q;display(b);printf(n input a filename:);puts(n cant open the file.);exit(0);DispBTNode(b,fp);a

9、i=0;if(b-child!=NULL | b-brother!=NULL)fputs(s,fp);DispBTNode(b-child,fp); / 遞歸寫(xiě)入其孩子fputs(a,fp); / 寫(xiě)入文件if (b-brother!=NULL)fputs(p,fp);DispBTNode(b-brother,fp); /fputs(t,fp);5 .輸出指定家庭的所有成員void dispfamily(BTNode *b,ElemType x) BTNode *p;BTNode *qMaxSize;int top=-1,tap=1;if(b!=NULL)top+;qtop=b;while(t

10、op-1)p=qtop;top-;if(strcmp(p-data,x)=0) / 查找此人 top=-1;tap=0;if(p-child!=NULL)top+;qtop=p-child;if(tap=0)遞歸寫(xiě)入其兄弟display(p-child); 顯示其孩子return ;top+;qtop=p-brother;if(tap=0)display(p-brother); / 顯示其兄弟return ;if(p-brother!=NULL)6 .退出本系統(tǒng)此處通過(guò)一個(gè)輸入字符q來(lái)控制,當(dāng)q為“微者詞號(hào),顯示菜單,程序繼 續(xù)執(zhí)行,當(dāng) q 為其他字符時(shí),程序執(zhí)行結(jié)束,退出本系統(tǒng)。此時(shí)q= N

11、。四:調(diào)試分析1 首先,將已有家譜存儲(chǔ)文件寫(xiě)在一個(gè)txt 文檔里,內(nèi)容為:wu(wuchang(wuxin(wujia,wuhua),wuli)輸出結(jié)果為:2調(diào)試時(shí)遇到的問(wèn)題:( 1)當(dāng)選擇功能3(添加新成員),添加完成員后,寫(xiě)回文件時(shí)出現(xiàn)了錯(cuò)誤,原本添加的為其中一個(gè)結(jié)點(diǎn)的孩子,結(jié)果寫(xiě)回文件時(shí)卻成了該結(jié)點(diǎn)的孫子,也就是本是要添加為此結(jié)點(diǎn)的孩子的兄弟,結(jié)果卻成了其孩子的孩子。最后經(jīng)過(guò)單步跟蹤發(fā)現(xiàn)寫(xiě)入文件的函數(shù)編寫(xiě)錯(cuò)誤,缺少判斷條件,經(jīng)過(guò)修改后,此問(wèn)題得到了解決。( 2)當(dāng)選擇功能0(顯示此家譜),沒(méi)有按照事先存儲(chǔ)在txt 中的文件顯示,通過(guò)認(rèn)真檢查程序中顯示成員的函數(shù)(按層遍歷)、不斷調(diào)試,發(fā)現(xiàn)

12、并不是該顯示函數(shù)的錯(cuò)誤,因?yàn)樵诠δ?(輸出指定家庭的所有成員)中,也是通過(guò)調(diào)用該函數(shù)實(shí)現(xiàn)輸出功能,于是,檢查 txt 文件中事先存儲(chǔ)的家譜成員,發(fā)現(xiàn)是由于 “( ”與 “) ”沒(méi)有匹配好,導(dǎo)致沒(méi)有按照預(yù)期想法創(chuàng)建二叉樹(shù)造成的錯(cuò)誤,通過(guò)修改 txt 文件,使得錯(cuò)誤得以解決。五、課程設(shè)計(jì)總結(jié)通過(guò)本次課程設(shè)計(jì),我覺(jué)得自己最大的收獲就是:( 1)學(xué)會(huì)了怎樣將課堂所學(xué)知識(shí)運(yùn)用到較為實(shí)際的應(yīng)用中來(lái)由于對(duì)二叉鏈表的存儲(chǔ)比較感興趣,我選做的是家譜,開(kāi)始覺(jué)得無(wú)從下手,但是經(jīng)過(guò)仔細(xì)分析后,漸漸找到一點(diǎn)思路(首先創(chuàng)建,然后分別實(shí)現(xiàn)各個(gè)功能,最后利用菜單實(shí)現(xiàn)選擇功能并輸出結(jié)果)。( 2)鍛煉提出問(wèn)題、解決問(wèn)題和自學(xué)的能力家譜的實(shí)現(xiàn)要求讀、寫(xiě)文件,于是 “如何將文件從文檔中讀出 ” , “怎么寫(xiě)入文件 ”都是要滿(mǎn)足要求必須解決的問(wèn)題。為此,我查找了

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論