版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、家谱管理系统 C 语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。排答疑和辅导。完整代码:#include #include #include int MATEFLAG=0; /是否入赘或嫁入这家的,1 表示为是, 0 表示否typedefstructTreeNode/树节点定义intNum;/ 保存此人儿女个数cha
2、r Name20; / 保存此人姓名char Kind;/ 保存此人性别,男M,女 FstructTreeNode * NextNode20;/保存此人的儿女 ,NextNode0 里存放配偶的地址structTreeNode * Parent;/保存此节点的父节点TreeNode;void CreatTree(TreeNode *Tree);/ 创建树void OutPutAll(TreeNode *Tree);/输出树TreeNode*SearchTree(TreeNode *Tree,char name,int length);voidMainMenu(TreeNode *Tree);
3、void SubMenue1(TreeNode * Tree); void SubMenue2(TreeNode *Tree); void Change(TreeNode * Tree); voidAddNew(TreeNode * Tree); voidOutPutMessage(TreeNode * Tree,char name,int length);主函数void main()TreeNode *Tree;/ 产生根节点Tree=(TreeNode *)malloc(sizeof(TreeNode);Tree-Parent =NULL;strcpy(Tree-Name,0);MainM
4、enu(Tree);/ 显示主菜单添加新的成员voidAddNew(TreeNode * Tree)显示添加家庭信息的界面void SubMenue2(TreeNode *Tree)char c;intnum;char name20;TreeNode * NewNode;getchar();while(1)system(cls);printf( 请选择你的操作n);printf(A: 添加某个人的子女的信息n);printf(B: 添加某个人配偶的信息n);printf(C: 退出 n);printf( 请选择相应功能:n);c=getchar();switch(c)case A:/ 添加子女
5、信息printf( 请输入那个人的名字:n);scanf(%s,name);Tree=SearchTree(Tree,name,20);/在家谱里查找这个人if(Tree=NULL)printf( 该家谱图中没有%s这个人的信息请确认是否输入错误n,name);break;if(Tree-Parent=NULL&Tree-NextNode0=NULL|Tree-Parent!=NULL&Tree-N ame!=Tree-Parent-NextNode0-Name)printf( 至今还没有配偶请先添加配偶n,Tree-Name);break;if(Tree-Parent=NULL&(Tree-
6、Num20|Tree-NumNum=0;if(MATEFLAG=1)Tree=Tree-Parent;NewNode=(TreeNode *)malloc(sizeof(TreeNode);printf( 请输入添加人员姓名:n);scanf(%s,NewNode-Name);printf( 请输入添加人员性别女F 男 M:n);scanf(%1s,&NewNode-Kind);num=Tree-Num;NewNode-NextNode0=(TreeNode *)malloc(sizeof(TreeNode);NewNode-NextNode0=NULL;NewNode-Num=0;NewNo
7、de-Parent=Tree;Tree-NextNodenum+1=NewNode;Tree-Num=Tree-Num+1;printf( 子女的信息添加成功n);break;case B:printf( 请输入那个人的名字:n);scanf(%s,name);Tree=SearchTree(Tree,name,20);if(Tree-Parent!=NULL&strcmp(Tree-Name,Tree-Parent-NextNode0-Name)=0|T ree-NextNode0!=NULL)printf( 已经有了配偶n);break;if(Tree=NULL)printf( 该家谱图中
8、没有 %s这个人的信息请确认 n,name); break;NewNode=(TreeNode *)malloc(sizeof(TreeNode);printf( 请输入添加人员姓名:n);scanf(%s,NewNode-Name);printf( 请输入添加人员性别女F 男M:n);scanf(%1s,&NewNode-Kind);NewNode-Parent=Tree;Tree-NextNode0=NewNode;break;case C:printf( 本项服务到此结束n);break;case n:break;default:printf( 对不起 ! 你的选择错误 n);break
9、;if (c=C|c=c)break;printf( 请按 Enter 键继续操作 n);getchar();getchar();修改某个人的信息void Change(TreeNode * Tree)char name20;TreeNode * NewNode;printf( 请输入你要修改的人的信息:n);scanf(%s,name);NewNode=SearchTree(Tree,name,20);if(NewNode=NULL)printf( 该家谱图中没有%s这个人的信息请确认是否输入错误n,name);return;elseSubMenue1(NewNode);输出副菜单void
10、SubMenue1(TreeNode * Tree)char c;intflag,i;char name20;char Parent220;TreeNode * NewNode;getchar();while(1)system(cls);printf( 请选择你的操作n);printf(A: 修改个人的信息n);printf(B: 修改父母的信息n);printf(C: 修改兄弟姐妹的信息n);printf(D: 修改子女的信息n);printf(E: 修改配偶的信息n);printf(F: 退出 n);c=getchar();switch(c)case A:printf( 请输入修改的姓名:
11、如果不需要修改就输入0 然后按 Enter 键继续 n);scanf(%s,name);if(strcmp(name,0)!=0)strcpy(Tree-Name,name);printf( 是否要修改性别:如果需要就输入1 不需要修改就输入0 然后按 Enter 键继续 n);scanf(%d,&flag);if (flag=1)if(Tree-Kind=F|Tree-Kind=f)Tree-Kind=M;else Tree-Kind=F;printf( 个人信息修改成功n);break;case B:if(Tree-Parent=NULL)/判断是不是头节点printf( 是这个家谱图里最
12、顶端的人没有父母信息!n,name);break;if (MATEFLAG=1)/判断是不是入赘或加入此间的if(Tree-Kind=F|Tree-Kind=f)printf( 她是嫁入此间的所以父母信息不在家谱内包括elseprintf( 他是入赘此间的所以父母信息不在家谱内包括n);n);break;if(Tree-Parent-Kind=F|Tree-Parent-Kind=f)strcpy(Parent0, 母亲 );strcpy(Parent1, 父亲 );elsestrcpy(Parent0, 父亲 );strcpy(Parent1, 母亲 );printf( 请输入 %s 要修改
13、的姓名 :如果不需要修改就输入0 然后按 Enter 键继续n,Parent0);scanf(%s,name);if(strcmp(name,0)!=0)strcpy(Tree-Parent-Name,name);printf( 请输入 %s 要修改的姓名 :如果不需要修改就输入0 然后按 Enter 键继续n,Parent1);scanf(%s,name);if(strcmp(name,0)!=0)strcpy(Tree-Parent-NextNode0-Name,name);printf( 父母的信息修改成功n);break;case C:NewNode=Tree-Parent;if(Ne
14、wNode=NULL)/ 判断是不是头节点printf(是这个家谱图里最顶端的人没有兄弟姐妹信息!n,name);break;if (MATEFLAG=1)/判断是不是入赘或嫁入这家的if(Tree-Kind=F|Tree-Kind=f)printf( 她是嫁入此间的所以兄弟姐妹信息不在家谱内包括elseprintf( 他是入赘此间的所以兄弟姐妹信息不在家谱内包括break;n);n);if(NewNode-Num=1)printf( 没有兄弟姐妹n);break;elsefor(i=1;iNum;i+)if(NewNode-NextNodei-Name!=Tree-Name)printf(
15、请输入 %s 修改的姓名 :如果不需要修改就输入0然后按Enter 键继续 n,NewNode-NextNodei-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpy(NewNode-NextNodei-Name,name);printf( 是否要修改性别 :如果需要就输入 1 不需要修改就输入 0 然后按 Enter 键继续 n);scanf(%d,&flag);if (flag=1)if(NewNode-NextNodei-Kind=G|NewNode-NextNodei-Kind=g)NewNode-NextNodei-Kind=B;else
16、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) / 如果他是入赘或者是嫁入的就需用配偶节点完成修改Tree=Tree-Parent;for(i=1;iNum;i+)printf( 请输入 %s 修改的姓名 :如果不需要修改就输入0然后按 Enter 键继续n,Tree-NextNodei-Name);
17、 scanf(%s,name); if(strcmp(name,0)!=0) strcpy(Tree-NextNodei-Name,name);printf( 是否要修改性别 :如果需要就输入 1 不需要修改就输入 0 然后按Enter 键继续 n);scanf(%d,&flag);if (flag=1)if(Tree-NextNodei-Kind=F|Tree-NextNodei-Kind=f)Tree-NextNodei-Kind=M;else Tree-NextNodei-Kind=F;printf( 子女的信息修改成功n);break;case E:if(Tree-Parent!=NU
18、LL)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请输入%s 修改的姓名:如果不需要修改就输入0 然后按Enter键继续nt,Tree-Parent-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpy(Tree-Parent-Name,name);elseprintf(nnt请输入%s
19、 修改的姓名:如果不需要修改就输入0 然后按Enter 键继续 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请输入 %s 修改的姓名 :如果不需要修改就输入0 然后按Enter键继续nt,Tree-NextNode0-Name);scanf(%s,name);if(strcmp(name,0)!=0)strcpy(Tree-NextNod
20、e0-Name,name);printf( 配偶的信息修改成功n);break;case F:printf( 本项服务到此结束n);break;case n:break;default:printf( 对不起 ! 你的选择错误 n);break;if (c=F|c=f)break;printf( 请按 Enter 键继续操作 n);getchar();getchar();输出主菜单voidMainMenu(TreeNode *Tree)char c;/ 用于接受用户输入的选项char name20;while(1)system(cls);/ 清屏printf( 欢迎进入家谱管理系统nnn);p
21、rintf(菜单nn);printf(输入家谱信息-1n);printf(查找家族成员-2n);printf(添加家族成员-3n);printf(输出家谱信息-4n);printf(修改成员信息-5n);printf(退出 -6n);printf(nnn);printf( 请选择相应的功能:n);c=getchar();switch(c)case 1: TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode);/建立新节点printf( 请输入姓名 :);scanf(%s,Tree-Name);/ 给节点姓名赋值printf
22、( 请输入性别 (女 F,男M):);getchar();/ 给性别赋值scanf(%c,&(Tree-Kind);/Tree-Parent=NewNode;Tree-Parent=NULL; CreatTree(Tree); printf( 家谱图已经建立成功n); printf( 请按 Enter 键继续操作n); getchar(); break; case 2: if(strcmp(Tree-Name,0)=0) printf( 家谱图还未建立请先建立 n); getchar(); break; printf( 请输入你要查找的人的姓名:n); scanf(%s,name);OutPu
23、tMessage(SearchTree(Tree,name,20),name,20);getchar(); break; case 3: if(strcmp(Tree-Name,0)=0) printf( 家谱图还未建立请先建立n);getchar();break; AddNew(Tree);getchar(); break; case 4: if(strcmp(Tree-Name,0)=0) printf(家谱图还未建立请先建立n); getchar(); break; printf( 整个家谱的主要信息如下:n);OutPutAll(Tree);getchar();break;case 5
24、:if(strcmp(Tree-Name,0)=0)printf( 家谱图还未建立请先建立n);getchar();break;getchar();break;case 6:printf( 本程序结束 ,欢迎下次使用。n);exit(0);break;case n:break;default:printf( 您输入错误 ,请重新输入。 n);getchar();break;getchar();创建树voidCreatTree(TreeNode *Node)inti;TreeNode *NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode);Nod
25、e-NextNode0=NewNode;/ Node-NextNode0=NULL;printf( 请输入 %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;NewNo
26、de-NextNode0=NULL;Node-NextNode0=NewNode;Node-NextNode0-Parent=Node;for(i=1;iNum;i+)NewNode=(TreeNode *)malloc(sizeof(TreeNode);printf( 请输入 %s 的第 %d 子女的名字 n,Node-Name,i);scanf(%s,NewNode-Name);printf( 请输入 %s 的第 %d 子女的性别女getchar();scanf(%c,&NewNode-Kind);NewNode-Num=0;NewNode-Parent=Node;Node-NextNod
27、ei=NewNode;CreatTree(Node-NextNodei);/ 遍历并输出树中的内容voidOutPutAll(TreeNode *Tree)inti, flag=0;/flag记录节点的性别printf(%s性别 :,Tree-Name);if (Tree-Kind=F|Tree-Kind=f)flag=1;printf( 女 n);elseprintf( 男 n);if (!(Tree-NextNode0)printf( 至今没有配偶和子女n);return;F 男M:n,Node-Name,i);if(flag=1)/flag=1表示性别为女printf( 丈夫的姓名 :%
28、sn,Tree-NextNode0-Name);elseprintf( 妻子的姓名 :%sn,Tree-NextNode0-Name);for(i=1;iNum;i+)printf( 第 %d 个子女的姓名别:,i,Tree-NextNodei-Name,Tree-NextNodei-Kind);if (Tree-NextNodei-Kind=F|Tree-NextNodei-Kind=f)printf( 女 n);elseprintf( 男 n);for(i=1;iNum;i+)在树中经过遍历查找某个人TreeNode * SearchTree(TreeNode *Tree,char nam
29、e,int length)inti;TreeNode *NewNode;if(strcmp(Tree-Name,name)=0)if(length=0)MATEFLAG=1;elseMATEFLAG=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)returnNewNode;
30、return NULL;输出已经查找到的人的信息voidOutPutMessage(TreeNode * Tree,char name,int length)int flag=0,i;/flag标记性别TreeNode *NewNode;if(Tree=NULL)printf( 该家谱图中没有%s这个人 n,name);return;printf( 您找的人信息如下:n);printf(%s 性别 :,name);if (Tree-Kind=F|Tree-Kind=f)flag=1;标/记的性别 printf( 女 n);elseprintf(男 n);NewNode=Tree-Parent;
31、/ 父母信息放到 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+)printf(%s 性别 :,NewN
32、ode-NextNodei-Name);if (NewNode-NextNodei-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,NewNode-NextN
33、ode0-Name);elseprintf( 母亲的姓名 :%sn,NewNode-NextNode0-Name); printf( 父亲的姓名 :%sn,NewNode-Name); if (NewNode-Num1)/判断他 (她 )是否有兄弟姐妹/输出他 (她 )的兄弟姐妹的信息printf(%s 的兄弟姐妹信息如下:n,name);for(i=1;iNum;i+)if(NewNode-NextNodei)printf(%s 性别 :,NewNode-NextNodei-Name,NewNode-NextNodei-Name); if (NewNode-NextNodei-Kind=F|
34、Tree-Kind=f) printf( 女 n);elseprintf( 男 n);elseprintf(%s 没有兄弟姐妹 !n,Tree-Name);if(Tree-NextNode0!=NULL)/ 判断他 (她 )是否有配偶输/出他(她 )的配偶的信息if(flag=1)printf( 丈夫的姓名 :%s,Tree-NextNode0-Name);elseprintf( 妻子的姓名 :%s,Tree-NextNode0-Name);if (Tree-Num0)/判断他 (她 )是否有孩子printf( 孩子的信息如下:n);/ 输出他 (她)的孩子的信息for(i=1;iNum;i+
35、)printf(%s性别 :,Tree-NextNodei-Name);if (Tree-NextNodei-Kind=F|Tree-Kind=f)printf( 女 n);elseprintf( 男 n);elseprintf(%s 至今还没有孩子n,name);elseprintf(%s 至今还没有配偶和孩子n,Tree-Name);赠送以下资料管理的实践读后感德鲁克说: “管理就是界定企业的使命,并激励和组织人力资源去实现这个使命。界定使命是企业家的任务,而激励与组织人力资源是领导力的范畴,二者的结合就是管理。”提出了三个经典的问题:我们的事业是什么?我们的事业将是什么?我们的事业究竟应
36、该是什么?这三个问题经过改编完全可以应用于现在的我们:我们学习的是什么?我们学习的将是什么?我们学习的究竟应该是什么?经典之所以被称之为经典往往在于其超强的预见性 . 多年之后依然闪耀者夺目的思想光辉,熠熠发光,为处在黑暗中的人们知音了前进的方向与道路。大师之所以成为大师在于思想的高度,作品能够让人们产生心灵上的共鸣,大事记是肉身已逝,但精神依然长存.德鲁克先生管理的实践已面世半个多世纪了,在这五十多年中,有关企业管理方面的书籍可以用浩如烟海来形容。但能禁得住时间考验的的书籍还是管理的实践一书,这也从另一个侧面证明了管理的实践是一本值得认真阅读的好书。终于读完了德鲁克的管理的实践,仿佛自己游荡在上个世纪中期的企业中。这本书构筑
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 手机淘宝协议书
- 煤矿定量合同范本
- 苗木保护协议书
- 苗木转租协议书
- 蔬菜供货协议书
- 融资回购协议书
- 认购定房协议书
- 设备发放协议书
- 设备监管协议书
- 设计作品协议书
- 广西贵百河2025-2026学年高一上学期12月联考语文试题
- 2025四川航天川南火工技术有限公司招聘考试题库及答案1套
- 广东广电网络2026届秋季校园招聘185人备考题库完整答案详解
- 2025年度皮肤科工作总结及2026年工作计划
- (一诊)成都市2023级高三高中毕业班第一次诊断性检测物理试卷(含官方答案)
- 四川省2025年高职单招职业技能综合测试(中职类)汽车类试卷(含答案解析)
- 2024江苏无锡江阴高新区招聘社区专职网格员9人备考题库附答案解析
- 2025西部机场集团航空物流有限公司招聘笔试考试备考试题及答案解析
- 植入类器械规范化培训
- 水泥罐安全操作规程标准
- 腰椎间盘突出症中医分级诊疗指南(2025版版)
评论
0/150
提交评论