




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、家譜( 3-1 )一、題目要求基本要求:從文件中讀入家庭成員建立家譜,以孩子兄弟表示法存儲。 基本功能:家譜管理,如:(1)(2)(3) 等等。在家譜中添加新成員,并追加到文件中。輸出指定家庭的所有成員。確定指定成員在家族中的輩份(第幾代) 。二 概要設(shè)計(1)功能部分: 本程序共實現(xiàn)了 6 個功能分別為:1. 讀出家譜并顯示2. 確定指定成員在家族中的輩份3. 輸出指定輩的所有成員4. 在家譜中添加新成員,并追加到文件中5. 輸出指定家庭的所有成員6. 退出本系統(tǒng)(2) 各功能的算法思想 :1. 讀出家譜并顯示 存儲結(jié)構(gòu)用棧,按照先顯示雙親,然后顯示其所有孩子的順序顯示所有的家庭成員。2.
2、確定指定成員在家族中的輩份 用求成員所在的二叉樹中的層數(shù)(按層遍歷二叉樹)來確定,這里采用的是遞歸算法3. 輸出指定輩的所有成員 此處定義了一個新的結(jié)構(gòu)體類型(增加存儲節(jié)點所在的層數(shù)) ,定義如下: struct BTNode *q;int loc;/存結(jié)點所在的層數(shù)qu10;并用一個隊列來比較顯示同輩分的所有成員。4. 在家譜中添加新成員,并追加到文件中 首先,輸入一個新成員的名字; 然后,輸入其雙親; 之后,再添加到整個存儲二叉鏈表中。 然后,再將新的存儲結(jié)構(gòu)寫回到文件中。 二叉鏈表的結(jié)點類型為: typedef struct nodeElemType data10;/存放成員的名字str
3、uct node *child;/其孩子指針struct node *brother;/ 其兄弟指針BTNode;5. 輸出指定家庭的所有成員首先,設(shè)一個棧,并設(shè)一個標記位,先置1;然后,找到輸入的要待顯示的成員,將標記位置0;再次,顯示其孩子和兄弟,依次下去直到顯示完其所有的親戚。6. 退出本系統(tǒng)通過一個輸入字符 q 來控制,每完成一個功能,系統(tǒng)提示是否要繼續(xù)操作: 當q為“ Y ”或者“ y”時,顯示菜單,程序繼續(xù)執(zhí)行; 當 q 為其他字符時,程序執(zhí)行結(jié)束,退出本系統(tǒng)。 三、詳細設(shè)計 :通過一個 do-while 語句來控制各個模塊的選擇和實現(xiàn)。1. 讀出家譜并顯示void display
4、(BTNode *b)BTNode *q10;/int front,rear;int k;BTNode *p;p=b;k=0;front=-1;rear=0;qrear=p; /while(front<rear) front+;p=qfront;printf("%s",p->data ); / printf("(");disbr(p->child);printf(")n");if(p->child!=NULL) /rear+;qrear=p->child;if(p->brother!=NULL) /
5、rear+;qrear=p->brother;2. 確定指定成員在家族中的輩分定義一個棧頭結(jié)點先入棧頭結(jié)點出棧,并顯示顯示其孩子顯示其兄弟/ 用遞歸的思想int generation(BTNode *b,int h,ElemType x) 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
6、layer(BTNode *t,int m) struct / 定義一個新的結(jié)點類型,在孩子兄弟存儲結(jié)構(gòu)的基礎(chǔ)上添加一個數(shù)據(jù)域存其 所在層數(shù)BTNode *q;int loc;qu10;int front,rear;BTNode *p;p=t;k=0;front=-1;rear=0;qurear.q=p;qurear.loc=1;if( qurear.loc=m) /找到 m輩的即輸岀printf("%c",p->data);while(fr on t<rear)/通過站查找所有n輩的結(jié)點并輸岀 front+;p=qufront.q;if(p->child
7、!=NULL)rear+;qurear.q=p->child;qurear.loc=qufront.loc+1;if(n= qurear.loc)printf("%s ",p->child->data);if(p->brother!=NULL)rear+;qurear.q=p->brother; qurear.loc=qufront.loc;if( qurear.loc=n)printf("%s ",p->brother->data);4. 在家譜中添加新成員,并追加到文件中void add(BTNode *&a
8、mp;b,ElenType y,ElenType x)char filename20=" "FILE *fp;BTNode *p,*q;int i;p=FindNode(b,y);q=(BTNode *)malloc(sizeof(BTNode); for(i=0;xi!='0'i+) q->datai=xi;q->datai='0' q->child=q->brother=NULL;if(p->child =NULL)p->child=q;else p=p->child; while(p->b
9、rother!=NULL) p=p->brother ;p->brother=q;display(b);printf(" 向文件中讀入新家譜 n"); printf("n input a filename:");scanf("%s",&filename);if(fp=fopen(filename,"w")=NULL) puts("n can't open the file.");exit(0); elseDispBTNode(b,fp);fclose (fp);voi
10、d DispBTNode(BTNode *b,FILE *fp)char a10;int i=0;if(b!=NULL)while(b->datai!='0')ai=b->datai;i+; ai='0' fputs(a,fp); / 寫入文件 if(b->child!=NULL | b->brother!=NULL) fputs(s,fp);遞歸寫入其孩子遞歸寫入其兄弟DispBTNode(b->child,fp); / if (b->brother!=NULL) fputs(p,fp); DispBTNode(b->
11、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(top>-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)display(p->child); /
12、 return ;if(p->brother!=NULL)top+;qtop=p_>brother;if(tap=0)display(p->brother); / return ;顯示其孩子顯示其兄弟6.退出本系統(tǒng)此處通過一個輸入字符q來控制,當q為“ Y”或者“ y”時,顯示菜單,程序繼續(xù)執(zhí)行,當q為其他字符時,程序執(zhí)行結(jié)束,退出本系統(tǒng)。此時q= N '四:調(diào)試分析1 首先,將已有家譜存儲文件寫在一個txt文檔里,內(nèi)容為:wuwu(wucha ng(wux in( wujia,wuhua),wuli)輸出結(jié)果為:_系統(tǒng)功能0 顯示此家庭1 禰定指定成員在家族中的輩2
13、輸出指定蜚的所有成員3 卷家譜史添赧誠員,、并追4 輸出旨克聖庭俞斎有成員 退出本條統(tǒng)請輸人您的選擇:0uuuu<uuchan9 wli > wue hang< uux in wuhua、 uuxin <uujia wuliO wuj ia< > ijuhua< >是否蘿繼縫操作(V/N>:2.調(diào)試時遇到的問題:(1)當選擇功能3 (添加新成員),添加完成員后,寫回文件時出現(xiàn)了錯誤,原本添加的為其中一個結(jié)點的孩子,結(jié)果寫回文件時卻成了該結(jié) 點的孫子,也就是本是要添加為此結(jié)點的孩子的兄弟,結(jié)果卻成了其孩子 的孩子。最后經(jīng)過單步跟蹤發(fā)現(xiàn)寫入文件
14、的函數(shù)編寫錯誤, 缺少判斷條件, 經(jīng)過修改后,此問題得到了解決。( 2)當選擇功能 0(顯示此家譜),沒有按照事先存儲在 txt 中的文件 顯示,通過認真檢查程序中顯示成員的函數(shù)(按層遍歷)、不斷調(diào)試,發(fā) 現(xiàn)并不是該顯示函數(shù)的錯誤,因為在功能 4(輸出指定家庭的所有成員) 中,也是通過調(diào)用該函數(shù)實現(xiàn)輸出功能,于是,檢查 txt 文件中事先存儲 的家譜成員,發(fā)現(xiàn)是由于“(”與“)”沒有匹配好,導(dǎo)致沒有按照預(yù)期 想法創(chuàng)建二叉樹造成的錯誤,通過修改 txt 文件,使得錯誤得以解決。 五、課程設(shè)計總結(jié)通過本次課程設(shè)計,我覺得自己最大的收獲就是:( 1) 學(xué)會了怎樣將課堂所學(xué)知識運用到較為實際的應(yīng)用中來 由于對二叉鏈表的存儲比較感興趣,我選做的是家譜,開始覺得無從下手,但是經(jīng)過仔細分析后,漸漸找到一點思路(首先創(chuàng)建,然后分別實現(xiàn) 各個功能,最后利用菜單實現(xiàn)選擇功能并輸出結(jié)果) 。( 2) 鍛煉提出問題、解決問題和自學(xué)的能力 家譜的實現(xiàn)要求讀、寫文件,于是“如何將文件從文檔中讀出”
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 油輪船員考試:油輪船員考試必看題庫知識點
- Photoshop平面設(shè)計基礎(chǔ) 課件 任務(wù)2.1 改變小鳥顏色
- 英語趣味三字經(jīng)
- 英語教學(xué)案例分析10篇
- 產(chǎn)業(yè)園區(qū)配套服務(wù)廠房出租居間費合同范本
- 保健按摩師勞動合同書美容
- 草捆生物質(zhì)能源項目融資合同
- 農(nóng)村現(xiàn)場勘察方案模板
- 智能家居產(chǎn)業(yè)廠房租賃居間合同范本
- 師徒制建設(shè)方案
- 跆拳道館技術(shù)崗位薪酬制度
- 2025年網(wǎng)格長認證考試題庫
- 石油化工企業(yè)綠色設(shè)計指南
- 跨國公司試用期管理流程標準
- 無人駕駛車法規(guī)-深度研究
- 2025年度美團外賣外賣配送配送員績效考核協(xié)議4篇
- 《寧晉縣國土空間總體規(guī)劃(2021-2035年)》
- 2024年度乳腺癌篩查與早期診斷課件
- DB32T 4483.1-2023“兩客一?!钡缆愤\輸雙重預(yù)防機制建設(shè)指南 第1部分:安全生產(chǎn)風(fēng)險管理體系建設(shè)
- 2024年食品檢驗員(高級)職業(yè)鑒定理論考試題庫(含答案)
- 工廠物品回收合同模板
評論
0/150
提交評論