家譜管理系統(tǒng)(含源代碼)(優(yōu).選)_第1頁(yè)
家譜管理系統(tǒng)(含源代碼)(優(yōu).選)_第2頁(yè)
家譜管理系統(tǒng)(含源代碼)(優(yōu).選)_第3頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、家譜管理系統(tǒng) C 語(yǔ)言(數(shù)據(jù)結(jié)構(gòu))目的和要求:樹形結(jié)構(gòu)是一種非常重要的非線性結(jié)構(gòu),它用于描述數(shù)據(jù)元素之間 的層次關(guān)系,人類家譜是樹形結(jié)構(gòu)的典型體現(xiàn),通過(guò)此項(xiàng)訓(xùn)練讓學(xué)生掌握樹形結(jié) 構(gòu)的知識(shí);使學(xué)生重點(diǎn)掌握樹與二叉樹的轉(zhuǎn)換,二叉樹的存儲(chǔ)和遍歷,和二叉樹 相關(guān)的一些運(yùn)算;要求完成家譜信息的錄入和保存,任意成員的查找及某一成員 祖先、子孫、兄弟、堂兄弟的查找。排答疑和輔導(dǎo)。完整代碼:#include #include #include int MATEFLAG=0; /是否入贅或嫁入這家的, 1 表示為是, 0 表示否typedef struct TreeNode/ 樹節(jié)點(diǎn)定義int Num;/ 保存

2、此人兒女個(gè)數(shù)char Name20; / 保存此人姓名char Kind; / 保存此人性別,男 M ,女 Fstruct TreeNode * NextNode20; / 保存此人的兒女 ,NextNode0 里存放配偶的地址 struct TreeNode * Parent;/ 保存此節(jié)點(diǎn)的父節(jié)點(diǎn)TreeNode;void CreatTree(TreeNode *Tree);/ 創(chuàng)建樹void OutPutAll(TreeNode *Tree);/ 輸出樹TreeNode * SearchTree(TreeNode *Tree,char name,int length);void Main

3、Menu(TreeNode *Tree);void SubMenue1(TreeNode * Tree);void SubMenue2(TreeNode *Tree);void Change(TreeNode * Tree);void AddNew(TreeNode * Tree);void OutPutMessage(TreeNode * Tree,char name,int length);/ 主函數(shù)void main()TreeNode *Tree;/ 產(chǎn)生根節(jié)點(diǎn)Tree=(TreeNode *)malloc(sizeof(TreeNode);Tree-Parent =NULL;strc

4、py(Tree-Name,0);MainMenu(Tree);/ 顯示主菜單/ 添加新的成員void AddNew(TreeNode * Tree)SubMenue2(Tree);/ 添加新成員界面/ 顯示添加家庭信息的界面void SubMenue2(TreeNode *Tree)char c;int num;char name20;TreeNode * NewNode; getchar();while(1) system(cls);printf( 請(qǐng)選擇你的操作 n);printf(A: 添加某個(gè)人的子女的信息 n);printf(B: 添加某個(gè)人配偶的信息 n);printf(C: 退出

5、 n);printf( 請(qǐng)選擇相應(yīng)功能: n); c=getchar();switch(c)case A: / 添加子女信息 printf( 請(qǐng)輸入那個(gè)人的名字 :n); scanf(%s,name);Tree=SearchTree(Tree ,n ame,20); 在家譜里查找這個(gè)人 if(Tree=NULL)printf(該家譜圖中沒有%s這個(gè)人的信息請(qǐng)確認(rèn)是否輸入錯(cuò)誤n,name);break;if(Tree-Parent=NULL&Tree-NextNode0=NULL|Tree-Parent!=NULL&Tree-N ame!=Tree-Parent-NextNode0-Name)p

6、rintf( 至今還沒有配偶請(qǐng)先添加配偶 n,Tree-Name);break;if(Tree-Parent=NULL&(Tree-Num20|Tree-NumNum=0;if(MATEFLAG=1)Tree=Tree-Parent;NewNode=(TreeNode *)malloc(sizeof(TreeNode);printf( 請(qǐng)輸入添加人員姓名 :n); scanf(%s,NewNode-Name);printf( 請(qǐng)輸入添加人員性別女 F 男 M:n);scanf(%1s,&NewNode-Kind); num=Tree-Num;NewNode-NextNode0=(TreeNod

7、e *)malloc(sizeof(TreeNode);NewNode-NextNode0=NULL;NewNode-Num=0;NewNode-Parent=Tree;Tree-NextNodenum+1=NewNode;Tree-Num=Tree-Num+1;printf( 子女的信息添加成功 n);break;case B:printf( 請(qǐng)輸入那個(gè)人的名字 :n);scanf(%s,name);Tree=SearchTree(Tree,name,20);if(Tree-Parent!=NULL&strcmp(Tree-Name,Tree-Parent-NextNode0-Name)=0

8、|T ree-NextNode0!=NULL)printf( 已經(jīng)有了配偶 n);break;if(Tree=NULL)printf( 該家譜圖中沒有 %s 這個(gè)人的信息請(qǐng)確認(rèn) n,name);break;NewNode=(TreeNode *)malloc(sizeof(TreeNode);printf( 請(qǐng)輸入添加人員姓名 :n);scanf(%s,NewNode-Name);printf( 請(qǐng)輸入添加人員性別女 F 男 M:n);scanf(%1s,&NewNode-Kind);NewNode-Parent=Tree;Tree-NextNode0=NewNode;break;case C

9、:printf( 本項(xiàng)服務(wù)到此結(jié)束 n);break;case n:break;default:printf( 對(duì)不起 ! 你的選擇錯(cuò)誤 n);break;if (c=C|c=c)break;printf( 請(qǐng)按 Enter 鍵繼續(xù)操作 n);getchar();getchar();/ 修改某個(gè)人的信息void Change(TreeNode * Tree)char name20;TreeNode * NewNode;printf( 請(qǐng)輸入你要修改的人的信息 :n); scanf(%s,name);NewNode=SearchTree(Tree,name,20);if(NewNode=NULL

10、)printf(該家譜圖中沒有%s這個(gè)人的信息請(qǐng)確認(rèn)是否輸入錯(cuò)誤n,name);return;elseSubMenue1(NewNode);/ 輸出副菜單void SubMenue1(TreeNode * Tree)char c;int flag,i;char name20;char Parent220;TreeNode * NewNode;getchar();while(1)system(cls);printf( 請(qǐng)選擇你的操作 n);printf(A: 修改個(gè)人的信息 n);printf(B: 修改父母的信息 n);printf(C: 修改兄弟姐妹的信息 n);printf(D: 修改子女

11、的信息 n);printf(E: 修改配偶的信息 n);printf(F: 退出 n);c=getchar();switch(c)case A:printf(”請(qǐng)輸入修改的姓名:如果不需要修改就輸入0然后按Enter鍵繼續(xù)n); scanf(%s,name); if(strcmp(name,0)!=0) strcpy(Tree-Name,name);printf( 是否要修改性別 :如果需要就輸入 1 不需要修改就輸入 0 然后按 Enter 鍵 繼續(xù) n);scanf(%d,&flag);if (flag=1)if(Tree-Kind=F|Tree-Kind=f)Tree-Kind=M;el

12、se Tree-Kind=F;printf( 個(gè)人信息修改成功 n);break;case B:if(Tree-Parent=NULL)/判斷是不是頭節(jié)點(diǎn)printf( 是這個(gè)家譜圖里最頂端的人沒有父母信息 !n,name);break;if (MATEFLAG=1)/判斷是不是入贅或加入此間的 if(Tree-Kind=F|Tree-Kind=f) printf( 她是嫁入此間的所以父母信息不在家譜內(nèi)包括 n);elseprintf( 他是入贅此間的所以父母信息不在家譜內(nèi)包括 n);break;if(Tree-Parent-Kind=F|Tree-Parent-Kind=f)strcpy(P

13、arent0, 母親 );strcpy(Parent1, 父親 );elsestrcpy(Parent0, 父親 );strcpy(Parent1, 母親 );printf(”請(qǐng)輸入%s要修改的姓名:如果不需要修改就輸入0然后按Enter鍵繼續(xù) n,Parent0);scanf(%s,name); if(strcmp(name,0)!=0) strcpy(Tree-Parent-Name,name);printf(”請(qǐng)輸入%s要修改的姓名:如果不需要修改就輸入0然后按Enter鍵繼續(xù) n,Parent1);scanf(%s,name); if(strcmp(name,0)!=0)strcpy(

14、Tree-Parent-NextNode0-Name,name);printf( 父母的信息修改成功 n);break;case C:NewNode=Tree-Parent; if(NewNode=NULL)/ 判斷是不是頭節(jié)點(diǎn)printf( 是這個(gè)家譜圖里最頂端的人沒有兄弟姐妹信息 !n,name); break;if (MATEFLAG=1)/判斷是不是入贅或嫁入這家的 if(Tree-Kind=F|Tree-Kind=f)printf( 她是嫁入此間的所以兄弟姐妹信息不在家譜內(nèi)包括 n);elseprintf( 他是入贅此間的所以兄弟姐妹信息不在家譜內(nèi)包括 n);break; if(Ne

15、wNode-Num=1)printf( 沒有兄弟姐妹 n);break;else for(i=1;iNum;i+) if(NewNode-NextNodei-Name!=Tree-Name)printf( 請(qǐng)輸入 %s 修改的姓名 :如果不需要修改就輸入 0然后按 Enter 鍵繼續(xù) n,NewNode-NextNodei-Name); scanf(%s,name);if(strcmp(name,0)!=0) strcpy(NewNode-NextNodei-Name,name);printf( 是否要修改性別 :如果需要就輸入 1 不需要修改就輸入 0 然后按 Enter 鍵繼續(xù) n);sc

16、anf(%d,&flag);if (flag=1) if(NewNode-NextNodei-Kind=G|NewNode-NextNodei-Kind=g) NewNode-NextNodei-Kind=B;else NewNode-NextNodei-Kind=G;printf( 兄弟姐妹的信息修改成功 n);break;case D: if(Tree-Num=0)printf( 至今還沒有子女 n);break;if (Tree-Parent !=NULL)if (strcmp(Tree-Name,Tree-Parent-NextNode0-Name)=0) / 如果他是入贅或者是嫁入的

17、就需用配偶節(jié)點(diǎn)完成修改 Tree=Tree-Parent; for(i=1;iNum;i+)printf(”請(qǐng)輸入%s修改的姓名:如果不需要修改就輸入0然后按Enter鍵繼 續(xù) n,Tree-NextNodei-Name);scanf(%s,name); if(strcmp(name,0)!=0) strcpy(Tree-NextNodei-Name,name);printf( 是否要修改性別 :如果需要就輸入 1不需要修改就輸入 0然后按 Enter 鍵繼續(xù) n);scanf(%d,&flag);if (flag=1) if(Tree-NextNodei-Kind=F|Tree-NextNo

18、dei-Kind=f)Tree-NextNodei-Kind=M;else Tree-NextNodei-Kind=F;printf( 子女的信息修改成功 n);break;case E:if(Tree-Parent!=NULL)if(Tree-NextNode0=NULL&strcmp(Tree-Name,Tree-Parent-NextNode0-Name)!=0)printf( 至今還沒有配偶 n);break;if (strcmp(Tree-Name,Tree-Parent-NextNode0-Name)=0)printf(nnt請(qǐng)輸入%s修改的姓名:如果不需要修改就輸入0然后按Ent

19、er 鍵繼續(xù) nt,Tree-Parent-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpy(Tree-Parent-Name,name);elseprintf(nnt請(qǐng)輸入%s修改的姓名:如果不需要修改就輸入0然后按Enter 鍵繼續(xù) nt,Tree-NextNode0-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpy(Tree-NextNode0-Name,name);elseif(Tree-NextNode0=NULL)printf( 至今還沒有配偶 n);elseprintf(nnt請(qǐng)輸入%

20、s修改的姓名:如果不需要修改就輸入0然后按Enter 鍵繼續(xù) nt,Tree-NextNode0-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpy(Tree-NextNode0-Name,name);printf( 配偶的信息修改成功 n);break;case F:printf( 本項(xiàng)服務(wù)到此結(jié)束 n);break;case n:break;default:printf( 對(duì)不起 ! 你的選擇錯(cuò)誤 n);break;if (c=F|c=f)break;printf( 請(qǐng)按 Enter 鍵繼續(xù)操作 n);getchar();getchar();/

21、 輸出主菜單void MainMenu(TreeNode *Tree)char c;/ 用于接受用戶輸入的選項(xiàng)char name20;while(1)system(cls);/ 清屏printf( 歡迎進(jìn)入家譜管理系統(tǒng) nnn);printf(菜單nn);printf(輸入家譜信息 -1n);printf(查找家族成員 -2n);printf(添加家族成員 -3n);printf(輸出家譜信息 -4n);printf(修改成員信息 -5n);printf(退出 6n);printf(nn n);printf( 請(qǐng)選擇相應(yīng)的功能: n);c=getchar();switch(c)case 1:

22、TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode);/ 建立新節(jié)點(diǎn) printf(”請(qǐng)輸入姓名:”);seanf(%s,Tree-Name);給節(jié)點(diǎn)姓名賦值printf(請(qǐng)輸入性別(女F男 M):); getchar();/ 給性別賦值 scanf(%c,&(Tree-Kind); / Tree-Parent=NewNode; Tree- Parent=NULL; CreatTree(Tree); printf( 家譜圖已經(jīng)建立成功 n); printf( 請(qǐng)按 Enter 鍵繼續(xù)操 作 n); getchar();

23、break; case 2: if(strcmp(Tree-Name,0)=0) printf( 家譜圖還未建立請(qǐng) 先建立 n); getchar(); break; printf( 請(qǐng)輸入你要查找的人的姓名 :n); scanf(%s,name); OutPutMessage(SearchTree(Tree,name,20),name,20); getchar(); break; case 3: if(strcmp(Tree- Name,0)=0) printf( 家譜圖還未建立請(qǐng)先建立 n); getchar(); break; AddNew(Tree); getchar(); break

24、; case 4: if(strcmp(Tree-Name,0)=0) printf( 家譜圖還未建立請(qǐng)先建立 n); getchar(); break; printf( 整個(gè)家譜的主要信息如下 :n);OutPutAll(Tree); getchar();break;case 5: if(strcmp(Tree-Name,0)=0) printf( 家譜圖還未建立請(qǐng)先建立 n); getchar();break;Change(Tree); getchar();break;case 6:printf( 本程序結(jié)束 ,歡迎下次使用。 n);exit(0); break;case n: break

25、; default: printf( 您輸入錯(cuò)誤 ,請(qǐng)重新輸入。 n); getchar();break;getchar();/ 創(chuàng)建樹void CreatTree(TreeNode *Node)int i;TreeNode *NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode);Node-NextNode0=NewNode;/ Node-NextNode0=NULL;printf( 請(qǐng)輸入 %s 的子女的數(shù)目 :n,Node-Name); scanf(%d,&(Node-Num);printf( 請(qǐng)輸入 %s 的配偶的姓名 :n,Node-N

26、ame); scanf(%s,NewNode-Name);if(Node-Num)=0&strcmp(NewNode-Name,0)=0)return ;if (Node-Kind=F|Node-Kind=f)/ 自動(dòng)填寫其配偶的性別NewNode-Kind=M;elseNewNode-Kind=F;NewNode-Num=0;NewNode-NextNode0=NULL;Node-NextNode0=NewNode;Node-NextNode0-Parent=Node;for(i=1;iNum;i+)NewNode=(TreeNode *)malloc(sizeof(TreeNode);pr

27、intf( 請(qǐng)輸入 %s 的第 %d 子女的名字 n,Node-Name,i); scanf(%s,NewNode-Name);printf( 請(qǐng)輸入 %s 的第 %d 子女的性別女 F 男 M:n,Node-Name,i); getchar();scanf(%c,&NewNode-Kind);NewNode-Num=0;NewNode-Parent=Node;Node-NextNodei=NewNode;CreatTree(Node-NextNodei);/ 遍歷并輸出樹中的內(nèi)容void OutPutAll(TreeNode *Tree)int i, flag=0;/flag 記錄節(jié)點(diǎn)的性別

28、printf(%s 性別 :,Tree-Name);if (Tree-Kind=F|Tree-Kind=f)flag=1;printf( 女 n);elseprintf( 男 n);if (!(Tree-NextNode0)printf( 至今沒有配偶和子女 n);return; if(flag=1)/flag=1 表示性別為女printf( 丈夫的姓名 :%sn,Tree-NextNode0-Name);elseprintf( 妻子的姓名 :%sn,Tree-NextNode0-Name);for(i=1;iNum;i+)printf( 第 %d 個(gè)子女的姓名別:,i,Tree-NextNo

29、dei-Name,Tree-NextNodei-Ki nd);if (Tree-NextNodei-Kind=F|Tree-NextNodei-Kind=f) printf( 女 n);elseprintf( 男 n);for(i=1;iNum;i+)OutPutAll(Tree-NextNodei);/ 在樹中經(jīng)過(guò)遍歷查找某個(gè)人TreeNode * SearchTree(TreeNode *Tree,char name,int length)int i;TreeNode *NewNode;if(strcmp(Tree-Name,name)=0)if(length=0)MATEFLAG=1;e

30、lseMATEFLAG=0;return Tree;if(Tree-NextNode0=NULL)return NULL;for(i=0;iNum;i+) :%s 性if (i=0)NewNode=SearchTree(Tree-NextNodei,name,0);elseNewNode=SearchTree(Tree-NextNodei,name,20);if (NewNode!=NULL)return NewNode;return NULL;/ 輸出已經(jīng)查找到的人的信息void OutPutMessage(TreeNode * Tree,char name,int length)int f

31、lag=0,i;/flag 標(biāo)記性別TreeNode *NewNode;if(Tree=NULL)printf( 該家譜圖中沒有 %s 這個(gè)人 n,name);return;printf( 您找的人信息如下 :n);printf(%s 性別 :,name);if (Tree-Kind=F|Tree-Kind=f)flag=1;標(biāo)/ 記的性別printf( 女 n);elseprintf( 男 n);NewNode=Tree-Parent;/ 父母信息放到 NewNode 里if (MATEFLAG=1)此人為這家人的伴侶if(flag=1)性別為女printf( 她是嫁入這家的,所以父母信息不在家譜內(nèi)包括 n);printf( 丈夫的姓名 :%sn,NewNode-Name);else /性別為男printf( 他是入贅這家的所以父母信息不在家譜內(nèi)包括 n);printf( 妻子的姓名 :%sn,NewNode-Name);if (NewNode-Num)0)/判斷他 (她)是否有孩子printf( 孩子的信息如下 :n);/輸出他 (她)的孩子的信息for(i=1;iNum;i+)printf(%s 性別 :,NewNode-NextNodei-Name);if (NewNode-NextNodei-Ki nd=F

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論