【Selected】家谱管理系统(含源代码).docx.pdf

上传人:l*** 文档编号:72140854 上传时间:2023-02-08 格式:PDF 页数:12 大小:412.50KB
返回 下载 相关 举报
【Selected】家谱管理系统(含源代码).docx.pdf_第1页
第1页 / 共12页
【Selected】家谱管理系统(含源代码).docx.pdf_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《【Selected】家谱管理系统(含源代码).docx.pdf》由会员分享,可在线阅读,更多相关《【Selected】家谱管理系统(含源代码).docx.pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Important&Selected Documents家谱管理系统C 语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。排答疑和辅导。完整代码:#include#include#includeintMATEFLAG=0;/是否入赘或嫁入这家的,1 表示为是,0 表示否tRpedefstructTreeNode/树节点定

2、义intNum;/保存此人儿女个数charName20;/保存此人姓名charKind;/保存此人性别,男 M,女 FstructTreeNodeRNeRtNode20;/保存此人的儿女,NeRtNode0里存放配偶的地址structTreeNodeRParent;/保存此节点的父节点TreeNode;voidCreatTree(TreeNodeRTree);/创建树voidOutPutAll(TreeNodeRTree);/输出树TreeNodeRSearchTree(TreeNodeRTree,charname,intlength);voidMainMenu(TreeNodeRTree);

3、voidSubMenue1(TreeNodeRTree);voidSubMenue2(TreeNodeRTree);voidChange(TreeNodeRTree);voidAddNew(TreeNodeRTree);voidOutPutMessage(TreeNodeRTree,charname,intlength);/主函数voidmain()TreeNodeRTree;/产生根节点Tree=(TreeNodeR)malloc(sizeof(TreeNode);Tree-Parent=NULL;strcpR(Tree-Name,0);MainMenu(Tree);/显示主菜单/添加新的成

4、员voidAddNew(TreeNodeRTree)SubMenue2(Tree);/添加新成员界面/显示添加家庭信息的界面voidSubMenue2(TreeNodeRTree)charc;intnum;charname20;TreeNodeRNewNode;getchar();while(1)Important&Selected DocumentsImportant&Selected DocumentssRstem(cls);printf(请选择你的操作n);printf(A:添加某个人的子女的信息n);printf(B:添加某个人配偶的信息n);printf(C:退出n);printf(

5、请选择相应功能:n);c=getchar();switch(c)caseA:/添加子女信息printf(请输入那个人的名字:n);scanf(%s,name);Tree=SearchTree(Tree,name,20);/在家谱里查找这个人if(Tree=NULL)printf(该家谱图中没有%s 这个人的信息请确认是否输入错误n,name);break;if(Tree-Parent=NULL&Tree-NeRtNode0=NULL|Tree-Parent!=NULL&Tree-Name!=Tree-Parent-NeRtNode0-Name)printf(至今还没有配偶请先添加配偶n,Tre

6、e-Name);break;if(Tree-Parent=NULL&(Tree-Num20|Tree-NumNum=0;if(MATEFLAG=1)Tree=Tree-Parent;NewNode=(TreeNodeR)malloc(sizeof(TreeNode);printf(请输入添加人员姓名:n);scanf(%s,NewNode-Name);printf(请输入添加人员性别女F 男 M:n);scanf(%1s,&NewNode-Kind);num=Tree-Num;NewNode-NeRtNode0=(TreeNodeR)malloc(sizeof(TreeNode);NewNod

7、e-NeRtNode0=NULL;NewNode-Num=0;NewNode-Parent=Tree;Tree-NeRtNodenum+1=NewNode;Tree-Num=Tree-Num+1;printf(子女的信息添加成功n);break;caseB:printf(请输入那个人的名字:n);scanf(%s,name);Tree=SearchTree(Tree,name,20);if(Tree-Parent!=NULL&strcmp(Tree-Name,Tree-Parent-NeRtNode0-Name)=0|Tree-NeRtNode0!=NULL)printf(已经有了配偶n);b

8、reak;if(Tree=NULL)Important&Selected DocumentsImportant&Selected Documentsprintf(该家谱图中没有%s 这个人的信息请确认n,name);break;NewNode=(TreeNodeR)malloc(sizeof(TreeNode);printf(请输入添加人员姓名:n);scanf(%s,NewNode-Name);printf(请输入添加人员性别女F 男 M:n);scanf(%1s,&NewNode-Kind);NewNode-Parent=Tree;Tree-NeRtNode0=NewNode;break;

9、caseC:printf(本项服务到此结束n);break;casen:break;default:printf(对不起!你的选择错误n);break;if(c=C|c=c)break;printf(请按 Enter 键继续操作n);getchar();getchar();/修改某个人的信息voidChange(TreeNodeRTree)charname20;TreeNodeRNewNode;printf(请输入你要修改的人的信息:n);scanf(%s,name);NewNode=SearchTree(Tree,name,20);if(NewNode=NULL)printf(该家谱图中没有

10、%s 这个人的信息请确认是否输入错误n,name);return;elseSubMenue1(NewNode);/输出副菜单voidSubMenue1(TreeNodeRTree)charc;intflag,i;charname20;charParent220;Important&Selected DocumentsImportant&Selected DocumentsTreeNodeRNewNode;getchar();while(1)sRstem(cls);printf(请选择你的操作n);printf(A:修改个人的信息n);printf(B:修改父母的信息n);printf(C:修改

11、兄弟姐妹的信息n);printf(D:修改子女的信息n);printf(E:修改配偶的信息n);printf(F:退出n);c=getchar();switch(c)caseA:printf(请输入修改的姓名:如果不需要修改就输入0然后按 Enter 键继续n);scanf(%s,name);if(strcmp(name,0)!=0)strcpR(Tree-Name,name);printf(是否要修改性别:如果需要就输入1不需要修改就输入0然后按 Enter 键继续n);scanf(%d,&flag);if(flag=1)if(Tree-Kind=F|Tree-Kind=f)Tree-Kin

12、d=M;elseTree-Kind=F;printf(个人信息修改成功n);break;caseB:if(Tree-Parent=NULL)/判断是不是头节点printf(是这个家谱图里最顶端的人没有父母信息!n,name);break;if(MATEFLAG=1)/判断是不是入赘或加入此间的if(Tree-Kind=F|Tree-Kind=f)printf(她是嫁入此间的所以父母信息不在家谱内包括n);elseprintf(他是入赘此间的所以父母信息不在家谱内包括n);break;if(Tree-Parent-Kind=F|Tree-Parent-Kind=f)Important&Selec

13、ted DocumentsImportant&Selected DocumentsstrcpR(Parent0,母亲);strcpR(Parent1,父亲);elsestrcpR(Parent0,父亲);strcpR(Parent1,母亲);printf(请输入%s 要修改的姓名:如果不需要修改就输入0然后按 Enter 键继续n,Parent0);scanf(%s,name);if(strcmp(name,0)!=0)strcpR(Tree-Parent-Name,name);printf(请输入%s 要修改的姓名:如果不需要修改就输入0然后按 Enter 键继续n,Parent1);sca

14、nf(%s,name);if(strcmp(name,0)!=0)strcpR(Tree-Parent-NeRtNode0-Name,name);printf(父母的信息修改成功n);break;caseC:NewNode=Tree-Parent;if(NewNode=NULL)/判断是不是头节点printf(是这个家谱图里最顶端的人没有兄弟姐妹信息!n,name);break;if(MATEFLAG=1)/判断是不是入赘或嫁入这家的if(Tree-Kind=F|Tree-Kind=f)printf(她是嫁入此间的所以兄弟姐妹信息不在家谱内包括n);elseprintf(他是入赘此间的所以兄弟

15、姐妹信息不在家谱内包括n);break;if(NewNode-Num=1)printf(没有兄弟姐妹n);break;elsefor(i=1;iNum;i+)if(NewNode-NeRtNodei-Name!=Tree-Name)printf(请输入%s 修改的姓名:如果不需要修改就输入0然后按Important&Selected DocumentsImportant&Selected DocumentsEnter 键继续n,NewNode-NeRtNodei-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpR(NewNode-NeRtNodei

16、-Name,name);printf(是否要修改性别:如果需要就输入1不需要修改就输入0然后按 Enter 键继续n);scanf(%d,&flag);if(flag=1)if(NewNode-NeRtNodei-Kind=G|NewNode-NeRtNodei-Kind=g)NewNode-NeRtNodei-Kind=B;elseNewNode-NeRtNodei-Kind=G;printf(兄弟姐妹的信息修改成功n);break;caseD:if(Tree-Num=0)printf(至今还没有子女n);break;if(Tree-Parent!=NULL)if(strcmp(Tree-N

17、ame,Tree-Parent-NeRtNode0-Name)=0)/如果他是入赘或者是嫁入的就需用配偶节点完成修改Tree=Tree-Parent;for(i=1;iNum;i+)printf(请输入%s 修改的姓名:如果不需要修改就输入0然后按 Enter 键继续n,Tree-NeRtNodei-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpR(Tree-NeRtNodei-Name,name);printf(是否要修改性别:如果需要就输入1不需要修改就输入0然后按Enter 键继续n);scanf(%d,&flag);if(flag=1)i

18、f(Tree-NeRtNodei-Kind=F|Tree-NeRtNodei-Kind=f)Tree-NeRtNodei-Kind=M;elseTree-NeRtNodei-Kind=F;printf(子女的信息修改成功n);break;caseE:if(Tree-Parent!=NULL)ifImportant&Selected DocumentsImportant&Selected Documents(Tree-NeRtNode0=NULL&strcmp(Tree-Name,Tree-Parent-NeRtNode0-Name)!=0)printf(至今还没有配偶n);break;if(s

19、trcmp(Tree-Name,Tree-Parent-NeRtNode0-Name)=0)printf(nnt 请输入%s 修改的姓名:如果不需要修改就输入0然后按Enter 键继续nt,Tree-Parent-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpR(Tree-Parent-Name,name);elseprintf(nnt 请输入%s 修改的姓名:如果不需要修改就输入0然后按Enter 键继续nt,Tree-NeRtNode0-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpR(Tree

20、-NeRtNode0-Name,name);elseif(Tree-NeRtNode0=NULL)printf(至今还没有配偶n);elseprintf(nnt 请输入%s 修改的姓名:如果不需要修改就输入0然后按Enter 键继续nt,Tree-NeRtNode0-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpR(Tree-NeRtNode0-Name,name);printf(配偶的信息修改成功n);break;caseF:printf(本项服务到此结束n);break;casen:break;default:printf(对不起!你的选择错

21、误n);break;if(c=F|c=f)break;printf(请按 Enter 键继续操作n);getchar();getchar();Important&Selected DocumentsImportant&Selected Documents/输出主菜单voidMainMenu(TreeNodeRTree)charc;/用于接受用户输入的选项charname20;while(1)sRstem(cls);/清屏printf(欢迎进入家谱管理系统nnn);printf(菜单 nn);printf(输入家谱信息-1n);printf(查找家族成员-2n);printf(添加家族成员-3n

22、);printf(输出家谱信息-4n);printf(修改成员信息-5n);printf(退出-6n);printf(nnn);printf(请选择相应的功能:n);c=getchar();switch(c)case1:TreeNodeRNewNode;NewNode=(TreeNodeR)malloc(sizeof(TreeNode);/建 立 新 节 点printf(请输入姓名:);scanf(%s,Tree-Name);/给节点姓名赋值 printf(请输入性别(女 F,男M):);getchar();/给 性 别 赋 值scanf(%c,&(Tree-Kind);/Tree-Paren

23、t=NewNode;Tree-Parent=NULL;CreatTree(Tree);printf(家谱图已经建立成功n);printf(请按 Enter 键继续操作n);getchar();break;case2:if(strcmp(Tree-Name,0)=0)printf(家谱图还未建立请先建立n);getchar();break;printf(请输入你要查找的人的姓名:n);scanf(%s,name);OutPutMessage(SearchTree(Tree,name,20),name,20);getchar();break;case3:if(strcmp(Tree-Name,0)

24、=0)printf(家谱图还未建立请先建立n);getchar();break;AddNew(Tree);getchar();break;case4:if(strcmp(Tree-Name,0)=0)printf(家谱图还未建立请先建立n);getchar();break;printf(整个家谱的主要信息如下:n);OutPutAll(Tree);getchar();break;case5:if(strcmp(Tree-Name,0)=0)printf(家谱图还未建立请先建立n);getchar();break;Change(Tree);getchar();break;case6:printf

25、(本程序结束,欢迎下次使用。n);eRit(0);break;casen:Important&Selected DocumentsImportant&Selected Documentsbreak;default:printf(您输入错误,请重新输入。n);getchar();break;getchar();/创建树voidCreatTree(TreeNodeRNode)inti;TreeNodeRNewNode;NewNode=(TreeNodeR)malloc(sizeof(TreeNode);Node-NeRtNode0=NewNode;/Node-NeRtNode0=NULL;prin

26、tf(请输入%s 的子女的数目:n,Node-Name);scanf(%d,&(Node-Num);printf(请输入%s 的配偶的姓名:n,Node-Name);scanf(%s,NewNode-Name);if(Node-Num)=0&strcmp(NewNode-Name,0)=0)return;if(Node-Kind=F|Node-Kind=f)/自动填写其配偶的性别NewNode-Kind=M;elseNewNode-Kind=F;NewNode-Num=0;NewNode-NeRtNode0=NULL;Node-NeRtNode0=NewNode;Node-NeRtNode0-

27、Parent=Node;for(i=1;iNum;i+)NewNode=(TreeNodeR)malloc(sizeof(TreeNode);printf(请输入%s 的第%d 子女的名字n,Node-Name,i);scanf(%s,NewNode-Name);printf(请输入%s 的第%d 子女的性别女 F 男 M:n,Node-Name,i);getchar();scanf(%c,&NewNode-Kind);NewNode-Num=0;NewNode-Parent=Node;Node-NeRtNodei=NewNode;CreatTree(Node-NeRtNodei);/遍历并输

28、出树中的内容voidOutPutAll(TreeNodeRTree)inti,flag=0;/flag 记录节点的性别printf(%s 性别:,Tree-Name);if(Tree-Kind=F|Tree-Kind=f)flag=1;Important&Selected DocumentsImportant&Selected Documentsprintf(女n);elseprintf(男n);if(!(Tree-NeRtNode0)printf(至今没有配偶和子女n);return;if(flag=1)/flag=1 表示性别为女printf(丈夫的姓名:%sn,Tree-NeRtNode

29、0-Name);elseprintf(妻子的姓名:%sn,Tree-NeRtNode0-Name);for(i=1;iNum;i+)printf(第%d 个子女的姓名别:,i,Tree-NeRtNodei-Name,Tree-NeRtNodei-Kind);if(Tree-NeRtNodei-Kind=F|Tree-NeRtNodei-Kind=f)printf(女n);elseprintf(男n);for(i=1;iNum;i+)OutPutAll(Tree-NeRtNodei);/在树中经过遍历查找某个人TreeNodeRSearchTree(TreeNodeRTree,charname,

30、intlength)inti;TreeNodeRNewNode;if(strcmp(Tree-Name,name)=0)if(length=0)MATEFLAG=1;elseMATEFLAG=0;returnTree;if(Tree-NeRtNode0=NULL)returnNULL;for(i=0;iNum;i+):%s性if(i=0)NewNode=SearchTree(Tree-NeRtNodei,name,0);elseNewNode=SearchTree(Tree-NeRtNodei,name,20);if(NewNode!=NULL)returnNewNode;returnNULL

31、;/输出已经查找到的人的信息voidOutPutMessage(TreeNodeRTree,charname,intlength)Important&Selected DocumentsImportant&Selected Documentsintflag=0,i;/flag 标记性别TreeNodeRNewNode;if(Tree=NULL)printf(该家谱图中没有%s 这个人n,name);return;printf(您找的人信息如下:n);printf(%s 性别:,name);if(Tree-Kind=F|Tree-Kind=f)flag=1;/标记的性别 printf(女n);e

32、lseprintf(男n);NewNode=Tree-Parent;/父母信息放到 NewNode 里if(MATEFLAG=1)/此人为这家人的伴侣if(flag=1)/性别为女printf(她是嫁入这家的,所以父母信息不在家谱内包括n);printf(丈夫的姓名:%sn,NewNode-Name);else/性别为男printf(他是入赘这家的所以父母信息不在家谱内包括n);printf(妻子的姓名:%sn,NewNode-Name);if(NewNode-Num)0)/判断他(她)是否有孩子printf(孩子的信息如下:n);/输出他(她)的孩子的信息 for(i=1;iNum;i+)p

33、rintf(%s 性别:,NewNode-NeRtNodei-Name);if(NewNode-NeRtNodei-Kind=F|NewNode-Kind=f)printf(女n);elseprintf(男n);return;if(NewNode=NULL)/判断它是不是根节点如果是的话就没有父母兄弟信息printf(是这个家谱图里最顶端的人!n,name);elseif(NewNode-Kind=F|NewNode-Kind=f)/判断父亲节点是父亲还是母亲/输出他(她)的父母亲的信息printf(母亲的姓名:%sn,NewNode-Name);printf(父亲的姓名:%sn,NewNod

34、e-NeRtNode0-Name);elseprintf(母亲的姓名:%sn,NewNode-NeRtNode0-Name);Important&Selected DocumentsImportant&Selected Documentsprintf(父亲的姓名:%sn,NewNode-Name);if(NewNode-Num1)/判断他(她)是否有兄弟姐妹/输出他(她)的兄弟姐妹的信息printf(%s 的兄弟姐妹信息如下:n,name);for(i=1;iNum;i+)if(NewNode-NeRtNodei)printf(%s 性别:,NewNode-NeRtNodei-Name,New

35、Node-NeRtNodei-Name);if(NewNode-NeRtNodei-Kind=F|Tree-Kind=f)printf(女n);elseprintf(男n);elseprintf(%s 没有兄弟姐妹!n,Tree-Name);if(Tree-NeRtNode0!=NULL)/判断他(她)是否有配偶/输出他(她)的配偶的信息if(flag=1)printf(丈夫的姓名:%s,Tree-NeRtNode0-Name);elseprintf(妻子的姓名:%s,Tree-NeRtNode0-Name);if(Tree-Num0)/判断他(她)是否有孩子printf(孩子的信息如下:n);/输出他(她)的孩子的信息 for(i=1;iNum;i+)printf(%s 性别:,Tree-NeRtNodei-Name);if(Tree-NeRtNodei-Kind=F|Tree-Kind=f)printf(女n);elseprintf(男n);elseprintf(%s 至今还没有孩子n,name);elseprintf(%s 至今还没有配偶和孩子n,Tree-Name);Important&Selected Documents

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁