數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告家族關(guān)系查詢系統(tǒng)_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告家族關(guān)系查詢系統(tǒng)_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告家族關(guān)系查詢系統(tǒng)_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告家族關(guān)系查詢系統(tǒng)_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告家族關(guān)系查詢系統(tǒng)_第5頁
已閱讀5頁,還剩20頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、-. z1 課程設(shè)計(jì)介紹 1.1課程設(shè)計(jì)工程簡(jiǎn)介 家譜是一種以表譜形式,記載一個(gè)以血緣關(guān)系為主體的家族世系繁衍和重要人物事跡的特殊圖書載體。家譜是中國特有的文化遺產(chǎn),是中華民族的三大文獻(xiàn)之一,屬珍貴的人文資料,對(duì)于歷史學(xué),民俗學(xué),人口學(xué),社會(huì)學(xué)和經(jīng)濟(jì)學(xué)的深入研究,均有不可替代的重要功能。本工程對(duì)家譜管理進(jìn)展簡(jiǎn)單的模擬,以實(shí)現(xiàn)查看祖先和子個(gè)人信息 、插入家族成員等功能。 1.2課設(shè)題目分析本程序的實(shí)質(zhì)是完成對(duì)家譜成員信息的建立、查找、插入等功能??梢允紫榷x家族成員的數(shù)據(jù)構(gòu)造,然后將每個(gè)功能寫成一個(gè)函數(shù)來完成對(duì)數(shù)據(jù)的操作,最后完成主函數(shù)以驗(yàn)證各個(gè)函數(shù)功能并得出運(yùn)行結(jié)果。本程序包含以下幾個(gè)模塊建立

2、家族關(guān)系樹。此模塊將構(gòu)建一個(gè)家族關(guān)系,對(duì)數(shù)據(jù)初始化,構(gòu)造關(guān)系樹并錄入數(shù)據(jù)一遍后續(xù)程序使用。添加新成員。此模塊將添加一個(gè)新成員,實(shí)現(xiàn)對(duì)家族關(guān)系的修改。家族關(guān)系的查詢。此模塊將實(shí)現(xiàn)對(duì)家族不同關(guān)系的查詢主程序模塊。此模塊實(shí)現(xiàn)整個(gè)程序的進(jìn)入和進(jìn)出,以及各種初始化處理。1.3課程題目原理與數(shù)據(jù)構(gòu)造 因?yàn)榧易宓某蓡T之間存在一個(gè)對(duì)多個(gè)的層次構(gòu)造關(guān)系,所以不能用線性表來表示和實(shí)現(xiàn)。家譜從形狀上看像一顆倒長的樹,所以用樹構(gòu)造來表示比擬適宜。樹形構(gòu)造是一類非常重要的非線性數(shù)據(jù)構(gòu)造,直觀看來樹是以分支關(guān)系定義的層次構(gòu)造。 因此本課程設(shè)計(jì)可以采用的數(shù)據(jù)構(gòu)造有樹狀構(gòu)造和隊(duì)列。樹狀構(gòu)造采用三叉鏈表來實(shí)現(xiàn),隊(duì)列采用鏈?zhǔn)疥?duì)列

3、實(shí)現(xiàn)。1.4功能分析說明圖家族關(guān)系查詢系統(tǒng)退出系統(tǒng)翻開一個(gè)家族關(guān)系按關(guān)系查找各個(gè)家庭成員建立一個(gè)家族關(guān)系添加一個(gè)家庭成員查找一個(gè)成員的兄弟查找一個(gè)成員的祖先查找成員的子*后代查找一個(gè)成員的孩子查找成員的堂兄弟查找成員祖先路徑查找成員是第幾代查找一個(gè)成員雙親2 分析與實(shí)現(xiàn) 2.1 根本數(shù)據(jù)構(gòu)造和棧隊(duì)的操作 結(jié)點(diǎn)根本數(shù)據(jù)構(gòu)造和鏈隊(duì)的定義/*家族關(guān)系樹實(shí)現(xiàn)*/#include#include#include#include#include#include#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR -1#

4、define INFEASIBLE -1typedefchar DataType;#define MA*NUM 20typedefstruct TriTNode/* 樹的三叉鏈表存儲(chǔ)構(gòu)造*/ DataType dataMA*NUM;struct TriTNode *parent;/* 雙親*/struct TriTNode *lchild;/* 左孩子*/struct TriTNode *rchild;/* 右孩子*/TriTree;typedefstruct Node/* 隊(duì)列的結(jié)點(diǎn)構(gòu)造*/ TriTree *info;struct Node *ne*t;Node;typedefstruct

5、/* 隊(duì)列類型定義*/struct Node *front; /* 頭指針*/struct Node *rear; /* 尾指針*/LinkQueue;DataType fnameMA*NUM,family50MA*NUM;/* 全局變量*/ 鏈隊(duì)的根本操作LinkQueue *LQueueCreateEmpty( )/* 建立一個(gè)空隊(duì)列*/ LinkQueue *plqu=(LinkQueue *)malloc(sizeof(LinkQueue);if (plqu!=NULL) plqu-front=plqu-rear=NULL;elseprintf(存缺乏!n);return NULL;r

6、eturn plqu;int LQueueIsEmpty(LinkQueue *plqu)/* 判斷表示隊(duì)列是否為空隊(duì)列*/return(plqu-front=NULL);void LQueueEnQueue(LinkQueue *plqu,TriTree *)/* 進(jìn)隊(duì)列*/ Node *p=(Node *)malloc(sizeof(Node);if(p=NULL) printf(存分配失??!n);else p-info=*; p-ne*t=NULL;if(plqu-front=NULL)/* 原來為空隊(duì)*/ plqu-front=p;else plqu-rear-ne*t=p; plqu

7、-rear=p; int LQueueDeQueue(LinkQueue *plqu,TriTree *)/* 出隊(duì)列*/ Node *p;if(plqu-front=NULL)printf(隊(duì)列空!n);return ERROR;else p=plqu-front;*=p-info; plqu-front=plqu-front-ne*t; free(p);return OK; TriTree *LQueueGetFront(LinkQueue *plqu)/* 在非空隊(duì)列中求隊(duì)頭元素*/ return(plqu-front-info);2.2建立家族關(guān)系 建立家族關(guān)系并存入文件 根本思想:首

8、先輸入家族關(guān)系的名稱,以此名稱為文件名,建立文本文件接下來按層次輸入結(jié)點(diǎn)信息,輸入一個(gè)在文件中寫入一行同時(shí)將輸入的信息保存 到二位字符數(shù)組family中。字符數(shù)組family是全局變量,存儲(chǔ)臨時(shí)信息 . 注意,輸入時(shí)每個(gè)結(jié)點(diǎn)信息占一行,一個(gè)結(jié)點(diǎn)有多個(gè)兄弟,以作為兄弟完畢標(biāo)志,結(jié)點(diǎn)假設(shè)無孩子,直接以代替。依次輸入各節(jié)點(diǎn)信息,以# 作為完畢標(biāo)志。最后使用函數(shù)CreateTriTree建立家族關(guān)系樹.li*ianliguoyu liguojun liguoqiangliyongzhi liyongrui liyongmingliwende liwenjia TriTree *Create(DataT

9、ype familynameMA*NUM)/* 建立家族關(guān)系并存入文件*/int i=0; /* i控制family數(shù)組下標(biāo)*/DataType ch,strMA*NUM;/* ch存儲(chǔ)輸入的y或n,str存儲(chǔ)輸入的字符串*/TriTree *t;FILE *fp;strcpy(fname,familyname); /* 以家族名為文本文件名存儲(chǔ)*/strcat(fname,.t*t);fp=fopen(fname,r); /* 以讀取方式翻開文件*/if(fp) /* 文件已存在*/fclose(fp);printf(%s 的家族關(guān)系已存在!重新建立請(qǐng)按Y,直接翻開請(qǐng)按Nn,familyna

10、me);ch=getchar();getchar(); /* 接收回車*/if(ch=N|ch=n)t=Open(familyname);/* 直接翻開*/return t;if(!fp|ch=Y|ch=y) /* 重新建立,執(zhí)行以下操作*/fp=fopen(fname,w); /* 以寫入方式翻開文件,不存在則新建*/printf(請(qǐng)按層次輸入結(jié)點(diǎn),每個(gè)結(jié)點(diǎn)信息占一行n);printf(兄弟輸入完畢以為標(biāo)志,完畢標(biāo)志為#n. );gets(str);fputs(str,fp);fputc(n,fp);strcpy(familyi,str); /* 將成員信息存儲(chǔ)到字符數(shù)組中*/i+; /*

11、family數(shù)組下標(biāo)后移*/while(str0!=#) printf(. );/* 以點(diǎn)提示符提示繼續(xù)輸入*/gets(str);fputs(str,fp); /* 寫到文件中,每個(gè)信息占一行*/fputc(n,fp);strcpy(familyi,str);/* 將成員信息存儲(chǔ)到字符數(shù)組中*/i+; /* family數(shù)組下標(biāo)后移*/fclose(fp); /* 關(guān)閉文件*/t=TriTreeCreate(); /* 根據(jù)family數(shù)組信息創(chuàng)立三叉樹*/printf(家族關(guān)系已成功建立!n);return t; /* 返回樹*/建立家族關(guān)系樹根本思想:采用指針數(shù)組作為指針,保存輸入的結(jié)點(diǎn)

12、地址。隊(duì)列的尾指針指向當(dāng)前結(jié)點(diǎn)。頭指針指向當(dāng)前結(jié)點(diǎn)的雙親結(jié)點(diǎn)。輸入的結(jié)點(diǎn)信息已存儲(chǔ)在字符數(shù)組family中。將信息復(fù)制到字符串?dāng)?shù)組ch中 ,如果ch不是,則建立一個(gè)新結(jié)點(diǎn)。假設(shè)新結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn),則它是根結(jié)點(diǎn),將其入隊(duì),指針tree指向這個(gè)根節(jié)點(diǎn);如果不是根結(jié)點(diǎn),則將當(dāng)前結(jié)點(diǎn)到雙親結(jié)點(diǎn)上,即當(dāng)前結(jié)點(diǎn)的雙親指針就是隊(duì)頭元素,然后將當(dāng)前結(jié)點(diǎn)入隊(duì)列。接著判斷flag的值,如果flag=0,表示當(dāng)前結(jié)點(diǎn)沒有左孩子,則當(dāng)前結(jié)點(diǎn)就是雙親的左孩子。否則,當(dāng)前結(jié)點(diǎn)就是雙親的右孩子。用指針root指向剛剛?cè)腙?duì)的結(jié)點(diǎn)。繼續(xù)復(fù)制數(shù)組family的下個(gè)元素。如果ch 是。則flag=0因?yàn)楹竺娴牡谝粋€(gè)孩子為左孩子,同

13、時(shí)判斷是否是第一次出現(xiàn),如果是第一次,則令標(biāo)志star=1;如果不是第一次出現(xiàn)。則出隊(duì)列,root指向隊(duì)頭元素實(shí)際上root總是指向雙親結(jié)點(diǎn)。繼續(xù)復(fù)制family的下一個(gè)元素。知道遇到#完畢。函數(shù)返回指針tree。/* 建立家族關(guān)系樹*/TriTree *TriTreeCreate()TriTree *t,*=NULL,*tree,*root=NULL;LinkQueue *q=LQueueCreateEmpty();/* 建立一個(gè)空的隊(duì)列,存儲(chǔ)指向樹的指針*/int i=0,flag=0,start=0;DataType strMA*NUM; /* 存放family數(shù)組息*/strcpy(s

14、tr,familyi); /* 復(fù)制*/i+; /* family數(shù)組下標(biāo)后移*/while(str0!=#) /* 沒遇到完畢標(biāo)志繼續(xù)循環(huán)*/while(str0!=) /* 沒遇到兄弟輸入完畢標(biāo)志繼續(xù)*/if(root=NULL) /* 空樹*/root=(TriTree *)malloc(sizeof(TriTree);/* 申請(qǐng)空間*/strcpy(root-data,str);root-parent=NULL;root-lchild=NULL;root-rchild=NULL;LQueueEnQueue(q,root); /* 將root存入隊(duì)列*/tree=root;else/*

15、不為空樹*/t=(TriTree *)malloc(sizeof(TriTree); /* 申請(qǐng)空間*/strcpy(t-data,str);t-lchild=NULL;t-rchild=NULL;t-parent=LQueueGetFront(q); /* 當(dāng)前結(jié)點(diǎn)的雙親為隊(duì)頭元素*/LQueueEnQueue(q,t); /* 入隊(duì)*/if(!flag) /* flag為,當(dāng)前結(jié)點(diǎn)沒有左孩子*/root-lchild=t;else/* flag為,當(dāng)前結(jié)點(diǎn)已有左孩子*/root-rchild=t;root=t; /* root指向新的結(jié)點(diǎn)t */flag=1; /* 標(biāo)記當(dāng)前結(jié)點(diǎn)已有左孩子

16、*/strcpy(str,familyi); i+;if(start!=0) /* 標(biāo)記不是第一次出現(xiàn)*/LQueueDeQueue(q,*); /* 出隊(duì)*/if(q-front!=NULL)root=LQueueGetFront(q);/* root為隊(duì)頭元素*/start=1; /* 標(biāo)記已出現(xiàn)過*/flag=0; /* 后面的結(jié)點(diǎn)一定為左孩子*/strcpy(str,familyi);i+;return tree; /* 返回樹*/2.3翻開一個(gè)家族關(guān)系 首先輸入家族關(guān)系名,以家族名為文件名翻開文件,如果家族關(guān)系不存在,返回空;如果存在,文件翻開,讀取文件。將文件的每行信息依次存儲(chǔ)在數(shù)

17、組family【】中。/* 翻開一個(gè)家族關(guān)系*/TriTree *Open(DataType familynameMA*NUM)int i=0,j=0;DataType ch;FILE *fp;TriTree *t;strcpy(fname,familyname); /* 以家族名為文本文件名存儲(chǔ)*/strcat(fname,.t*t);fp=fopen(fname,r); /* 以讀取方式翻開文件*/if(fp=NULL) /* 文件不存在*/printf(%s 的家族關(guān)系不存在!n,familyname);return NULL;elsech=fgetc(fp); /* 按字符讀取文件*/

18、while(ch!=EOF) /* 讀到文件尾完畢*/if(ch!=n) /* ch不為一個(gè)結(jié)點(diǎn)信息的結(jié)尾*/familyij=ch; /* 將文件信息存儲(chǔ)到family數(shù)組中*/j+; elsefamilyij=0;/* 字符串完畢標(biāo)志*/i+; /* family數(shù)組行下標(biāo)后移*/j=0; /* family數(shù)組列下標(biāo)歸零*/ch=fgetc(fp); /* 繼續(xù)讀取文件信息*/fclose(fp); /* 關(guān)閉文件*/t=TriTreeCreate(family); /* 調(diào)用函數(shù)建立三叉鏈表*/printf(家族關(guān)系已成功翻開!n);return t;2.4在家族關(guān)系中查找一個(gè)成員是否

19、存在用遞歸算法實(shí)現(xiàn)。如果樹空,返回NULL。如果根節(jié)點(diǎn)就是要查找的成員,返回根節(jié)點(diǎn);否則,遞歸查找它的左右子樹。/* 查找一個(gè)成員是否存在*/TriTree *Search(TriTree *t,DataType str) TriTree *temp;if(t=NULL) /* 如果樹空則返回NULL */return NULL;elseif(strcmp(t-data,str)=0) /* 如果找到返回該成員指針*/return t; else/* 如果沒找到遍歷左右子樹進(jìn)展查找*/temp=Search(t-lchild,str); /* 遞歸查找*/if(temp) /* 結(jié)點(diǎn)不空則查找

20、*/return(Search(t-lchild,str);elsereturn(Search(t-rchild,str);2.5 向家族中添加一個(gè)新成員根本思想:添加的新成員要根據(jù)其雙親確定其在家族中的位置。首先判斷該雙親是否在此家族關(guān)系中,假設(shè)存在則查找其雙親,將新結(jié)點(diǎn)插入其雙親的最后一個(gè)孩子之后;假設(shè)沒有孩子,則直接作為左孩子插入。以寫入的方式翻開文件,如果成功翻開,則更新family數(shù)組中的信息,并查找新成員的雙親所在位置和其對(duì)應(yīng)的個(gè)數(shù),如果個(gè)數(shù)小于雙親位置,則添加實(shí)質(zhì)相等,新成員不插入到最后之前。最后將family數(shù)組息寫入文件保存,關(guān)閉文件。/* 添加一個(gè)新成員*/void App

21、end(TriTree *t)int i=0,j,parpos=1,curpos,num,end=0,count=-1;DataType chiMA*NUM,parMA*NUM;/* 存儲(chǔ)輸入的孩子和其雙親結(jié)點(diǎn)*/TriTree *tpar,*temp;FILE *fp;printf(請(qǐng)輸入要添加的成員和其父親,以回車分隔!n. );gets(chi);printf(. ); /* 以點(diǎn)提示符提示繼續(xù)輸入*/gets(par);tpar=Search(t,par); /* 查找雙親結(jié)點(diǎn)是否存在*/if(!tpar)printf(%s 該成員不存在!n);else/* 存在則添加其孩子*/tem

22、p=(TriTree *)malloc(sizeof(TriTree);/* 申請(qǐng)空間*/temp-parent=tpar; strcpy(temp-data,chi);temp-lchild=NULL; /* 新結(jié)點(diǎn)左右孩子置空*/temp-rchild=NULL;if(tpar-lchild) /* 成員存在左孩子*/tpar=tpar-lchild; /* 遍歷當(dāng)前成員左孩子的右子樹*/while(tpar-rchild) /* 當(dāng)前結(jié)點(diǎn)右孩子存在*/tpar=tpar-rchild; /* 繼續(xù)遍歷右孩子*/tpar-rchild=temp; /* 將新結(jié)點(diǎn)添加到所有孩子之后*/ el

23、se/* 沒有孩子則直接添加*/tpar-lchild=temp;fp=fopen(fname,w); /* 以寫入方式翻開文件*/if(fp)while(strcmp(par,familyi)!=0&familyi0!=#)if(familyi0!=) /* 查找雙親在數(shù)組中位置*/parpos+; /* parpos計(jì)數(shù)*/i+; /* family數(shù)組行下標(biāo)后移*/i=0; /* family數(shù)組行下標(biāo)歸*/while(familyi0!=#)if(familyi0=) /* 查找的個(gè)數(shù),第一個(gè)不計(jì)*/count+; /* count累加個(gè)數(shù)*/if(count=parpos) /* 說

24、明此與其前一個(gè)之前為par的孩子*/curpos=i; /* curpos計(jì)當(dāng)前位置*/i+; /* family數(shù)組行下標(biāo)后移*/if(countparpos) /* 數(shù)小于parpos數(shù)*/num=parpos-count; /* 添加個(gè)數(shù)為num */for(j=i;j=curpos;j-) /* 當(dāng)前位置到數(shù)組最后的全部信息后移一行*/strcpy(familyj+1,familyj);strcpy(familycurpos,chi); /* 將新結(jié)點(diǎn)存儲(chǔ)到的前一行*/if(end=1) /* 假設(shè)end為,則數(shù)組末尾下標(biāo)后移num位*/i=i+num;for(j=0;jdata);

25、查找一個(gè)成員的所有祖先路徑查找一個(gè)成員的所有祖先路徑,需要從它的雙親一直向上查找到根結(jié)點(diǎn)。根本思想:對(duì)與結(jié)點(diǎn)t,先判斷它是否是根結(jié)點(diǎn)根節(jié)點(diǎn)的雙親是NULL,如果是根結(jié)點(diǎn),直接輸出它本身;如果不是,查找它的雙親指針指向的結(jié)點(diǎn),將雙親信息輸出。繼續(xù)查找,直到找到根結(jié)點(diǎn)。/* 查找一個(gè)成員的所有祖先*/void AncesstorPath(TriTree *t)if(t-parent=NULL) /* 假設(shè)該成員為祖先,則直接輸出*/printf(%s 無祖先!n,t-data);else/* 否則繼續(xù)查找祖先*/printf(%s 所有祖先路徑:%s,t-data,t-data);while(t-

26、parent!=NULL)/* 假設(shè)當(dāng)前成員的雙親不是祖先,則繼續(xù)查找*/printf( - %s,t-parent-data);/* 當(dāng)前成員的雙親*/t=t-parent; /* 繼續(xù)循環(huán)查找*/printf(n); 查找一個(gè)成員的雙親根本思想:先判斷結(jié)點(diǎn)t是否是根結(jié)點(diǎn),過不是根結(jié)點(diǎn),直接輸出該結(jié)點(diǎn)雙親指針的結(jié)點(diǎn)信息;假設(shè)是根結(jié)點(diǎn),輸出提示信息,結(jié)點(diǎn)無雙親。/* 查找一個(gè)成員的雙親*/void Parent(TriTree *t)if(t-parent!=NULL) /* 假設(shè)該成員為祖先,則無雙親*/printf(%s 的雙親為%sn,t-data,t-parent-data);else

27、printf(%s 無雙親!n,t-data); 確定一個(gè)成員是第幾代確定一個(gè)成員是第幾代,只要知道從它本身到根結(jié)點(diǎn)包括的祖先個(gè)數(shù)就可。因而對(duì)于跟結(jié)點(diǎn)t,從它本身開場(chǎng)一直向上查找到根結(jié)點(diǎn),查找的過程中用變量count初值為1計(jì)數(shù),最后輸出 count。/* 確定一個(gè)成員是第幾代*/void Generation(TriTree *t)int count=1; /* 計(jì)數(shù)*/DataType strMA*NUM;strcpy(str,t-data); /* 存儲(chǔ)當(dāng)前信息*/while(t-parent!=NULL)/* 查找其雙親*/count+; /* 累加計(jì)數(shù)*/t=t-parent;pri

28、ntf(%s 是第%d 代!n,str,count); 查找一個(gè)成員的兄弟 一個(gè)成員的為其雙親除了該成員以外的所有孩子。 根本思想:對(duì)于結(jié)點(diǎn)t,先判斷它是否是跟結(jié)點(diǎn),假設(shè)是根結(jié)點(diǎn),則無兄弟;假設(shè)不是根結(jié)點(diǎn),則找到結(jié)點(diǎn)t的雙親。接著判斷雙親的左孩子和左孩子的兄弟是否都存在假設(shè)只有左孩子,左孩子就是要查找的這個(gè)成員,如果都不存在,則無兄弟;如果都存在,對(duì)雙親的左孩子操作。假設(shè)左孩子不是要查找的這個(gè)成員,則將結(jié)點(diǎn)信息輸出。接下來查找左孩子的右兄弟,判斷當(dāng)前結(jié)點(diǎn)是否是要查找的這個(gè)成員,假設(shè)不是,則將結(jié)點(diǎn)信息輸出,繼續(xù)查找當(dāng)前結(jié)點(diǎn)的右兄弟,直到NULL為止。/* 查找一個(gè)成員的兄弟*/void Brot

29、hers(TriTree *t,DataType str) /* 查找兄弟*/ if(t-parent!=NULL) /* 假設(shè)該結(jié)點(diǎn)是祖先,則無兄弟*/t=t-parent; /* 該結(jié)點(diǎn)的兄弟即為其雙親除該成員以外的所有孩子*/if(t-lchild&t-lchild-rchild) /* 當(dāng)前結(jié)點(diǎn)的左孩子及其右孩子都存在*/printf(%s 的所有兄弟有:,str);t=t-lchild; while(t) /* 遍歷當(dāng)前成員左孩子的右子樹*/ if(strcmp(t-data,str)!=0) /* 遍歷右子樹,選擇輸出*/printf(%s ,t-data); /* 當(dāng)前結(jié)點(diǎn)*/t

30、=t-rchild;printf(n);elseprintf(%s 無兄弟!n,str);elseprintf(%s 無兄弟!n,str); 查找一個(gè)成員的堂兄弟 一個(gè)成員的堂兄弟為其雙親的雙親結(jié)點(diǎn)的所有孩子的孩子該成員除外. 根本思想:如果結(jié)點(diǎn)t的雙親和雙親的雙親爺爺都存在,首先考慮爺爺?shù)淖蠛⒆印H绻麪敔數(shù)淖蠛⒆硬皇墙Y(jié)點(diǎn)t的雙親,則爺爺還有其他孩子?,F(xiàn)對(duì)爺爺?shù)淖蠛⒆拥淖蠛⒆?,如果不是結(jié)點(diǎn)t就輸出。同樣,對(duì)爺爺左孩子的左孩子的右孩子、右孩子的右孩子一直下去,直到無右孩子為止。如果爺爺還有其他孩子,則就對(duì)爺爺?shù)淖蠛⒆拥挠液⒆?、爺爺?shù)淖蠛⒆拥挠液⒆拥挠液⒆?即對(duì)爺爺?shù)钠渌⒆幼鲆粯拥奶幚怼?* 查

31、找一個(gè)成員的堂兄弟*/void Consin(TriTree *t)int flag=0;TriTree *ch=t;TriTree *temp;if(t-parent&t-parent-parent)/* 當(dāng)前結(jié)點(diǎn)的雙親及其雙親都存在*/t=t-parent-parent-lchild;/* 當(dāng)前結(jié)點(diǎn)等于其祖先的第一個(gè)孩子*/while(t) /* 存在則繼續(xù)查找*/ if(strcmp(t-data,ch-parent-data)!=0)/* 不是同一結(jié)點(diǎn)*/if(t-lchild) /* 當(dāng)前結(jié)點(diǎn)存在左孩子*/temp=t-lchild;while(temp) /* 遍歷當(dāng)前結(jié)點(diǎn)左孩子的

32、右子樹*/ if(strcmp(temp-data,ch-data)!=0)if(!flag) /* 第一次輸入時(shí)先輸出下句*/printf(%s 的所有堂兄弟有:,ch-data);printf(%s ,temp-data);/* 當(dāng)前成員*/flag=1;temp=temp-rchild; /* 繼續(xù)遍歷右孩子*/t=t-rchild; /* 繼續(xù)遍歷右孩子*/printf(n);if(!flag) /* 標(biāo)志沒有輸出結(jié)點(diǎn)*/printf(%s 無堂兄弟!n,ch-data); 查找一個(gè)成員的所有孩子 一個(gè)成員的所有孩子包括左孩子和左孩子的右孩子、左孩子的右孩子的右孩子-直到右孩子為空為止

33、。 根本思想:首先判斷結(jié)點(diǎn)t是否有左孩子,如果沒有,輸出沒有孩子;如果有左孩子,輸出左孩子的信息,然后判斷左孩子的右孩子是否為空,假設(shè)不為空存在右孩子,輸出左孩子的右孩子的信息,接著循環(huán)判斷結(jié)點(diǎn)是否有右孩子,有就輸出,直到右孩子為空。/* 查找一個(gè)成員的所有孩子*/void Children(TriTree *t) /* 遍歷左孩子*/ if(t-lchild) /* 當(dāng)前結(jié)點(diǎn)存在左孩子*/printf(%s 的所有孩子有:,t-data);t=t-lchild; /* 遍歷當(dāng)前成員左孩子的右子樹*/while(t) /* 不空*/ printf(%s ,t-data);/* 當(dāng)前成員*/t=

34、t-rchild; printf(n);elseprintf(%s 無孩子!n,t-data);/* 中序遍歷一棵樹*/void InOrder(TriTree *t) if(t) /* 二叉樹存在*/InOrder(t-lchild); /* 中序遍歷左子樹*/printf(%s ,t-data);/* 成員*/InOrder(t-rchild); /* 中序遍歷右子樹*/ 查找一個(gè)成員的子后代 一個(gè)成員的子后代就是其左子樹上的所有結(jié)點(diǎn),所以對(duì)其左子樹進(jìn)展中序遍歷即可。/* 查找一個(gè)成員的子后代*/void Descendants(TriTree *t) /* 遍歷左孩子*/ if(t-lc

35、hild) /* 當(dāng)前結(jié)點(diǎn)存在左孩子*/printf(%s 的所有子后代有:,t-data);InOrder(t-lchild); /* 中序遍歷當(dāng)前結(jié)點(diǎn)的左右子樹*/printf(n);elseprintf(%s 無后代!n,t-data);2.7 各軟件之間的調(diào)用方式該軟件各個(gè)模塊的調(diào)用主要是通過聲明函數(shù),和定義函數(shù)再通過主函數(shù)調(diào)用實(shí)現(xiàn)的。主函數(shù):/* 主控函數(shù)*/int main(int argc,char* argv)DataType strMA*NUM=0,input40;int i,j,flag,start=0,pos,tag1,tag2;TriTree *temp,*tree=N

36、ULL;while(1)printf(t歡送使用家族關(guān)系查詢系統(tǒng)!n);printf(t請(qǐng)輸入與之匹配的函數(shù)和參數(shù),如parent(C)n);printf(t 1.新建一個(gè)家庭關(guān)系: Create(familyname) 參數(shù)為字符串n);printf(t 2.翻開一個(gè)家庭關(guān)系: Open(familyname) 參數(shù)為字符串n);printf(t 3.添加新成員的信息: Append() 無參數(shù)n);printf(t 4.查找一個(gè)成員的祖先: Ancesstor(name) 參數(shù)為字符串n);printf(t 5.查找一個(gè)成員的祖先路徑:AncesstorPath(name) 參數(shù)為字符串n

37、);printf(t 6.確定一個(gè)成員是第幾代: Generation(name) 參數(shù)為字符串n);printf(t 7.查找一個(gè)成員的雙親: Parent(name) 參數(shù)為字符串n);printf(t 8.查找一個(gè)成員的兄弟: Brothers(name) 參數(shù)為字符串n);printf(t 9.查找一個(gè)成員的堂兄弟: Consin(name) 參數(shù)為字符串n);printf(t10.查找一個(gè)成員的孩子: Children(name) 參數(shù)為字符串n);printf(t11.查找一個(gè)成員的子后代:Descendants(name) 參數(shù)為字符串n);printf(t12.退出系統(tǒng): E*it() 無參數(shù)n );gets(input); /* input數(shù)組存放輸入的函數(shù)和參數(shù)*/j=0,tag1=0,tag2=0;for(i=0;i=4&flag=11) /* 函數(shù)需要字符串型參數(shù)name */temp=Search(tree,str);/* 假設(shè)存在則返回結(jié)點(diǎn)*/if(!temp)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論