家谱管理系统_第1页
家谱管理系统_第2页
家谱管理系统_第3页
家谱管理系统_第4页
家谱管理系统_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、24洛阳理工学院课程设计报告课程名称设计题目数据结构课程设计家谱管理系统业级号名期日成 专班学姓完计算机科学与技术B150405B15080822宋士龙2016/1 30 H课 程设计 任务书设计题目:家谱管理系统设计内容与要求:【问题描述】:实现具有下列功能的家谱管理系统.输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内 容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加 其它信息、但不是必需的。.实现数据的存盘和读盘。.显示家谱。.按照出生日期查询成员名单。.按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。.修改某成员信息。【基本要求】:界

2、面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关 的功能要求。存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在 数据文件中。测试数据:要求使用1、全部合法数据;2、局部非法数据。进行程序测试,以 保证程序的稳定。测试数据及测试结果请在上交的资料中写明。指导教师:年 月 日课程设计评语成绩:指导教师:年 月 日一、算法思想本程序是一个管理家谱的系统,通过这个系统可以对家族成员进行创建、显示、査 找、修改、以及保存家谱和读取家谱功能。该系统分为以下几个模块,分别是:创建家谱, 显示家谱、按姓名和生日查找家庭成员、修改家谱、存盘、读盘以及退出系统。本程序用到 的

3、存储形式为多叉树,因为家谱中每个人既有父母又有孩子,而且孩子的个数并不确定,所 以用多叉树来存储最为介适。用多叉树来存储,就用用到多叉树的递归创建及递归遍历。因 为是多叉树,所以遍历时用广度优先搜索合适。本函数最主要的思想就是递归调用,每个子 函数中都会用到递归。左义结构体时给定指针数组的最大容量,来规左家谱中最多可以存多 少人。左义一个家族树的指针变量用来当每个子函数的参数,从而将其返回到主函数中。二、模块划分int main():主函数VOid CreatTree(TreeNOde *Tree):创建家族树VOid OUtPUtAII(TreeNOde *Tree):显示家谱VOid Me

4、nUe(TreeNOde *Tree):主菜单VOid SUbMenUeI(TreeNOde * Tree):副菜单(修改选项菜单)VOid Change(TreeNOde * Tree):修改家谱TreeNOde * SearChTree(TreeNOde *Tree,char namezint length):按照姓名 查找家谱成员TreeNOde * SearChTreel(TreeNOde *Tree,char birth,int length):按照生 日查找家谱成员VOid OUtPUtMeSSage(TreeNOde * Tree,char nameJnt length):输出按

5、姓 名査找到的家谱成员VOid OUtPUtMeSSageI(TreeNOde * Tree,char birth,int length):输出按生 日查找到的家谱成员VOid SaVeFamiIy(TreeNOde *root):保存家谱VOid ReadFamiIy(TreeNOde *root):读取家谱三、数据结构typedef StrUCt TreeNOdeint ChiIdNum;/记录这个人拥有几个儿女Char Name20;/记录这个人的姓名Char birthday20;/生日int marriage;/婚否(1表示结婚,O表示没结婚)intdeath;/生死(1表示活着,O

6、表示过世)Char Kind;/标示节点的种类有女G男BChar address100;/住址Char IiVemaSSage50;/死亡日期(如果其已经死亡)StrUCt TreeNOde *NextNode20; /记录这个人的儿女StrUCt TreeNOde * Parent;记录这个节点的父节点JTreeNodez *tree;四、测试笫一组数据为:爷爷,奶奶,爸爸,妈妈,我,二叔,二婶,姐姐,三叔,三婶,弟弟一共 三代口个人。其中爷爷是根节点,奶奶为爷爷的配偶,同时也是爷爷的第一个后继节点。 爸爸,二叔,三叔为爷爷的子女。爸爸的配偶是妈妈,爸爸的子女是我。二叔的 配偶是二婶,子女是

7、姐姐。三叔的的配偶是三婶,三叔的的子女是弟弟。进入程序之后,首先进行创建家谱,然后进行存盘,之后进行修改和查询等 步骤。退出程序在进入程序时,进行读盘。之后在进行其他操作,程序完成之后 退出即可。图1家族树笫一组数据测试截图为:i C:U$er$ddmlnDeSlrtOPVkecheogexe4rx3*-*-:X-:-t-x-t-*姓名:爷爷出生日務:1944.09.20冢庭住址I山东省临沂市性别:B男妾子姓乞:奶奶是否吳在(1 -兌在O去世: 0第1个亍女的牲名:爸爸 出生日期:1963.03.06家庭住址:山东省临沂市 性别喝第2个手女的姓名.二叔 岀生日期:1970. OS. 05恋庭住

8、址:山东省临沂TlJ性别B勇第3个子女的姓名:三寂 出生日期:1977.02. 148妄寡住址:山东省临沂审 性别B刃- Ab 一爸名女 *:爸姓子 : 卜 -*名子Iz 一姓S第r冷*H)M4审M(N!妈妈是普住址山东省蹄市勺姓名我 出生日期1996.10. 23京疙住址:山东省临沂市性别:B男性别B刃*料*M(v榊ri996o23冬虑住址:山东省临沂市性别- ! 一叔名女一姓妾第-c8* 88*8=岀生日期:1970. 08. 05家庭住址:是否5?在(I-谴在,O-): 1:姐姐 出生日期:1991.02.14寒庭住址山东省临沂巾:山东省临沂市性别:B男 性别G女4:用:*卄 88 甘8

9、8*:甘88甘$8*姓名:姐姐岀生日期:1991.02. 14家庭住址,山东省临沂巾 性别:G女至今没有配阳和子女諄蠢才是翩瞿碍 严如山东省临沂市第1个子女的姓名關曲 出生日期:2001. 03.25妄庭住址:山东省临沂市性别:B男性别B男做获音亠生/鱼卑 世宝豆期:?0010325家庭住址:山东省临沂市图2显示家谱 CzUsersodinDesktopkecheg.exe*=*&我迎使用家咲管理寒统*3*A:输入妄谱侑总丢立机 B :输出整个京谱佶息C:按出生日期査找某人 D :按姓名査找某人 E:修该某个人的信息 p:#aG:读盘H:退出整个程序D请输入你要去找的人的姓名: 弟弟性别:B男

10、是否健在(l-.是否健在1-健在, 是否健在U 健在是否健在1 健在.是否健在1 健在是否健在1 健在是否健在1 健在是否健在U 健在, 是否(S(l-t?在,是否健在 健在在在在 卜1-1- s 在在在 tttil 否否否 矍是 0去世):0 A0去世):0 O-去世h O0去世):0O 去世h 10 去世):1O-tt): 1O 去世h 10 去世)* 1O 去世h 1O 去世* 1O 去惟):10 去世):17您所要找的人己经找到(SSfe)下所示:姓名:弟弟出生日期:2001.03.25姦庭住址】山东省他沂市性别:B男是否健在(I-傕左0去世)* 1母亲姓名:三蚌条鎗至今玉義有配偶和孩

11、子微软拼音半:图3按照姓名查找家族成员 C U er sadminDes kt opkec bmg.exe*e选使用凉族管理妄统甘8打P杆=A:靠入家谱信息達立林B:鴛岀矗个寂诺信息C:確岀生B期言找艾人D:技姓名査找冬人E:修改茶个人的信息F:存盘G:读盘H:ig出整个程扌*保存家谱C*=J入文件名及保存CLJE(eg: Dexaple. txt) DJIAPU. txt 新逹文伴成功文件及苴路径为D: WJI.API;. txt图4存盘第二组数据为:图4王家家族树第二组数据测试截屏为: , Czser%adminDesktOPvCeCbengGce:*笑一*请选择你的操作*=*A:修改个人

12、的恰息一 7B:烽改父 .e- *8C:修改子女的信患、8*D:退 出-*8*S渚隸入倏改的姓名:如臬不需要條改就输入0然后按EnterS 王小二是否要修改性别:如采秸要就输入T*不离要傷改就報入0慾后按Entera 0 请治入修改的出生日期:如果不需旻僅改就為入0於后汝EntET徒逖续渚隸入倏改的左庭地址:如累不需頁修改就输入P然肓按Enteri 0个人信息侈改成功请按EnlM笹维续隹作微软拼音半:图6修改某个人的具体信息 , CAUSefSvbdminDesktopkeheng.ee*r冷”欢IS使用康族管理系统林榊比耳IE 人立息共患 建信找人信iss序 信塞期找人 程 谱个m个妄整生名

13、基 空 入出出姓改盘盘岀 怨按修存读退 A:B:UD:E:F:GH:请输入你要玄找的出生日期:2008$*&*8(S所要找的人己经找到信息如下所示:姓名:王小二岀生日期:2008家庭住址:洛阳性别:B男彼软拼音半:图7按照生日查找某人 C:UseriadminDwktopkecbeng-ce* 迎使用 竅族管 理系 统*A:辎入家谱信息逢立檢B.旃岀整个U按出兰日期宜找某人 D:技姓名音找其人G:读盘H:退出整个樓序E條改英个人的f忌 FE昱心砲读取家谱MC豹入文件名及其路径U便从中汝取窥谱文件名及其(eg: DlWeXanpie. txt): EJI. txt图8读盘五、源程序#in ClU

14、de #include #include #ifdef WIN32 #define CLEAR SyStem(,cls,1)#define TiPFOrSaVeFiIePOSitiOn Printf(,tt 输入文件名及保存位置(eg: D:Wexample.txt):,)#define TiPFOrReadFilePOSitiOn Printf(I,tt 文件名及其路径(eg: D:Wexample.txt): ,l)#else#define CLEAR SyStem(,clear)#define TiPFOrSaVeFiIePOSitiOnPrintf(,tt输入文件需及保存位宜(eg:h

15、omeiongexample.txt):,)#define TiPFOrReadFiIePOSitiOn Printf(,ltt 文件名及其路径(eg: homeiongexample.tt):)#endif#define maxFileNameLen 50/保存的文件名的最大长度int FLAG=O;int a=l;typedef StrUCt TreeNOdeint ChiIdNum;/记录这个人拥有几个儿女Char Name20;/记录这个人的姓名Char birthday20;/生日int marriage;/婚否(1表示结婚,O表示没结婚)intdeath;/生死(1表示活着,O表示

16、过世)Char Kind;/标示节点的种类有女G男BChar address100;/住址Char IiVemaSSage50;/死亡日期(如果其已经死亡)StrUCt TreeNOde *NextNode20; 记录这个人的儿女StrUCt TreeNOde * Parent;记录这个肖点的父盯点JTreeNodez *tree;VOid CreatTree(TreeNOde *Tree);VOiCl OUtPUtAll(TreeNOde *Tree);VOid MenUe(TreeNOde *Tree);VOld SUbMenUeI(TreeNOde * Tree);VOid SUbMen

17、Ue2(TreeNOde *Tree);VOid Change(TreeNode * Tree);VOid AddNeW(TreeNOde * Tree);TreeNOde * SearChTree(TreeNOde *Treezchar nameJnt Iength);TreeNOde * SearChTreeI(TreeNOde *Tree,char birthZint Iength);VOid OUtPUtMeSSage(TreeNOde * TreeJChar namezint Iength);VOid OUtPUtMeSSageI(TreeNOde * TreeZChar birth

18、Jnt Iength);VOid SaVeFamily(TreeNOde *root);VOid ReadFamily(TreeNOde *root);Int main()/主函数TreeNOde *Tree;/TreeNOde *Treel;/Treel=&(*Tree);Tree=(TreeNOde *)malloc(sizeof(TreeNode);Tree-Parent =NULL;StrCPy(Tree-Name,0);Menue(Tree);return O;VOid MenUe(TreeNOde *Tree)/输岀主菜单*TreeNode *Treel;TreeI=&Tree;*

19、/Char c;Char name20;Char birth20;While(I)SyStem(cIsh);Printf(,lt);Pnntf(Hnntt* 欢迎使用家族管理系统 *nn);Printf (,nttA:输入家谱信息建立树);Printf(,nttB:输岀整个家谱信息);Printf(,nttC:按岀生日期査找某人u);Printf(, nttD:按姓名查找某人u);Printf (,nttE:修改某个人的信息u);Printf(,nttF:存盘);G:读盘Printf (,nttPrintf (,nttH:退出整个程序nt);c=getchar();SWitCh(C)CaSe

20、,A,:TreeNOde * NewNode;NeWNOde=(TreeNOde *)malloc(sizeof(TreeNode);Pnntf(Hnt请输入姓名门;scanf(,%s,zTree-Name);Pnntf(,nt请输入性别女G男B:M);getchar();scanf,%c, &(Tree-Kind);Tree-Parent=NewNode;Tree-Parent=NULL;/CreatTree(Tree); /Pnntf(Hnt-家谱图已经建立成功nnu);Printf(,lnnt请按 Enter 键继续操作,);getchar();break;CaSe ,B,:if(str

21、cmp(Tree-Name,O)=O)Pnntf(Hnt家谱图的多叉树尚未建立请先建立树r); getchar();break;Printf(Ilnnt整个家谱的主要信息如下:);OutPutAII(Tree);getchar();break;CaSe ,C,:if(strcmp(Tree-birthdayz,O)=O)Printf(,nt家谱图的多叉树尚未建立请先建立树n); getchar();break;Printf(Ilnt请输入你要査找的出生日期scanf(,%s,zbirth);OUtPUtMeSSagel(SearChTreeI(Treezbirthj20)zbirth,20);

22、Printf (,nnt*-*一*一*-*-*-*-*-*ntu);getchar();break;CaSe ,D,:if(strcmp(Tree-Name,O)=O)Printf(,nt家谱图的多叉树尚未建立请先建立树n); getchar();break;Printf(,nt请输入你要査找的人的姓名:nf,);SCa nf(%s 蔦 name);OUtPUtMeSSage(SearChTree(Tree, name,20),name,20);Pnntf (,nnt*-*-*-*-*-*-*-*-ntu);getchar();break;CaSe ,E,:if(strcmp(Tree-Nam

23、e,O,)=O)Printf(,t家谱图的多叉树尚未建立请先建立树n);getchar();break;Cha nge(Tree);getchar();break;CaSe ,F,:if(strcmp(Tree-Name,O,)=O)Printf(,nt家谱图的多叉树尚未建立请先建立树n);getchar();break;SaveFamiIy(Tree);getchar();break;CaSe ,G,:*if(strcmp(Tree-Name,O,)=O)Printf(,nt家谱图的多叉树尚未建立请先建立树n);getchar();break;*/ReadFamily( &Tree);get

24、char();break;CaSe ,H:Printf(,lnnt本次服务到此结束);Printf(,lnt欢迎下次使用,);Printf(,nt谢谢nnu);break;CaSe ,n,:break;default:Printf(,1nnt-一对不起!你的选择不在服务范围之内!);Printf(,nt请您再次选择所需的服务项!);Printfc、nt谢谢n t);getchar();break;if (c=,H, I c=,fl)break;getchar();VOid CreatTree(TreeNOde *Node) /创建树int i;TreeNOde *NewNode;NeWNOde

25、=(TreeNOde *)malloc(sizeof(TreeNode);Node-NextNode0=NewNode;Node-NextNode0=NULL;Printf(,nt请输入出生日期:”);SCanf(,%s,IzNOde-birthday);Pnntf(,nt 请输入家庭住址:H);getchar();scanf(,%sZNOde-address);Printf(,nt请输入是否建在(I-是或O-否):);scaf(,%d,z8t(NOde-death);if(Node-death=0)Printf(,nt请输入去世日期:);SCa nf(”%s:Node livemassage

26、);else if(Node-death=,l,)Printf(,nt 仍然建在);Printf(,nt请输入s的配偶的姓名(输入0代表没结婚NOde-Name);SCanf(I,%s,NewNode-Name);讦(StrCmP(NeWNOde-Name,0,)!=0)printf(llt请输入配偶的出生日期:);scanf(,%s,ZNeWNOde-birthday);Printf(,nt 请输入家庭住址:,)jgetchar();scanf(%s,NewNode-address);Printf(,nt请输入是否建在(1 是或O否):);scanf(,%d,&(NeWNOde-death)

27、;if(NewNode-death=0)Printf(,nt请输入去世日期:);SCan f(,%snZNeWNOde-livemassage);else if(NewNode-death=,l,)Printf(,nt 仍然建在);Printf(IInt请输入s的子女的数目(当子女输入O时便停止输入该成员有关信 息):11ZNOde-Name);scanf(%d,1,&(NOde-ChildNum);if(Node-ChildNum)=0&StrCmP(NeWNOde-Name,0,)=0)return;if(Node-Kind=,G, Node-Kind=,g,)NeWNOde-Kind=,

28、B,;elseNeWNOde-Kind=,G,;NeWNOde-Child Num=O;NeWNOde-NextNode0=N U LL;Node-NextNode0=NewNode;Node-NextNode0-Pare nt=Node;/ 孩子的父母 for(i=l;iChildNum;i+)NeWNOde=(TreeNOde *)malloc(sizeof(TreeNode);a+;Pnntf(,t 请输入s 的第d 子女的名字:,lZNOde-NameJ);scanf(,%s,NewNode-Name);Pnntf(,lnt请输入s的第d子女的性别女G男B:,NOde-Name,i);

29、getchar();SCanf (,%c,z 8tNewNode-Kind);NeWNOde-ChildNum=-l;NeWNOde-Pare nt= Node;Node-NextNodei=NewNode;CreatTree(NOde-NetNodei); /从子女的数目开始VOid OUtPUtAII(TreeNOde *Tree)int i, flag=O;Printf(,nt*HjPrintf(,t 姓名:%S出生日期:%S家庭住址:%s 性别:%cl,zTree-Name,Tree-birthday,Tree-addreSSZTree-Kind);if (Tree-Kind=,G,

30、11Tree-Kind=,g,)fag=l;Printf(II 女冷;elsePrintf (男);Printf(,t是否健在健在,O-去世):);if(Tree-death=l) Printf(I1);else if(Tree-death=0) Printf(,0);讦(!(Tree-NextNode0)Printf(,nt至今没有配偶和子女n);return;if(flag=l)Printf(,nt 丈夫姓名 %s,zTreNeXtNOde0-Name);elsePrintf(Hnt 妻子 姓名 r%s,Jree-NextNode0-Name);Pnntf(,t是否健在健在,O-去世):)

31、;if(Tree-death=l) Printf(1,1);else if(Tree-death=O) Printf(,0);for(i=l;iChildNum;i+)Printf(,nt第d个子女的姓名:s 岀生日期:%S 家庭住址:%s 性 别 %c,JZTree-NextNodei-NameJree-NextNodei-birthdayZTree-NextNodei-addreSSZTree-N etNodei-Kind);if (Tree-NextNodei-Kind=,G,I ITree-NetNodei-Kind=,g,)Printf(*);elsePrintf(男“);Print

32、f(,t是否健在健在,O-去世):);if(Tree-death=l) Pnntf(,1);else if(Tree-death=O) Printf(,0n);Pnntf(Ilnt);for(i=l;iChildNum;i+)OUtPUtAII(Tree-NextNodei);TreeNOde * SearChTree(TreeNOde *Treezchar nameJnt Iength)int i;TreeNOde *NewNode;if(strcmp(TreeNamez name)=。)if(length=O)FLAG=I;elseFLAG=O;return Tree;if(Tree-Ne

33、xtNode0=NULL)return NULL;for(i=0;iChildNum;i+)if (i=0)NeWNOde=SearChTree(Tree-NextNodei,name,0); elseNeWNOde=SearChTree(Tree-NextNodeiZnameZ20);if (NewNodei=NULL)return NewNode;return NULL;VOid OUtPUtMeSSage(TreeNOde * TreezChar name,int Iength)int flag=0J;TreeNOde *NewNode;Printf(,nnt*-*-*一*-*-*一*-

34、*-*-*-);If(Tree=NULL)Pnntf(,nnt*该家谱图中没有s这个人的信息请确认是否输入错误*1,narne);return;Printf(,nnt您所要找的人已经找到信息如下所示:);Printf(nt姓 名:s出生 日期:s家庭 住址:%s 性别:c: name.Tree birthdayrTree-address,Tree-Ki nd);if (Tree-Kind=,G, ITree-Kind=,g,)fag=l;标记他(她)的性别Printf (女”);elsePnntf(IIW);Printf(,t是否健在健在,O-去世):);if(Tree-death=l) Pr

35、intf(I1);else if(Tree-death=O) Printf(0);NeWNOde=Tree-Parent;If(FLAG=I)if(flag=l)Printf(nnt她是嫁入此家族的所以亲生父母信息不在家谱内包括ll);Printf(,t 丈夫姓名:s:NeWNOdeName);elsePrintf(,1nnt他是入赘此家族的所以亲生父母信息不在家谱内包括);Printf,lnt 妻子姓名:%szNewNode-Name);讦(NeWNOde-ChildNum)O) /判断他(她)是否有孩子Printf(IInt的孩子的信息如下:);/输出他(她)的孩子的信息 for(i=l;

36、iChildNum;i+)Printf(,nt 姓名:s 性另IJ:ZNeWNOde-NextNodei-Name);if (NeWNOde-NextNodei-Kind=,G, 11 NeWNOde-Kind=,g,)Printf(女”);elsePrintf(男”);Printf(,t是否健在健在,O-去世):,);if(Tree-death=l) Pnntf(,ln);else if(Tree-death=O) Printf(O1);return;If(NewNode=NULL)/判断它是不是根节点如果是的话就没有父母兄弟信息Printf(nt是这个家谱图里最年长的人,name);els

37、eif (NeWNOde-Kind=,G, 11 NeWNOde-Kind=,g,) 判断父亲节点是父亲还是母亲Printf(nt母亲 姓洛:s:NeWNode-Name);/输出他(她)的父母亲的信息Printf(,t 父亲姓名 %s,NewNode-NetNode0-Name);Printf(,t 母亲姓名:s:NeWNOdeNetNode0卜Name);Printf(,t 父亲姓名:s:NeWNOCleName);if(Tree-NextNode0 !=NULL) /判断他(她)是否有配偶if(fa沪“)输出他(她)的配偶的信息Printf(,nt 丈夫 姓 %s,zTree-NextN

38、ode0-Name);Printf,nt 妻子姓名:%szTree-NextNode0-Name);if (Tree-ChildNumO) /J 断他(她)是否有孩子Printf(I,nt的孩子的信息如下:”);/输出他(她)的孩子的信息 for(i=l;iChildNum;i+)Printf(,nt 姓名:s 性别:Jree-NextNodei-Name);if (Tree-NextNodei-Kind=,G, ITree-Kind=,g,)Printf(,*h);elsePrintfr男”);Pnntf(,t是否健在健在,O-去世):);if(Tree-death=l) Printf(,1

39、,);else if(Tree-death=O) Printf(,0);2424elsePrintf(,t%s 至今还没有孩子,name);elsePrintf(,nt%s 至今还没有配偶和孩子n,Tree-Name);TreeNOde * SearChTreeI(TreeNOde *Treezchar birth,int Iength)int i;TreeNOde *NewNode;if(strcmp(Tree-birthdayZbirth)=O)if(length=O)FLAG=I;elseFLAG=O;return Tree;if(Tree-NextNode0=NULL)return N

40、ULL;for(i=0;iChildNum;i+)if (i=0)NeWNOde=SearChTreeI(Tree-NextNodeiZbirthz0); elseNeWNOde=SearChTreeI(Tree-NetNodeiZbirth,20);if (NewNodei=NULL)return NewNode;return NULL;VOid OUtPUtMeSSageI(TreeNOde * TreezChar birth,int Iength)int flag=0J;TreeNOde *NewNode;Printf(,nnt*-*-*一一*-*-*-*-*-*-);If(Tree=N

41、ULL)Pnntf(,lnnt*该家谱图中没有岀生日期为s这个人的信息请确认是否输入错误*n,birth);return;Printf(,nnt您所要找的人已经找到信息如下所示:);Printf(nnt姓名:s 出生 日期:s 家庭 住址:%s 性别:c,Tree-Name,Tree-birthday,Tree-address,Tree-Kind);if (Tree-Kind=lG, ITree-Kind=,g,)fag=l;标记他(她)的性别Printf(,);elsePrintf(”男);VOid Change(TreeNOde * Tree) /修改某个人的彳言息Char name20;

42、TreeNOde * NewNode;Printf(,nt请输入你要修改的人的姓名:nf,);scanf(,%s,zname);NeWNOde=SearChTree(Tree,name,20);if(NewNode= N U LL)Pnntf(Hnnt*该家谱图中没有s这个人的信息请确认是否输入错误*,narn);return;elseSUbMenUeI(NeWNode);VOid SUbMenUeI(TreeNOde * Tree)/输出副菜单Char c;it fag,i;Char name20;Char birth20;Char addressl50;Char Parent220;Tre

43、eNOde * NewNode;getchar();WhiIe(I)SyStemcis”);Printf(,f,);Printf(,nnt-*请选择 你的操 作*Printf(,nb-*-*-*:修改个人的信息DD,);Printf(,nb-*-*-*-B:修改父母的信息粒D紅,);Printf(nt-*-*-C:修改子女的信息粒紅,);Pnntf (,rt-*-D:退岀nt);c=getchar();SWitCh(C)CaSe ,A,:Printf(,nnt请输入修改的姓名:如果不需要修改就输入0然后按Enter键继续nf,);SCa nf( ,%s,name);if(strcmp(name

44、z,O) !=0)StrCPy(Tree-Namez name);Printf(,1nnt是否要修改性别:如果需要就输入T不需要修改就输入O然后按Enter键 继续 nt);SCanf (%d:&flag);if (flag=l)if(Tree-Kind=,G, ITree-Kind=lg,)Tree-Kind=,B;else Tree-Kind=,G,;Printf(,1nnt输入修改的岀生日期:如果不需要修改就输入0然后按Enter键继续 nt);scanf(%s,birth);if(strcmp(birth,O,)!=O)StrCPy(Tree-birthdayzbirth);Print

45、f(,1nnt输入修改的家庭地址:如果不需要修改就输入0然后按Enter键继续 nt);SCanf(I,%sladdressl);if (StrCmP(addresslz,O) !=0)StrCPy(Tree-addreSSzaddreSS1);Printf(,nnt个人信息修改成功);break;CaSe ,B,:if(TreeParent=NULL) 判断是不是头节点Printf(Ilnt是这个家谱图里最顶端的人没有父母信息!,name);break;if (FLAG=I)判断是不是入赘或加入此间的if(Tree-Kind=,G ITree-Kind=g,)Printf(,1nnt她是嫁入

46、此间的所以父母信息不在家谱内包括”);elsePrintf(nnt他是入赘此间的所以父母信息不在家谱内包括”);break;if(Tree-Parent-Kind=,G, Tree-Parent-Kind=lg,)StrCPy(Parent0/* 母亲”);StrCPy(Parent 父亲”);elseStrCPy(Parent 0/1 父亲,);StrCPy(ParentI/1 母亲,);Printf(nnt请输入s要修改的姓名:如果不需要修改就输入0然后按Enter键继续nt,Parent0);SCa nf( ,%s, name);if(strcmp(name,O,)!=O)StrCPy(

47、Tree-Parent-Name, name);Printf(,nnt i输入s要修改的姓名:如果不需要修改就输入0然后按Enter键继续 nt,Parent(IJ);SCanf(%s,name);if(strcmp(namez,0l,)!=0)StrCPy(Tree-Pare ntNextNode0 卜 Name, name);Printf(,lnnt-父母的信息修改成功,);break;CaSe ,C,:if(Tree-ChildNum=O)Printf(,nt至今还没有子女);break;if (TreeParent !=NULL)if (StrCmP(Tree-Name,TreePar

48、ent-NextNode0-Name)=0)如果他是入赘或者是嫁入的就需用配偶节点完成修改Tree=Tree-Pare nt;for(i=l;iChildNum;i+)Printf(,1nnt请输入s修改的姓名:如果不需要修改就输入0然后按Enter 键继续nt,zTreNetNodei-Name);scanf(,%s,Zname);if(strcmp(name,O)!=O)StrCPy(Tree-NetNodei-Namez name);Printf(nnt是否要修改性别:如果需要就输入T不需要修改就输入。然 后按Enter键继续nt);SCanf(,%dl,flag);if (flag=l

49、)if(Tree-NextNodei-Kind=G, ITree-NetNodei-Kind=,g,)Tree-NetNodei-Kind=,B,;else Tree-NetNodei-Kind=,G,;Printf(,t子女的信息修改成功);break;CaSe ,D,:Printf(,nnt本项服务到此结束);break;CaSe ,n,:break;default:Pri ntf(,nnt对不起!你的选择不在服务范围之内!,);Printf(Ilnt请您再次选择所需的服务项!);Printf(,nt谢谢合作!nt,);break;if(c=,D,c=ld,)break;Printf(,n

50、nt请按 Enter 键继续操作,);getchar();getchar();VOid SaVeFamily(TreeNOde *root)/保存家谱至指定文件Char SaVeFiIeNameImaxFiIeNameLe n;FILE* fp;TreeNOde *queue50, *head;int i, front, rear;/队列的头指针,尾指针Printf(H *保存家谱*nn);/if(root=NULL)if (root = NULL)Printf(,tt家谱中无成员,无法保存! n);return;TiPFOrSaVeFiIePOSition;/文件及绝对路径格式SCanf(,

51、%s,z SaveFiIeName);getchar();fp = fopen(saveFileName, w);/不存在则新建。存在,贝IJ从文件起始位置写,原内容将被覆 盖。if(fp = NULL)Printf(,tt 新建文件失败! n);return;elsePrintf(,tt新建文件成功,文件及其路径为:%sn, SaveFiIeName);/*利用宽度优先搜索遍历家族多叉树*/fwrite(root, SiZeOf(TreeNode), 1, fp);将根结点存入文件(二进制形式)front = rear = 0;初始化空队queuerear+ = root;/ 根结点进队wh

52、ile(front != rear)/队列不为空head = queuefrot+;/ 队头元素岀队if (head-NextNode0 != NULL)fwrite(head-NextNode0, SiZeOf(TreeNOde)Z Iz fp);for(i=l; iChildNum; i+)fwrite(head-NetNodeiz SiZeOf(TreeNode), If fp);queuerear+ = Head-NextNodei;fclose(fp);fp = NLL;VOid ReadFamily(tree *root)/从指定文件中读取家谱FILE*fp;Char readFileName50;tree queue50Zhead;int iz front, rear;Pn ntf(, * 读取家谱 * *nnu);Pnntf(,tt输入文件名及其路径,以便从中读取家谱。nlt);TiPFOrReadFilePOSition;scanf(,%s,z TeadFiIeName);getchar();fp = fopen(readFileNamez I”);/为读而打开文本文件(文件必须已存在) if(fp = NULL)Printf(,itt只读形式打开文

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论