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

下载本文档

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

文档简介

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

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

3、员、修改家谱、存盘、读盘以及退出系统。本程序用到的 存储形式为多叉树,因为家谱中每个人既有父母又有孩子,而且孩子的个数并不确定,所以 用多叉树来存储最为合适。用多叉树来存储,就用用到多叉树的递归创建及递归遍历。因为 是多叉树,所以遍历时用广度优先搜索合适。本函数最主要的思想就是递归调用,每个子函 数中都会用到递归。定义结构体时给定指针数组的最大容量,来规定家谱中最多可以存多少 人。定义一个家族树的指针变量用来当每个子函数的参数,从而将其返回到主函数中。以下时算法思想流程图:、模块划分1.int ma in ():主函数2.void CreatTree(TreeNode *Tree):创建家族树

4、3.void OutPutAII(TreeNode *Tree):显示家谱4.void Menue(TreeNode *Tree):主菜单5.void SubMenue1(TreeNode * Tree):副菜单(修改选项菜单)6.void Change(TreeNode * Tree):修改家谱7.TreeNode * SearchTree(TreeNode *Tree,char name,int length)姓名查找:按照家谱成员8.TreeNode * SearchTree1(TreeNode *Tree,char birth,int length):按照生日查找家谱成员9.void

5、OutPutMessage(TreeNode * Tree,char name,int length):输出按姓名查找到的家谱成员10. void OutPutMessage1(TreeNode * Tree,char birth,int length):输出按生日查找到的家谱成员11. void SaveFamily(TreeNode *root):保存家谱12. void ReadFamily(TreeNode *root):读取家谱三、数据结构typedef struct TreeNodeint ChildNum; /记录这个人拥有几个儿女char Name20;记录这个人的姓名char

6、 birthday20;生日int marriage;/ 婚否(1 表示结婚,0 表示没结婚)int death;/ 生死(1 表示活着,0 表示过世)char Kind;/ 标示节点的种类有女 G 男 Bchar address100;住址char livemassage50;死亡日期(如果其已经死亡)struct TreeNode *NextNode20; /记录这个人的儿女struct TreeNode *Pare nt;/记录这个节点的父节点TreeNode,*tree;四、测试第一组数据为:爷爷,奶奶,爸爸,妈妈,我,二叔,二婶,姐姐,三叔,三婶,弟弟一共 三代11个人。其中爷爷是根

7、节点,奶奶为爷爷的配偶,同时也是爷爷的第一个后继节点。 爸爸,二叔,三叔为爷爷的子女。爸爸的配偶是妈妈,爸爸的子女是我。二叔的 配偶是二婶,子女是姐姐。三叔的的配偶是三婶,三叔的的子女是弟弟。进入程序之后,首先进行创建家谱,然后进行存盘,之后进行修改和查询等 步骤。退出程序在进入程序时,进行读盘。之后在进行其他操作,程序完成之后 退出即可。图2显示家谱第一组数据测试截图为:!CA,U5eTsfldiminDkTQplicech5ng.rx-一-*-一 n*一-*-*-* *+*-一*-一一一-姓容:爷爷出生日期:1944. 09. 20姦庭住址:山东省苗诉市 性别:枣子姓弟:奶奶 展否傩冉逞冉

8、卜主世A 0更1个子女的姓名;爸爸 出生日期:19阪臨肺 竦肛時丘:山东省临诉市 性尊扭男 第E个子女的娃窑:二叔 出生日期:1970. 08. 05康庭世址:山东省临折市 性别E刿 痔$子女的姓名;三叔出生日期-19?人盹,14吃寡锤住址:山东省味沂市性别E男-甘耳*M 十甘* 比甘 *車#*卑十甘* -甘甘姓名:誉爸出主日ffl; 1966.05. 0&憲庭住址:山东卷曲沂市 性别;B男衰子 姓窑:妈妈 是否健在U-健在.0去世h 1語1个子女的姓名;我 出生日期;1的&10”餡 羸庭住址;山东省临沂市 性别B男_ _甘*口* *好电*卑十曲*m也淖-姓名:我出生日期:1轴

9、反1机昂鼠露住址山东省临折市 性别:BB至今没有配偶和子女-林常* 脚常杠術_- 审林 *林*H1尊*姓茗:二扭由生日期:MTO.QB.%妄庭住址I山朿省柿沂血 性别:日男妻子姓名;二婶 是否琏在-健在.0去世):1第1+子女的姓宕:姐姐 出生日期=1991. 02. 14康庭住址:山东省临沂市 性别G女-W*-啊席 _杠宰_ *#- *-W*-林*- -黔黑辭子/生日纵妄庭住址性孙肢-*-*- *-*-*=t*- *-3*-*-姓容:三叔出生臼期:1977. 02. 148家庭住址:山东省临沂市性别:E男妄子胖富:一.轉 是否傩右订佢在.卜去世h 1毎1个子女的姓名;第弟出生Sffi:200

10、L &3. 25冢啦件工:山东省临祈市性别E男图1家族树- X是否懂在【1-淫在.0-去世:0是否選在【1-達在.0-去世:0是否強圧门-鰹圧0-壬世:0是否雯在(1-退在“0-去世:0是否惟在 5-選在.0-去抵:1是否禮在(1-退在.0-去世:1是否惟在 5-遵在.0-去世:1是善嚏在口僅在.俨去世H】是否傕在U-鰹在.0-去世:1眉善嚏在口雙在.0-去世h】是否憶击【1-淫在0-去世:1是否惟在 5-聲在.0-去世:1是否塔在1-蜚在.o-去世:1 I图2显示家谱- *-一 丰 n * *4*-一*张软拼音半:第总出13:2001.03.25姦霍住址:山帝省1話诉帀性别:E更WI

11、 I V JTT . xTv T J yVJI I图4存盘 CUsersWifninDesktopkecheng.exe*+*+ 迎注用家族管匡集统科*s*片杆丄釉入家谱信息建立前E:辎出垂个京谱信息 口長出三日期査我其人D:按姓名査找.茶人E:鴨改英今扎的信息F;徉盘&芳盘H;退出整平程序D请输入你要資找的人的蛀容: 弟弟-*-*-*-*-*- *-*-*-您所要找的人己经找到信息如下所示:姓容:弟站岀生日期:M0L.O3.25隸庭注址:山东省笞沂市 性捌:B男是否惟在1-锻在.0-去世):1母亲姓名:三殍愛亲姓名;三叔弟弟至今还宜百配偶和菖于图3按照姓名查找家族成员 CUser5i

12、jsdminDe5ktopkechefg.Me独*輯戦料*欢迎使用家族管理.泵统*5MfM*生A :输入感谱信息連宣榕B;祐出萤牛富谱倍息心後出土三期言我基人D:按姓老査找菜人E:時改某牛人拘信总F:存盘G;读盘出退出整个程序*眼存專谱*输入文件呂及尿存位匿 eg; E:Mampl. txt): D;讥JIAFtxt新現丈件成功.艾件歷茸務径为t D AJIAPtr.txt第二组数据为:图5修改家族成员的信息图4王家家族树第二组数据测试截屏为: C :UsersadminDe5ktopkecheng.exe甘半特_谓选揉你的蜿作_+-4-*- *-A!修 改牛人的信 ft- *- *- #-申

13、-*B:舷 反婕母 虧 荷 息 *-*-? C:楼改子女的信.B*瞎* *-*-*D: Jg出-*-一車*单微软拼昔半: C MKersVadminXDesktopMcechefig.eKe图7按照生日查找某人-*-请选择你的垠作*- 审一- 嘟廉-A!修改个人箭信.息-*-4- *- *-讯 一-*-=*=4*=-一:弦改父母的植,息土一工三三=*一一*=二#B一_-承_- * 书-C;楼改子女的信患*芳一-*-* 一一一獻D!退 出-* *-一獻 * *=* *薜学改的强如仆訴就林 9 然后軽 Z 塚是否姜熔改性别:如果需荽菠轲入1不幣要僅改捉辎;Cb烘后披Ent打键進经0潸输入修改的出生

14、日期:如果不需要閤改就输入黙后按E讥戢镇讎蛭0蕾输入幡改的家庭砸址:如果不釉要侈陵就输入撤后按Ent锂錐逵0亍人信息修改成功-请按Enter!jffi建操作-I徹戟拼音半:_图6修改某个人的具体信息 CAUl3diiu1ikVdpMAt I论小牛曲芒*4*K*44欢迎匣用家族管理系统*土输入家谱佶息理立树&输出整金需谱信息按出生日聊査找吏人D:按胖名査找某人E:德改桑个人的信息F:存盘G;读盘H;退出整亍甩产您所要找的人己经找到信息如下听示:妊容:王吐二出生日翩:2帕&竊腥住址:洛阳 性别曲男 C ;05ersMadminDe5ktopMtecheng.exeint Child

15、Num; /记录这个人拥有几个儿女*我 迎便用家族if理系ETL*E:爺岀整牛疙谱洁息C:按出生日期查找某人D:按姓容査找某人E:烁盘茅牛人的信总F:存吏:G:谟盘氐退出整牛程序*读慰家谱*祕*救.人丈件容及其蹄径,以便从中读耽笨谱:文件名喪瓦路径伽:D:MHP1B.tit): E:JIA- tit图8读盘五、源程序#i nclude #i nclude #in elude #ifdef WIN32#define CLEAR system(cls)#defi neTipForSaveFilePositionprin tf(ttD:Wexample.txt):)#define TipForRea

16、dFilePosition)#else#define CLEAR system(clear)#defi neTipForSaveFilePositio nprin tf(tt/home/x ion g/example.txt):)#defi neTipForReadFilePositio nprintf(tt/home/x ion g/example.txt):) #en dif#defi ne maxFileNameLen 50 /保存的文件名的最大长度int FLAG=0;int a=1;typedef struct TreeNode输入文件名及保存位置(eg文件名及其路径(eg: D:W

17、example.txt):输入文件名及保存位置(eg文件名及其路径(egchar Name20;记录这个人的姓名char birthday20;生日int marriage;/ 婚否(1 表示结婚,0 表示没结婚)int death;/ 生死(1 表示活着,0 表示过世)char Kind;/标示节点的种类有女 G 男 Bchar address100;住址char livemassage50;死亡日期(如果其已经死亡)struct TreeNode *NextNode20; /记录这个人的儿女struct TreeNode *Pare nt; /记录这个节点的父节点TreeNode,*tre

18、e;void CreatTree(TreeNode *Tree);void OutPutAII(TreeNode *Tree);void Me nue(TreeNode *Tree);void SubMe nu e1(TreeNode * Tree);void SubMe nu e2(TreeNode *Tree);void Chan ge(TreeNode * Tree);void AddNew(TreeNode * Tree);TreeNode * SearchTree(TreeNode *Tree,char n ame,i nt len gth);TreeNode * SearchTre

19、e1(TreeNode *Tree,char birth,i nt len gth);void OutPutMessage(TreeNode * Tree,char n ame,i nt len gth);void OutPutMessage1(TreeNode * Tree,char birth,i nt len gth);void SaveFamily(TreeNode *root);void ReadFamily(TreeNode *root);int mai n()/主函数TreeNode *Tree;/TreeNode *Tree1;/Tree 仁&(*Tree);Tree=

20、(TreeNode *)malloc(sizeof(TreeNode);Tree-Pare nt =NULL;strcpy(Tree-Name,0);Menu e(Tree);return 0;void Me nue(TreeNode *Tree)/输出主菜单/*TreeNode *Tree1;Tree1= &Tree;*/char c;char n ame20;char birth20;while(1)system(cls);prin tf(t);printf(nntt*prin tf(nttprin tf(ntt printf(ntt printf(ntt printf(nttpr

21、in tf(nttprin tf(ntt prin tf(ntt c=getchar(); switch(c) case A:prin tf(nt家谱图的多叉树尚未建立请先建立树n ”);getchar();break;prin tf(nnt整个家谱的主要信息如下:”);OutPutAII(Tree);getchar();break;case C: if(strcmp(Tree-birthday,0)=0) prin tf(ntgetchar();家谱图的多叉树尚未建立请先建立树n);系 统*nn););););););nt);A:输入家谱信息建立树B:输出整个家谱信息C:按出生日期查找某人D

22、:按姓名查找某人修改某个人的信息F:存盘);G:读盘);H:退出整个程序TreeNode * NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode);printf(nt请输入姓名:);sca nf(%s,Tree-Name);prin tf(nt请输入性别女getchar();sca nf(%c, &(Tree-Ki nd);Tree-Pare nt=NewNode;Tree-Pare nt=NULL; CreatTree(Tree); /printf(nt-printf(nnt-getchar(); break;case B:if(st

23、rcmp(Tree-Name,0)=0)G 男 B:);家谱图已经建立成功- 请按 Enter 键继续操作nn);一);欢迎使用家族管E:break;prin tf(nt请输入你要查找的出生日期:”);scan f(%s,birth);OutPutMessage1(SearchTree1(Tree,birth,20),birth,20);printf(nnt-*-*-*-*-*-*-*-*-*-*-n t); getchar();break;case D:if(strcmp(Tree-Name,O)=O)prin tf(nt家谱图的多叉树尚未建立请先建立树getchar();break;pri

24、n tf(nt请输入你要查找的人的姓名:nt);sca nf(%s, name);OutPutMessage(SearchTree(Tree, name,20), name,20);printf(nnt-*-*-*-*-*-*-*-*-*-*-n t); getchar();break;case E:if(strcmp(Tree-Name,0)=0)prin tf(nt家谱图的多叉树尚未建立请先建立树getchar();break;Chan ge(Tree);getchar();break;case F:if(strcmp(Tree-Name,0)=0)prin tf(nt家谱图的多叉树尚未建

25、立请先建立树getchar();break;SaveFamily(Tree);getchar();break;case G:/*if(strcmp(Tree-Name,O)=O)prin tf(nt家谱图的多叉树尚未建立请先建立树n);n);n);n);getchar();break;*/ReadFamily( &Tree);getchar();break;case H:printf(nnt- 本次服务到此结束);printf(nt-);一欢迎下次使用.丿;printf(nt-谢谢-nn);break;case n:break;default:printf(nnt-对不起!你的选择不在

26、服务范围之内!- -);printf(nt-请您再次 选择所需的服务项!-);printf(nt-谢谢nt); getchar(); break;if (c=H|c=f)break;getchar();void CreatTree(TreeNode *Node) / 创建树int i;TreeNode *NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode);Node-NextNode0=NewNode;Node-NextNode0=NULL;prin tf(nt请输入出生日期:”);scan f(%s,Node-birthday);prin t

27、f(nt请输入家庭住址:);getchar();scan f(%s,Node-address);printf(nt请输入是否建在(1-是或 0-否):”);scan f(%d, &(Node-death);if(Node-death=0)prin tf(nt请输入去世日期:”);sca nf(%s,Node-livemassage);else if(Node-death=1)printf(nt仍然建在);printf(nt 请输入s 的配偶的姓名(输入 0 代表没结婚):,Node-Name);scan f(%s,NewNode-Name);if(strcmp(NewNode-Name

28、,0)!=0)prin tf(t请输入配偶的出生日期:”);scan f(%s,NewNode-birthday);prin tf(nt请输入家庭住址:”);getchar();scan f(%s,NewNode-address);printf(nt请输入是否建在(1-是或 0-否):”);scan f(%d,&(NewNode-death);if(NewNode-death=0)prin tf(nt请输入去世日期:”);sca nf(%s,NewNode-livemassage);else if(NewNode-death=1)printf(nt仍然建在);printf(nt 请输入

29、%s 的子女的数目(当子女输入 0 时便停止输入该成员有关信息):,Node-Name);scan f(%d, &(Node-ChildNum);if(Node-ChildNum)=0&strcmp(NewNode-Name,0)=0)return ;if(Node-K in d=G|Node-Ki nd=g)NewNode-Ki nd=B;elseNewNode-Ki nd=G;NewNode-ChildNum=0;NewNode-NextNode0=NULL;Node-NextNode0=NewNode;Node-NextNode0-Pare nt=Node;孩子的父母fo

30、r(i=1;iChildNum;i+)NewNode=(TreeNode *)malloc(sizeof(TreeNode);a+;printf(nt请输入s 的第d 子女的名字:,Node-Name,i);sca nf(%s,NewNode-Name);printf(nt请输入s 的第d 子女的性别女 G 男 B:,Node-Name,i);getchar();sca nf(%c,&NewNode-Ki nd);NewNode-ChildNum=-1;NewNode-Pare nt=Node;Node-NextNodei=NewNode;CreatTree(Node-NextNode

31、i); /从子女的数目开始void OutPutAII(TreeNode *Tree)int i, flag=0;prin tf(nt- * * * * * * * * * );printf(nt姓名:%s出生日期:%s家庭住址:%s 性另 U: %c,Tree-Name,Tree-birthday,Tree-address,Tree-Ki nd);if (Tree-K in d=G|Tree-Ki nd=g)flag=1;prin tf(女);elseprin tf(男);printf(t是否健在(1-健在,0-去世):”);if(Tree-death=1) pri ntf(1);else

32、if(Tree-death=0) pri ntf(0);if (!(Tree-NextNode0)prin tf(nt至今没有配偶和子女n);return;if(flag=1)printf(nt丈夫姓名:%s,Tree-NextNode0-Name);elseprintf(nt妻子姓名:s,Tree-NextNode0-Name);printf(t是否健在(1-健在,0-去世):”);if(Tree-death=1) pri ntf(1);else if(Tree-death=0) pri ntf(0);for(i=1;iChildNum;i+)printf(nt第%d 个子女的姓名:%s出生

33、日期:%s家庭 住址:%s 性别c,i,Tree-NextNodei-Name,Tree-NextNodei-birthday,Tree-NextNodei-address,Tree-NextNodei-Ki nd);if (Tree-NextNodei-Ki nd=G|Tree-NextNodei-Ki nd=g)prin tf(女);e-seprinm-迪prinff(池nMamram9卅洋二if(Treevdeafhuul)prinff(_z=)八e-seif(Treevdeafhuuo)prinff(=o=)八prinmvlw)for(llxUTreevchi-dNumT+)宀0ufp

34、utA=(TreeVNexfNode三)八TreeNode*searchTree(TreeNode*Treeoharname-Linf-engfh)宀5二TreeNode*NewNode 八if(s=rcmp(TreeVNampnamellHO)宀if(-engfhuuo)FLAG丄e-seFLAGUarefurnTree-ifcrreelvNexfNodeoHHNULL)refurnNUFfor(lloxUTreevchi-dNumT+)宀if(llHO)NewNodeusearchTree(TreeVNexfNode=Lnameoxe-seNewNodeusearchTree(TreeVN

35、exfNode=Lnamp20=if(NewNodeilNULL)recrnNewNodprecrnNULL八void0ufpufMessage(TreeN0de*Treeoharname-Linf-engfh)in二aguoRTreeNode*NewNodpifcrreesNULL)*n, name);return;prin tf(nnt您所要找的人已经找到信息如下所示:”);prin tf(nnt姓名:%s 出生日期:%s家庭住址另 U :%c, name,Tree-birthday,Tree-address,Tree-K in d);if (Tree-K in d=G|Tree-Ki n

36、d=g)flag=1; /标记他(她)的性别prin tf(女);elseprin tf(男);printf(t是否健在(1-健在,0-去世):”);if(Tree-death=1) pri ntf(1);else if(Tree-death=0) pri ntf(0);NewNode=Tree-Pare nt;if (FLAG=1)if(flag=1)prin tf(nnt她是嫁入此家族的所以亲生父母信息不在家谱内包括printf(nt丈夫姓名:%s,NewNode-Name);elseprin tf(nnt他是入赘此家族的所以亲生父母信息不在家谱内包括printf(nt妻子姓名:%s,Ne

37、wNode-Name);if (NewNode-ChildNum)0) /printf(nt的孩子的信息如下:);/ 输出他(她)的孩子的信息for(i=1;iChildNum;i+)printf(nt姓名:%s 性别:,NewNode-NextNodei-Name);if (NewNode-NextNodei-Ki nd=G|NewNode-Ki nd=g) prin tf(女);elseprin tf(男);printf(t是否健在(1-健在,0-去世):”);if(Tree-death=1) prin tf(1);printf(nnt*该家谱图中没有%s 这个人的信息请确认是否输入错误%

38、s 性););判断他(她)是否有孩子else if(Tree-death=0) prin tf(0);return;if(NewNode=NULL)判断它是不是根节点如果是的话就没有父母兄弟信息 prin tf(nt是这个家谱图里最年长的人”,n ame);elseif (NewNode-Ki nd=G|NewNode-Ki nd=g) /判断父亲节点是父亲还是母亲printf(nt母亲姓名:s,NewNode-Name);输出他(她)的父母亲的信息printf(nt父亲姓名:s,NewNode-NextNode0-Name);elseprintf(nt母亲姓名:s,NewNode-NextN

39、ode0-Name);printf(nt父亲姓名:%s,NewNode-Name);if(Tree-NextNode0!=NULL) / 判断他(她)是否有配偶if(flag=1)/ 输出他(她)的配偶的信息printf(nt丈夫姓名:s,Tree-NextNode0-Name);elseprintf(nt妻子姓名:s,Tree-NextNode0-Name);if (Tree-ChildNum0) / 判断他(她)是否有孩子printf(nt的孩子的信息如下:);/输出他(她)的孩子的信息for(i=1;iChildNum;i+)printf(nt 姓名:%s 性别:,Tree-NextNo

40、dei-Name);if (Tree-NextNodei-K in d=G|Tree-Ki nd=g)prin tf(女);elseprin tf(男);printf(t是否健在(1-健在,0-去世):”);if(Tree-death=1) pri ntf(1);else if(Tree-death=0) pri ntf(0);elseprintf(nt%s至今还没有孩子”,name);elseprin tf(nt%s至今还没有配偶和孩子 n,Tree-Name);TreeNode * SearchTree1(TreeNode *Tree,char birth,i nt len gth)int

41、 i;TreeNode *NewNode;if(strcmp(Tree-birthday,birth)=0)if(le ngth=0)FLAG=1;elseFLAG=0;return Tree;if(Tree-NextNode0=NULL)return NULL;for(i=0;iChildNum;i+)if (i=0)NewNode=SearchTree1(Tree-NextNodei,birth,0);elseNewNode=SearchTree1(Tree-NextNodei,birth,20);if (NewNode!=NULL)return NewNode;return NULL;v

42、oid OutPutMessage1(TreeNode * Tree,char birth,i nt len gth)int flag=0,i;TreeNode *NewNode;prin tf(nnt* *if(Tree=NULL)printf(nnt* 错误*“ ”,birth);该家谱图中没有出生日期为%s 这个人的信息请确认是否输入return;prin tf(nnt您所要找的人已经找到信息如下所示:);prin tf(nnt姓名:s 出生日期:s 家庭住址:s 性另 U :%c,Tree-Name,Tree-birthday,Tree-address,Tree-K in d);if

43、(Tree-K in d=G|Tree-Ki nd=g)flag=1; /标记他(她)的性别prin tf(女);elseprin tf(男);void Cha nge(TreeNode * Tree) /修改某个人的信息char n ame20;TreeNode * NewNode;prin tf(nt请输入你要修改的人的姓名:nt);sca nf(%s, name);NewNode=SearchTree(Tree, name,20);if(NewNode=NULL)printf(nnt*该家谱图中没有%s 这个人的信息请确认是否输入错误*、n, name);return;elseSubMe

44、 nu el(NewNode);void SubMe nue1(TreeNode * Tree) / 输出副菜单char c;int flag,i;char n ame20;char birth20;char address150;char Pare nt220;TreeNode * NewNode;getchar();while(1)system(cls); prin tf(t); prin tf(nnt);*请选择你的操作-*printf(nt-*-*- -*-A:修改个人的信息-);printf(nt-*-*-*-B:修改父母的信息-);printf(nt-*-*-*-C:修改子女的信息

45、-);printf(nt-*-*-*-D:退出-*-*-*-*-*-*-*-*-*-nt);c=getchar();switch(c)case A:printf(nnt请输入修改的姓名:如果不需要修改就输入0然后按 Enter 键继续 nt);sca nf(%s, name);if(strcmp( name,0)!=0)strcpy(Tree-Name, name);printf(nnt是否要修改性别:如果需要就输入1不需要修改就输入0然后按Enter 键继续 nt);scan f(%d, &flag);if (flag=1)if(Tree-Ki nd=G|Tree-Ki nd=g)T

46、ree-Ki nd=B;else Tree-Ki nd=G;printf(nnt请输入修改的出生日期:如果不需要修改就输入0然后按 Enter键继续nt);scan f(%s,birth);if(strcmp(birth,0)!=0)strcpy(Tree-birthday,birth);printf(nnt请输入修改的家庭地址:如果不需要修改就输入0然后按 Enter键继续nt);scan f(%s,address1);if(strcmp(address1,0)!=0)strcpy(Tree-address,address1);prin tf(nnt个人信息修改成功”);break;case

47、 B:if(Tree-Pare nt=NULL) /判断是不是头节点prin tf(nt是这个家谱图里最顶端的人没有父母信息!, name);break;if (FLAG=1) II判断是不是入赘或加入此间的if(Tree-K in d=G|Tree-Ki nd=g)prin tf(nnt她是嫁入此间的所以父母信息不在家谱内包括”);elseprin tf(nnt他是入赘此间的所以父母信息不在家谱内包括”);break;if(Tree-Pare nt-Ki nd=G|Tree-Pare nt-Ki nd=g)strcpy(ParentO,母亲);strcpy(Parent1,父亲);elses

48、trcpy(ParentO,父亲);strcpy(Parent1,母亲);printf(nnt请输入s 要修改的姓名:如果不需要修改就输入 0然后按继续 nt,Pare nt0);sca nf(%s, name);if(strcmp( name,0)!=0)strcpy(Tree-Pare nt-Name, name);printf(nnt请输入s 要修改的姓名:如果不需要修改就输入 0然后按继续 nt,Pare nt1);sca nf(%s, name);if(strcmp( name,0)!=0)strcpy(Tree-Pare nt-NextNode0-Name ,n ame);prin

49、tf(nnt- 父母的信息修改成功 -);break;case C:if(Tree-ChildNum=0)printf(nnt至今还没有子女”);break;if (Tree-Parent !=NULL)Enter 键Enter 键如果他if (strcmp(Tree-Name,Tree-Pare nt-NextNode0-Name)=0)是入赘或者是嫁入的就需用配偶节点完成修改Tree=Tree-Pare nt;for(i=1;iChildNum;i+)printf(nnt请输入s 修改的姓名:如果不需要修改就输入 0然后按 Enter 键继续 nt,Tree-NextNodei-Name)

50、;sca nf(%s, name);if(strcmp( name,O)!=O)strcpy(Tree-NextNodei-Name, name);printf(nnt是否要修改性别:如果需要就输入1不需要修改就输入0然后按 Enter 键继续nt);scan f(%d, &flag);if (flag=1)if(Tree-NextNodei-K in d=G|Tree-NextNodei-Ki nd=g) Tree-NextNodei-Ki nd=B; elseTree-NextNodei-Ki nd=G:printf(nnt- 子女的信息修改成功 -);break;case D:b

51、reak; case n: break; default:printf(nnt-对不起!你的选择不在服务范围之内!-);printf(nt- 请您再次选择所需的服务项!-);printf(nt- 谢谢合作!-nt);break;if (c=D|c=d)break;printf(nnt- 请按 Enter 键继续操作getchar();getchar();void SaveFamily(TreeNode *root)保存家谱至指定文件char saveFileNamemaxFileNameLe n;printf(nnt本项服务到此结束-) ;);FILE* fp;TreeNode *queue5

52、0, *head;int i, front, rear;/队列的头指针,尾指针prin tf(*保存家谱* nn);if(root=NULL)if(root = NULL)prin tf(tt家谱中无成员,无法保存!n);return;TipForSaveFilePositio n;文件及其绝对路径格式scan f(%s, saveFileName);getchar();fp = fopen(saveFileName, w);不存在则新建。存在,则从文件起始位置写,原内容将被覆盖。if(fp = NULL)prin tf(tt新建文件失败!n);return ;elseprin tf(tt新建

53、文件成功,文件及其路径为:%sn, saveFileName);/*利用宽度优先搜索遍历家族多叉树*/fwrite(root, sizeof(TreeNode), 1, fp); /将根结点存入文件(二进制形式)front = rear = 0;/初始化空队queuerear+ = root;/ 根结点进队 while(fro nt != rear)/队列不为空head = queuefro nt+;队头元素出队if (head-NextNode0 != NULL)fwrite(head-NextNode0, sizeof(TreeNode), 1, fp);for(i=1; iChildNu

54、m; i+)fwrite(head-NextNodei, sizeof(TreeNode), 1, fp); queuerear+ = head-NextNodei;fclose(fp);fp = NULL;void ReadFamily(tree *root)从指定文件中读取家谱FILE* fp;char readFileName50;tree queue50,head;int i, front, rear;prin tf(*读取家谱* nn);prin tf(tt输入文件名及其路径,以便从中读取家谱。n);TipForReadFilePositi on;scanf(%s, readFileName);getchar();fp = fopen(readFileName, r);为读而打

温馨提示

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

评论

0/150

提交评论