版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 項目名稱: 家譜系統(tǒng)的設(shè)計與實現(xiàn)</p><p> 學(xué)生姓名: </p><p><b> 學(xué) 號: </b></p><p> 班 級: </p><p><b> 指導(dǎo)教師: </b></p><p>
2、 2011年12月23日</p><p><b> 目 錄</b></p><p><b> 1系統(tǒng)需求分析1</b></p><p> 1.1 問題分析1</p><p> 1.2 任務(wù)意義1</p><p> 2 設(shè)數(shù)據(jù)結(jié)構(gòu)設(shè)計及用法說明2</
3、p><p> 3 詳細(xì)設(shè)計和編碼3</p><p><b> 3.1初始化3</b></p><p><b> 3.2功能選擇4</b></p><p><b> 3.3信息輸入7</b></p><p><b> 3.4信息輸出
4、7</b></p><p><b> 3.5信息存盤8</b></p><p><b> 3.6信息清盤9</b></p><p> 3.7信息查詢10</p><p><b> 4 實驗結(jié)果13</b></p><p>
5、 4.1菜單函數(shù)功能測試13</p><p> 4.2輸入功能函數(shù)測試13</p><p> 4.3輸出功能函數(shù)測試13</p><p> 4.4清盤功能函數(shù)測試13</p><p> 4.5存盤功能函數(shù)測試14</p><p> 4.6查詢功能函數(shù)測試15</p><p>
6、;<b> 致謝17</b></p><p><b> 參考文獻(xiàn)18</b></p><p><b> 附錄:源代碼19</b></p><p><b> 1系統(tǒng)需求分析</b></p><p><b> 1.1 問題分析<
7、/b></p><p> 從課程設(shè)計的題目要求可以知道,我需要設(shè)計一個對數(shù)據(jù)輸入,輸出,儲存,查找的多功能軟件,我選擇用二叉樹來保存家族的基本信息,包括姓名及它們的關(guān)系,但是由于家族信息很巨大而且關(guān)系很復(fù)雜所以采用二叉樹來儲存它們的信息及輸出它們的關(guān)系。并且具有保存文件的功能,以便下次直接使用先前存入的信息。</p><p><b> 1.2 任務(wù)意義</b>
8、;</p><p> 家譜的功能是查詢家族每個人的信息,并且輸出它們的信息,還要具有查詢輸出功能。這樣復(fù)習(xí)了一下查詢。插入。刪除函數(shù)的應(yīng)用。并復(fù)習(xí)了上學(xué)期c語言的文件儲存及調(diào)用功能,子函數(shù)和遞歸調(diào)用功能,熟練運(yùn)用這些函數(shù)。</p><p> 2系統(tǒng)數(shù)據(jù)結(jié)構(gòu)設(shè)計及用法說明</p><p> 采用文件保存信息,并且從文件中輸出原先保存的信息,用結(jié)構(gòu)體fnode來儲
9、存家族的信息,采用遞歸的方法從fam中創(chuàng)建一個空二叉樹,然后初始化二叉樹。采用InputFam函數(shù)添加信息,OutputFam函數(shù)輸出信息,DelAll函數(shù)刪除家族的全部記錄,SaveFile函數(shù)保存添加的信息,F(xiàn)indNode函數(shù)查找節(jié)點。</p><p> 圖2 數(shù)據(jù)存儲結(jié)構(gòu)圖</p><p> 相應(yīng)的存儲結(jié)構(gòu)代碼為:</p><p> typedef s
10、truct fnode</p><p><b> {</b></p><p> char father[NAMEWIDTH]; </p><p> char wife[NAMEWIDTH];</p><p> char son[NAMEWIDTH];</p><p> ch
11、ar brother[NAMEWIDTH];</p><p><b> }FamType;</b></p><p> typedef struct tnode</p><p><b> {</b></p><p> char name[NAMEWIDTH];</p><p
12、> struct tnode *lchild,*rchild;</p><p> }BTree; </p><p><b> 3 詳細(xì)設(shè)計和編碼</b></p><p><b> 3.1初始化</b></p><p> 圖3-1為初始化函數(shù)的流程圖,主要是對二叉樹中數(shù)據(jù)域置
13、空,對二叉樹中的數(shù)據(jù)進(jìn)行初始化。</p><p><b> 代碼如下:</b></p><p> BTree *CreatBTree(char *root,FamType fam[],int n) //從fam中(含n個記錄)遞歸創(chuàng)建一棵二叉樹</p><p><b> {</b></p><
14、p> int i=0,j;</p><p> BTree *bt,*p;</p><p> bt=(BTree *)malloc(sizeof(BTree)); //創(chuàng)建父親結(jié)點</p><p> strcpy(bt->name,root);</p><p> bt->lchild=bt
15、->rchild=NULL;</p><p> while(i<n&&strcmp(fam[i].father,root)!=0)</p><p><b> i++;</b></p><p> if(i<n) //找到該姓名的記錄<
16、;/p><p><b> {</b></p><p> p=(BTree *)malloc(sizeof(BTree)); //創(chuàng)建母親結(jié)點</p><p> p->lchild=p->rchild=NULL;</p><p> strcpy(p->name,fam[i].wife);&l
17、t;/p><p> bt->lchild=p;</p><p> for(j=0;j<n;j++) //找所有兒子</p><p> if(strcmp(fam[j].father,root)==0) //找到一個兒子</p><p><b> {</b><
18、/p><p> p->rchild=CreatBTree(fam[j].son,fam,n);</p><p> p=p->rchild;</p><p><b> }</b></p><p><b> }</b></p><p> return(bt);&
19、lt;/p><p><b> }</b></p><p> 圖3-1 初始化函數(shù)流程圖</p><p><b> 3.2功能選擇</b></p><p> 圖3-2為功能選擇模塊函數(shù)的流程圖,主要提供1:文件 2:家譜 兩個功能模塊讓用戶選擇。輸入數(shù)字1的時候,出現(xiàn)界面1:輸入 2:輸出 9:
20、清盤 0:存盤返回。返回后輸入數(shù)字2,出現(xiàn)界面1:找某人的所有兒子 2:找某人所有祖先 3:找某人所有兄弟。用戶根據(jù)提示操作。</p><p><b> 代碼如下:</b></p><p> void main()</p><p><b> {</b></p><p> BTree *bt;
21、</p><p> BTree *p,*father;</p><p> FamType fam[MaxSize];</p><p> int n,sel,sell;</p><p> char xm[NAMEWIDTH];</p><p> ReadFile(fam,n);</p><p
22、><b> do</b></p><p><b> {</b></p><p> cout<<"1.文件 2:家譜 0:退出 請選擇: ";</p><p><b> cin>>sel;</b></p><p>
23、switch(sel)</p><p><b> {</b></p><p><b> case 1:</b></p><p><b> do</b></p><p><b> {</b></p><p> cout<
24、;<"1:輸入 2:輸出 9:全清 0:存盤返回 請選擇: ";</p><p> cin>>sell;</p><p> switch(sell)</p><p><b> {</b></p><p><b> case 9:</b></p&g
25、t;<p> DelAll(fam,n);</p><p><b> break;</b></p><p><b> case 1:</b></p><p> InputFam(fam,n);</p><p><b> break;</b></p&
26、gt;<p><b> case 2:</b></p><p> OutputFile(fam,n);</p><p><b> break;</b></p><p><b> case 0:</b></p><p> SaveFile(fam,n);&
27、lt;/p><p><b> break;</b></p><p><b> }</b></p><p> }while(sell!=0);</p><p><b> break;</b></p><p><b> case 2:<
28、/b></p><p> bt=CreatBTree("f1",fam,n);</p><p><b> do</b></p><p><b> {</b></p><p> cout<<" 1:找某人所有兒子 2:找某人所有祖先 3:查找某人
29、所有兄弟 0:返回 請選擇:";</p><p> cin>>sell;</p><p> switch(sell)</p><p><b> {</b></p><p><b> case 1:</b></p><p> FindSon(b
30、t);</p><p><b> break;</b></p><p><b> case 2:</b></p><p> cout<<">>";</p><p> Ancestor(bt);</p><p> cout&
31、lt;<endl;</p><p><b> break;</b></p><p><b> case 3:</b></p><p> cout<<">>";</p><p> FindBrother(bt);</p><
32、p> cout<<endl;</p><p><b> break;</b></p><p><b> }</b></p><p> }while(sell!=0);</p><p><b> break;</b></p><p&
33、gt;<b> }</b></p><p> }while(sel!=0);}</p><p> 圖3-2功能選擇模塊函數(shù)流程圖</p><p><b> 3.3信息輸入</b></p><p> 圖3-3為信息輸入模塊函數(shù)的流程圖,出現(xiàn)界面請輸入父親、母親和兒子的姓名</p>
34、<p><b> 讓用戶輸入信息。</b></p><p><b> 代碼如下:</b></p><p> void InputFam(FamType fam[],int &n) //添加一個記錄</p><p><b> {</b></p&
35、gt;<p> cout<<" >>輸入父親、母親和兒子姓名:";</p><p> cin>>fam[n].father>>fam[n].wife>>fam[n].son;</p><p><b> n++;</b></p><p><b
36、> }</b></p><p> 圖3-3信息輸入模塊函數(shù)流程圖</p><p><b> 3.4信息輸出</b></p><p> 圖3-4為信息輸出模塊函數(shù)的流程圖,自動輸出數(shù)據(jù)的信息及它們之間的家譜關(guān)系。按順序輸出父親,母親,兒子。</p><p><b> 代碼如下:<
37、/b></p><p> void OutputFile(FamType fam[],int n) //輸出簡樸文件的所有記錄</p><p><b> {</b></p><p><b> int i;</b></p><p><b> if(n<0
38、)</b></p><p><b> {</b></p><p> cout<<" >>沒有任何記錄!"<<endl;</p><p><b> return;</b></p><p><b> }</b&g
39、t;</p><p> for(i=0;i<n;i++)</p><p> cout<<fam[i].father<<fam[i].wife<<fam[i].son;</p><p><b> }</b></p><p> 圖3-4信息輸出模塊函數(shù)流程圖</p>
40、;<p><b> 3.5信息存盤</b></p><p> 圖3-5為信息存盤模塊函數(shù)的流程圖,將用戶輸入的信息存盤,下次要用時自動調(diào)用。</p><p><b> 代碼如下:</b></p><p> void SaveFile(FamType fam[],int n) /
41、/將fam數(shù)組存入數(shù)據(jù)家譜文件</p><p><b> {</b></p><p><b> int i;</b></p><p><b> FILE *fp;</b></p><p> if((fp=fopen("fam.dat","w
42、b"))==NULL)</p><p><b> {</b></p><p> cout<<" >>數(shù)據(jù)家譜文件不能打開"<<endl;</p><p><b> return;</b></p><p><b> }
43、</b></p><p> for(i=0;i<n;i++)</p><p> fwrite(&fam[i],sizeof(FamType),1,fp);</p><p> fclose(fp);</p><p><b> }</b></p><p> 圖3-5
44、信息存盤模塊函數(shù)流程圖</p><p><b> 3.6信息清盤</b></p><p> 圖3-6為信息清盤模塊函數(shù)的流程圖,將用戶輸入的信息全部清盤。代碼如下;</p><p> void DelAll(FamType fam[],int &n) //清除家譜文件的全部記錄</p>&l
45、t;p><b> {</b></p><p><b> FILE *fp;</b></p><p> if((fp=fopen("fam.dat","wb"))==NULL)</p><p><b> {</b></p><p&
46、gt; cout<<" >>不能打開家譜文件"<<endl;</p><p><b> return;</b></p><p><b> }</b></p><p><b> n=0;</b></p><p>
47、fclose(fp);</p><p><b> }</b></p><p> 圖3-6信息讀盤模塊函數(shù)流程圖</p><p><b> 3.7信息查詢</b></p><p> 圖3-7為信息查詢模塊函數(shù)的流程圖,查詢用戶輸入數(shù)據(jù)的信息及家譜關(guān)系。具有的功能是1:找某人所有兒子2:找某人所
48、有祖先 3:找某人所有兄弟。用戶根據(jù)需要操作。</p><p> 找某人所有兒子的代碼:</p><p> void FindSon(BTree *bt) //輸出某人的所有兒子</p><p><b> {</b></p><p> char xm[NAMEWIDTH];</p><
49、p><b> BTree *p;</b></p><p> cout<<" >>父親姓名:";</p><p><b> cin>>xm;</b></p><p> p=FindNode(bt,xm);</p><p> if(
50、p==NULL)</p><p> cout<<" >>不存在"<<xm<<"的父親!"<<endl;</p><p><b> else</b></p><p><b> {</b></p><p
51、> p=p->lchild;</p><p> if(p==NULL)</p><p> cout<<" >>"<<xm<<"沒有妻子"<<endl;</p><p><b> else</b></p><
52、p><b> {</b></p><p> p=p->rchild;</p><p> if(p==NULL)</p><p> cout<<" >>"<<xm<<"沒有兒子!";</p><p><b>
53、; else</b></p><p><b> {</b></p><p> cout<<" >>"<<xm<<"的兒子:";</p><p> while(p!=NULL)</p><p><b>
54、{</b></p><p> cout<<p->name;</p><p> p=p->rchild;</p><p><b> }</b></p><p> cout<<endl;</p><p><b> }</b>
55、;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> //找某人所有祖先的代碼:</p><p> void Ancestor(BTree *bt)
56、 //輸出某人所有的祖先</p><p><b> {</b></p><p><b> BTree *p;</b></p><p> char xm[NAMEWIDTH];</p><p> cout<<" >>輸入姓名:";
57、</p><p><b> cin>>xm;</b></p><p> p=FindNode(bt,xm);</p><p> if(p!=NULL)</p><p> Path(bt,p);</p><p><b> else</b></p>
58、;<p> cout<<" >>不存在"<<xm;</p><p><b> }</b></p><p> //找某人所有兄弟的代碼:</p><p> void FindBrother(BTree *bt)</p><p><b>
59、 {</b></p><p> char xm[NAMEWIDTH];</p><p> BTree *p,*father;</p><p> cout<<" >>某人的姓名:";</p><p><b> cin>>xm;</b></p
60、><p> p=FindNode(bt,xm);</p><p> Path1(bt,p); //雙親存在數(shù)組St[MaxSize]</p><p> father=St[0]; </p><p> findson1(bt,father);
61、 //調(diào)用findson函數(shù)找兒子 </p><p><b> }</b></p><p> 圖3-7查詢模塊函數(shù)流程圖</p><p><b> 4 實驗結(jié)果</b></p><p> 4.1菜單函數(shù)功能測試</p><p> 系統(tǒng)運(yùn)
62、行后就會自動顯示如圖4-1的主菜單,選項包括:1、文件,2、家譜,0、退出,。當(dāng)用戶選擇相應(yīng)的代號就進(jìn)入相應(yīng)的功能模塊。</p><p> 圖4-1 主菜單函數(shù)功能檢測</p><p> 4.2輸入功能函數(shù)測試</p><p> 系統(tǒng)運(yùn)行后就會自動顯示如圖4-2的輸入功能模塊,界面出現(xiàn)1:輸入</p><p> >>輸入父
63、親、母親和兒子的姓名 用戶輸入信息。</p><p> 圖4-2輸入功能函數(shù)測試</p><p> 4.3輸出功能函數(shù)測試</p><p> 系統(tǒng)運(yùn)行后就會自動顯示如圖4-3的輸出功能模塊,界面出現(xiàn)2:輸出。用戶輸入數(shù)字2后系統(tǒng)自動輸出數(shù)據(jù)信息。</p><p> 圖4-3輸出功能函數(shù)測試</p><p>
64、; 4.4清盤功能函數(shù)測試</p><p> 系統(tǒng)運(yùn)行后就會自動顯示如圖4-4的清盤功能模塊,界面出現(xiàn)9:全清。用戶輸入數(shù)9后自動系統(tǒng)清除所有的數(shù)據(jù)并返回。</p><p> 圖4-4清盤功能函數(shù)測試</p><p> 4.5存盤功能函數(shù)測試</p><p> 系統(tǒng)運(yùn)行后就會自動顯示如圖4-5的存盤功能模塊,界面出現(xiàn)0:存盤返回。用
65、戶輸入數(shù)0后系統(tǒng)自動保存所有的數(shù)據(jù)并返回。</p><p> 圖4-5存盤功能函數(shù)測試</p><p> 4.6查詢功能函數(shù)測試</p><p> 系統(tǒng)運(yùn)行后就會自動顯示如圖4-6的查詢功能模塊,界面出現(xiàn)1:找某人的所有兒子</p><p> 圖4-6查詢功能函數(shù)測試5 體會</p><p> 程序的關(guān)鍵是掌
66、握二叉樹的相關(guān)操作、二叉樹的創(chuàng)建和運(yùn)用、結(jié)點的查找、祖宗結(jié)點的查找等。在編程的過程中,出現(xiàn)了很多問題,如二叉樹無法建立、程序內(nèi)存讀取不了、忘了添加頭文件等錯誤。在單步調(diào)試和添加提示輸出的情況下修改程序運(yùn)行正確。</p><p> 查找首先要判斷該結(jié)點是否為空,再與查找到的結(jié)點比較,否則會內(nèi)存無法讀取,強(qiáng)行結(jié)束程序。</p><p> 祖宗結(jié)點的查找一直是個大問題,在參考書的幫助下想到了
67、后續(xù)遍歷,是可以從孩子往上找到。</p><p> 兄弟結(jié)點的查找,往上找哥哥,還要往下找弟弟,首先要找到母親結(jié)點,再依次輸出。</p><p><b> 致 謝</b></p><p> 感謝學(xué)校機(jī)房給我們提供良好的寫代碼環(huán)境。</p><p> 感謝松哥和瑩姐孜孜不倦的教導(dǎo)我們。</p><
68、;p> 感謝在寫代碼期間同學(xué)們對我的幫助,讓我能順利的寫出代碼。</p><p><b> 參考文獻(xiàn)</b></p><p> [1]譚浩強(qiáng).C語言課程設(shè)計(第三版).北京:清華大學(xué)出版社, 1996.5</p><p> [2]方超昆.C++程序設(shè)計教程.北京:郵電大學(xué)出版社, 2009</p><p>
69、 [3]李春葆.數(shù)據(jù)結(jié)構(gòu)教程(第3版):清華大學(xué)出版社,2009</p><p> [4]Walter Savitch.C++面向?qū)ο蟪绦蛟O(shè)計(第7版):清華大學(xué)出版社,2010</p><p><b> 附錄:源代碼</b></p><p> #include<iostream.h></p><p>
70、; #include<stdio.h></p><p> #include<malloc.h></p><p> #include<string.h></p><p> #include<stdlib.h></p><p> #define MaxWidth 40</p>
71、<p> #define MaxSize 30</p><p> #define NAMEWIDTH 10</p><p> typedef struct fnode</p><p><b> {</b></p><p> char father[NAMEWIDTH]; </p&
72、gt;<p> char wife[NAMEWIDTH];</p><p> char son[NAMEWIDTH];</p><p> char brother[NAMEWIDTH];</p><p><b> }FamType;</b></p><p> typedef struct tnod
73、e</p><p><b> {</b></p><p> char name[NAMEWIDTH];</p><p> struct tnode *lchild,*rchild;</p><p> }BTree;
74、 //家譜樹類型</p><p> BTree *CreatBTree(char *root,FamType fam[],int n) //從fam中(含n個記錄)遞歸創(chuàng)建一棵二叉樹</p><p><b> {</b></p><p> int i=0,j;</p><p> BTree *bt,*p;
75、</p><p> bt=(BTree *)malloc(sizeof(BTree)); //創(chuàng)建父親結(jié)點</p><p> strcpy(bt->name,root);</p><p> bt->lchild=bt->rchild=NULL;</p><p> while(i<n&
76、amp;&strcmp(fam[i].father,root)!=0)</p><p><b> i++;</b></p><p> if(i<n) //找到該姓名的記錄</p><p><b> {</b></p>&
77、lt;p> p=(BTree *)malloc(sizeof(BTree)); //創(chuàng)建母親結(jié)點</p><p> p->lchild=p->rchild=NULL;</p><p> strcpy(p->name,fam[i].wife);</p><p> bt->lchild=p;</p><
78、p> for(j=0;j<n;j++) //找所有兒子</p><p> if(strcmp(fam[j].father,root)==0) //找到一個兒子</p><p><b> {</b></p><p> p->rchild=CreatBTree(fam[j].son
79、,fam,n);</p><p> p=p->rchild;</p><p><b> }</b></p><p><b> }</b></p><p> return(bt);</p><p><b> }</b></p>
80、<p> BTree *FindNode(BTree *bt,char xm[]) //采用線序遞歸算法找name為xm的結(jié)點</p><p><b> {</b></p><p> BTree *p=bt;</p><p> if(p==NULL)</p><p> return(NU
81、LL);</p><p><b> else</b></p><p><b> {</b></p><p> if(strcmp(p->name,xm)==0)</p><p> return(p);</p><p><b> else</b&
82、gt;</p><p><b> {</b></p><p> bt=FindNode(p->lchild,xm);</p><p> if(bt!=NULL)</p><p> return(bt);</p><p><b> else</b></p&
83、gt;<p> return(FindNode(p->rchild,xm));</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void findson1(BTre
84、e *bt,BTree *p)//找p的孩子</p><p><b> {</b></p><p> char xm[NAMEWIDTH];</p><p> if(p==NULL)</p><p> cout<<"沒有孩子!";</p><p><b
85、> else</b></p><p><b> {</b></p><p> p=p->lchild;</p><p> if(p==NULL)</p><p> cout<<"沒有孩子!";</p><p><b>
86、 else</b></p><p><b> {</b></p><p> p=p->rchild;</p><p> if(p==NULL)</p><p> cout<<"沒有兄弟!";</p><p><b> else&
87、lt;/b></p><p><b> {</b></p><p> cout<<"兄弟:";</p><p> while(p!=NULL)</p><p><b> {</b></p><p> cout<<p-
88、>name<<" ";</p><p> p=p->rchild;</p><p><b> }</b></p><p> cout<<endl;</p><p><b> }</b></p><p><
89、b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void FindSon(BTree *bt) //輸出某人的所有兒子</p><p><b> {</b></p>
90、<p> char xm[NAMEWIDTH];</p><p><b> BTree *p;</b></p><p> cout<<" >>父親姓名:";</p><p><b> cin>>xm;</b></p><p>
91、; p=FindNode(bt,xm);</p><p> if(p==NULL)</p><p> cout<<" >>不存在"<<xm<<"的父親!"<<endl;</p><p><b> else</b></p>&
92、lt;p><b> {</b></p><p> p=p->lchild;</p><p> if(p==NULL)</p><p> cout<<" >>"<<xm<<"沒有妻子"<<endl;</p><
93、;p><b> else</b></p><p><b> {</b></p><p> p=p->rchild;</p><p> if(p==NULL)</p><p> cout<<" >>"<<xm<<
94、"沒有兒子!";</p><p><b> else</b></p><p><b> {</b></p><p> cout<<" >>"<<xm<<"的兒子:";</p><p>
95、 while(p!=NULL)</p><p><b> {</b></p><p> cout<<p->name;</p><p> p=p->rchild;</p><p><b> }</b></p><p> cout<<
96、endl;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> BTree *St[MaxSize];&
97、lt;/p><p> int Path(BTree *bt,BTree *s) //采用后續(xù)非遞歸遍歷法輸出從根結(jié)點到*s結(jié)點的路徑</p><p><b> {</b></p><p><b> BTree *p;</b></p><p> int i,flag,top=-1;
98、 //棧指針置初值</p><p><b> do</b></p><p><b> {</b></p><p> while(bt) //將bt的所有左結(jié)點進(jìn)棧</p><p><b> {</b></p><
99、;p><b> top++;</b></p><p> St[top]=bt;</p><p> bt=bt->lchild;</p><p><b> }</b></p><p> p=NULL; //p指向當(dāng)前結(jié)點的前一個已訪問的結(jié)點
100、</p><p> flag=1; //設(shè)置bt的訪問標(biāo)記為已訪問過</p><p> while(top!=-1&&flag)</p><p><b> {</b></p><p> bt=St[top]; //取出當(dāng)前的棧頂元素
101、</p><p> if(bt->rchild==p) //右子樹不存在或已被訪問</p><p><b> {</b></p><p> if(bt==s) //當(dāng)前訪問的結(jié)點為要找的結(jié)點,輸出路徑</p><p><b> {</b><
102、/p><p> cout<<" >>所有祖先:";</p><p> for(i=0;i<top;i++)</p><p> cout<<St[i]->name<<endl;</p><p><b> return 1;</b></
103、p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> top--; </p><p> p=bt; //p指向剛被訪
104、問的結(jié)點</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> bt=bt->rchild;
105、 //bt指向右子樹</p><p> flag=0; //設(shè)置未被訪問的標(biāo)記</p><p><b> }</b></p><p><b> }</b></p><p> }while(top!=-1); //棧
106、不為空時循環(huán)</p><p> return 0; //其他情況時返回0</p><p><b> }</b></p><p> int Path1(BTree *bt,BTree *s) //采用后續(xù)非遞歸遍歷法輸出從根結(jié)點到*s結(jié)點的路徑</p><p><
107、;b> {</b></p><p><b> BTree *p;</b></p><p> int i,flag,top=-1; //棧指針置初值</p><p><b> do</b></p><p><b> {</b>&
108、lt;/p><p> while(bt) //將bt的所有左結(jié)點進(jìn)棧</p><p><b> {</b></p><p><b> top++;</b></p><p> St[top]=bt;</p><p> bt=bt->lch
109、ild;</p><p><b> }</b></p><p> p=NULL; //p指向當(dāng)前結(jié)點的前一個已訪問的結(jié)點</p><p> flag=1; //設(shè)置bt的訪問標(biāo)記為已訪問過</p><p> while(top!=-1
110、&&flag)</p><p><b> {</b></p><p> bt=St[top]; //取出當(dāng)前的棧頂元素</p><p> if(bt->rchild==p) //右子樹不存在或已被訪問</p><p><b> {</
111、b></p><p> if(bt==s) //當(dāng)前訪問的結(jié)點為要找的結(jié)點,輸出路徑</p><p><b> {</b></p><p> for(i=0;i<top;i++)</p><p><b> return 1;</b></p>
112、<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> top--; </p><p> p=bt; //p指向剛被訪問的結(jié)點<
113、;/p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> bt=bt->rchild;
114、 //bt指向右子樹</p><p> flag=0; //設(shè)置未被訪問的標(biāo)記</p><p><b> }</b></p><p><b> }</b></p><p> }while(top!=-1); //棧不為空時循環(huán)&
115、lt;/p><p> return 0; //其他情況時返回0</p><p><b> }</b></p><p> void Ancestor(BTree *bt) //輸出某人所有的祖先</p><p><b> {<
116、;/b></p><p><b> BTree *p;</b></p><p> char xm[NAMEWIDTH];</p><p> cout<<" >>輸入姓名:";</p><p><b> cin>>xm;</b>&l
117、t;/p><p> p=FindNode(bt,xm);</p><p> if(p!=NULL)</p><p> Path(bt,p);</p><p><b> else</b></p><p> cout<<" >>不存在"<<
118、xm;</p><p><b> }</b></p><p> void FindBrother(BTree *bt)</p><p><b> {</b></p><p> char xm[NAMEWIDTH];</p><p> BTree *p,*father
119、;</p><p> cout<<" >>某人的姓名:";</p><p><b> cin>>xm;</b></p><p> p=FindNode(bt,xm);</p><p> Path1(bt,p);
120、 //雙親存在數(shù)組St[MaxSize]</p><p> father=St[0]; </p><p> findson1(bt,father); //調(diào)用findson函數(shù)找兒子 </p><p><b> }</b></p><p&
121、gt; void DelAll(FamType fam[],int &n) //清除家譜文件的全部記錄</p><p><b> {</b></p><p><b> FILE *fp;</b></p><p> if((fp=fopen("fam.dat",&
122、quot;wb"))==NULL)</p><p><b> {</b></p><p> cout<<" >>不能打開家譜文件"<<endl;</p><p><b> return;</b></p><p><b>
123、; }</b></p><p><b> n=0;</b></p><p> fclose(fp);</p><p><b> }</b></p><p> void ReadFile(FamType fam[],int &n) //讀家譜文
124、件并存入fam數(shù)組中</p><p><b> {</b></p><p><b> FILE *fp;</b></p><p> long length;</p><p><b> int i;</b></p><p> if((fp=fop
125、en("fam.dat","rb"))==NULL)</p><p><b> {</b></p><p><b> n=0;</b></p><p><b> return;</b></p><p><b> }<
126、;/b></p><p> fseek(fp,0,2); //家譜文件位置指針移到家譜文件尾</p><p> length=ftell(fp); //length求出家譜文件長度</p><p> rewind(fp);
127、 //家譜文件位置指針移到家譜文件首</p><p> n=length/sizeof(FamType); //n求出家譜文件中的記錄個數(shù)</p><p> for(i=0;i<n;i++)</p><p> fread(&fam[i],sizeof(FamType),1,fp); //將家譜
128、文件中的數(shù)據(jù)讀到fam中</p><p> fclose(fp);</p><p><b> }</b></p><p> void SaveFile(FamType fam[],int n) //將fam數(shù)組存入數(shù)據(jù)家譜文件</p><p><b> {</b>&l
129、t;/p><p><b> int i;</b></p><p><b> FILE *fp;</b></p><p> if((fp=fopen("fam.dat","wb"))==NULL)</p><p><b> {</b>&
130、lt;/p><p> cout<<" >>數(shù)據(jù)家譜文件不能打開"<<endl;</p><p><b> return;</b></p><p><b> }</b></p><p> for(i=0;i<n;i++)</p&g
131、t;<p> fwrite(&fam[i],sizeof(FamType),1,fp);</p><p> fclose(fp);</p><p><b> }</b></p><p> void InputFam(FamType fam[],int &n) //添加一個記錄<
132、/p><p><b> {</b></p><p> cout<<" >>輸入父親、母親和兒子姓名:";</p><p> cin>>fam[n].father>>fam[n].wife>>fam[n].son;</p><p><b
133、> n++;</b></p><p><b> }</b></p><p> void OutputFile(FamType fam[],int n) //輸出簡樸文件的所有記錄</p><p><b> {</b></p><p><b>
134、int i;</b></p><p><b> if(n<0)</b></p><p><b> {</b></p><p> cout<<" >>沒有任何記錄!"<<endl;</p><p><b> r
135、eturn;</b></p><p><b> }</b></p><p> for(i=0;i<n;i++)</p><p> cout<<fam[i].father<<fam[i].wife<<fam[i].son;</p><p><b> }
136、</b></p><p> void main()</p><p><b> {</b></p><p> BTree *bt;</p><p> BTree *p,*father;</p><p> FamType fam[MaxSize];</p><
137、p> int n,sel,sell;</p><p> char xm[NAMEWIDTH];</p><p> ReadFile(fam,n);</p><p><b> do</b></p><p><b> {</b></p><p> cout<
138、;<"1.文件 2:家譜 0:退出 請選擇: ";</p><p><b> cin>>sel;</b></p><p> switch(sel)</p><p><b> {</b></p><p><b> case 1:</b&
139、gt;</p><p><b> do</b></p><p><b> {</b></p><p> cout<<"1:輸入 2:輸出 9:全清 0:存盤返回 請選擇: ";</p><p> cin>>sell;</p><
140、;p> switch(sell)</p><p><b> {</b></p><p><b> case 9:</b></p><p> DelAll(fam,n);</p><p><b> break;</b></p><p>&l
141、t;b> case 1:</b></p><p> InputFam(fam,n);</p><p><b> break;</b></p><p><b> case 2:</b></p><p> OutputFile(fam,n);</p><p
142、><b> break;</b></p><p><b> case 0:</b></p><p> SaveFile(fam,n);</p><p><b> break;</b></p><p><b> }</b></p>
143、<p> }while(sell!=0);</p><p><b> break;</b></p><p><b> case 2:</b></p><p> bt=CreatBTree("f1",fam,n);</p><p><b> do&
144、lt;/b></p><p><b> {</b></p><p> cout<<" 1:找某人所有兒子 2:找某人所有祖先 3:查找某人所有兄弟 0:返回 請選擇:";</p><p> cin>>sell;</p><p> switch(sell)<
145、/p><p><b> {</b></p><p><b> case 1:</b></p><p> FindSon(bt);</p><p><b> break;</b></p><p><b> case 2:</b>
146、</p><p> cout<<">>";</p><p> Ancestor(bt);</p><p> cout<<endl;</p><p><b> break;</b></p><p><b> case 3:&
147、lt;/b></p><p> cout<<">>";</p><p> FindBrother(bt);</p><p> cout<<endl;</p><p><b> break;</b></p><p><b&g
148、t; }</b></p><p> }while(sell!=0);</p><p><b> break;</b></p><p><b> }</b></p><p> }while(sel!=0);}</p><p><b> 數(shù)據(jù)結(jié)構(gòu)
149、課程設(shè)計</b></p><p><b> 成績評定</b></p><p> 成績評定: (百分制)</p><p> 指導(dǎo)教師簽字: </p><p> 檢查時間:
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---飛機(jī)訂票系統(tǒng)設(shè)計與實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---哈希表的設(shè)計與實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--程序的設(shè)計與實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---火車售票系統(tǒng)的實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---城市鏈表的設(shè)計與實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--散列表的設(shè)計與實現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---數(shù)據(jù)結(jié)構(gòu)相關(guān)算法的演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
評論
0/150
提交評論