家谱管理系统 -数据结构大作业

合集下载

家谱的管理系统(含源代码)

家谱的管理系统(含源代码)

家谱管理系统——C 语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。

排答疑和辅导。

完整代码:#include <stdio.h>#include <stdlib.h>#include <string.h>int MATEFLAG=0; //是否入赘或嫁入这家的, 1 表示为是, 0 表示否typedefstructTreeNode//树节点定义{intNum;// 保存此人儿女个数char Name[20]; // 保存此人姓名char Kind;// 保存此人性别,男M,女 FstructTreeNode * NextNode[20];//保存此人的儿女 ,NextNode[0] 里存放配偶的地址structTreeNode * Parent;//保存此节点的父节点}TreeNode;void CreatTree(TreeNode *Tree);// 创建树void OutPutAll(TreeNode *Tree);//输出树TreeNode*SearchTree(TreeNode *Tree,char name[],int length);voidMainMenu(TreeNode *Tree); void SubMenue1(TreeNode* Tree); void SubMenue2(TreeNode *Tree); voidChange(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");MainMenu(Tree);// 显示主菜单}//添加新的成员voidAddNew(TreeNode * Tree){}//显示添加家庭信息的界面void SubMenue2(TreeNode *Tree){char c;intnum;char name[20];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':// 添加子女信息printf(" 请输入那个人的名字:\n");scanf("%s",name);Tree=SearchTree(Tree,name,20);//在家谱里查找这个人if(Tree==NULL){printf(" 该家谱图中没有%s这个人的信息请确认是否输入错误\n",name); break;}if(Tree->Parent==NULL&&Tree->NextNode[0]==NULL||Tree->Parent!=NULL&&Tree->N ame!=Tree->Parent->NextNode[0]->Name){printf(" 至今还没有配偶请先添加配偶\n",Tree->Name);break;}if(Tree->Parent==NULL&&(Tree->Num>20||Tree->Num<0))Tree->Num=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->NextNode[0]=(TreeNode *)malloc(sizeof(TreeNode));NewNode->NextNode[0]=NULL;NewNode->Num=0;NewNode->Parent=Tree;Tree->NextNode[num+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->NextNode[0]->Name)==0||T ree->NextNode[0]!=NULL){printf(" 已经有了配偶\n");break;}if(Tree==NULL){printf(" 该家谱图中没有 %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->NextNode[0]=NewNode;break;case 'C':printf(" 本项服务到此结束\n");break;case '\n':break;default:printf(" 对不起 ! 你的选择错误 \n");break;}if (c=='C'||c=='c')break;printf(" 请按 Enter 键继续操作 \n");getchar();getchar();}}//修改某个人的信息void Change(TreeNode * Tree){char name[20];TreeNode * NewNode;printf(" 请输入你要修改的人的信息:\n");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){printf(" 该家谱图中没有%s这个人的信息请确认是否输入错误\n",name); return;}else{SubMenue1(NewNode);}}//输出副菜单void SubMenue1(TreeNode * Tree){char c;intflag,i;char name[20];char Parent[2][20];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(" 请输入修改的姓名:如果不需要修改就输入'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(" 是这个家谱图里最顶端的人没有父母信息!\n",name);break;}if (MATEFLAG==1)//判断是不是入赘或加入此间的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf(" 她是嫁入此间的所以父母信息不在家谱内包括}else{printf(" 他是入赘此间的所以父母信息不在家谱内包括\n"); \n");}break;}if(Tree->Parent->Kind=='F'||Tree->Parent->Kind=='f') {strcpy(Parent[0]," 母亲 ");strcpy(Parent[1]," 父亲 ");}else{strcpy(Parent[0]," 父亲 ");strcpy(Parent[1]," 母亲 ");}printf(" 请输入 %s 要修改的姓名 :如果不需要修改就输入'0' 然后按 Enter 键继续\n",Parent[0]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);printf(" 请输入 %s 要修改的姓名 :如果不需要修改就输入'0' 然后按 Enter 键继续\n",Parent[1]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->NextNode[0]->Name,name);printf(" 父母的信息修改成功\n");break;case 'C':NewNode=Tree->Parent;if(NewNode==NULL)// 判断是不是头节点{printf("是这个家谱图里最顶端的人没有兄弟姐妹信息!\n",name);break;}if (MATEFLAG==1)//判断是不是入赘或嫁入这家的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf(" 她是嫁入此间的所以兄弟姐妹信息不在家谱内包括}else{printf(" 他是入赘此间的所以兄弟姐妹信息不在家谱内包括}break;\n"); \n");}if(NewNode->Num==1){printf(" 没有兄弟姐妹\n");break;}else{for(i=1;i<=NewNode->Num;i++){if(NewNode->NextNode[i]->Name!=Tree->Name) {printf(" 请输入 %s 修改的姓名 :如果不需要修改就输入'0'然后按Enter 键继续 \n",NewNode->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(NewNode->NextNode[i]->Name,name);printf(" 是否要修改性别 :如果需要就输入 '1' 不需要修改就输入 '0' 然后按 Enter 键继续 \n");scanf("%d",&flag);if (flag==1){if(NewNode->NextNode[i]->Kind=='G'||NewNode->NextNode[i]->Kind=='g') NewNode->NextNode[i]->Kind='B';elseNewNode->NextNode[i]->Kind='G';}}}}printf(" 兄弟姐妹的信息修改成功\n");break;case 'D':if(Tree->Num==0){printf(" 至今还没有子女\n");break;}if (Tree->Parent !=NULL)if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0) // 如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Parent;}for(i=1;i<=Tree->Num;i++){printf(" 请输入 %s 修改的姓名 :如果不需要修改就输入'0'然后按 Enter 键继续\n",Tree->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0) strcpy(Tree->NextNode[i]->Name,name);printf(" 是否要修改性别 :如果需要就输入 '1' 不需要修改就输入 '0' 然后按Enter 键继续 \n");scanf("%d",&flag);if (flag==1){if(Tree->NextNode[i]->Kind=='F'||Tree->NextNode[i]->Kind=='f')Tree->NextNode[i]->Kind='M';else Tree->NextNode[i]->Kind='F';}}printf(" 子女的信息修改成功\n");break;case 'E':if(Tree->Parent!=NULL){if(Tree->NextNode[0]==NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)!=0) {printf(" 至今还没有配偶\n");break;}if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0){printf("\n\n\t请输入%s 修改的姓名:如果不需要修改就输入'0' 然后按Enter键继续\n\t",Tree->Parent->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);}else{printf("\n\n\t请输入%s 修改的姓名:如果不需要修改就输入'0' 然后按Enter 键继续 \n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}else{if(Tree->NextNode[0]==NULL)printf(" 至今还没有配偶\n");else{printf("\n\n\t 请输入 %s 修改的姓名 :如果不需要修改就输入'0' 然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->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 name[20];while(1){system("cls");// 清屏printf(" ★★★★★★★★★★★★★欢迎进入家谱管理系统★★★★★★★★★★★\n\n\n");printf("◆◆菜单◆◆\n\n");printf("输入家谱信息---------------------●1\n");printf("●查找家族成员---------------------2\n");printf("添加家族成员---------------------●3\n");printf("输出家谱信息---------------------●4\n");printf("修改成员信息---------------------●5\n");printf("●退出 -----------------------------6\n");printf("\n\n★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf(" 请选择相应的功能:\n");c=getchar();switch(c){case '1': TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode));//建立新节点printf(" 请输入姓名 :"); scanf("%s",Tree->Name);// 给节点姓名赋值printf(" 请输入性别 (女 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); OutPutMessage(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':if(strcmp(Tree->Name,"0")==0){printf(" 家谱图还未建立请先建立\n");getchar();break;}getchar();break;case '6':printf(" 本程序结束 ,欢迎下次使用。

家谱管理系统

家谱管理系统

家谱管理系统家谱管理系统一、引言家谱是一种记录家族世系和血统关系的文献资料,对于了解家族历史和传统具有重要意义。

然而,传统的家谱管理方式存在数据维护困难、信息交流不便等问题。

为了解决这些问题,设计并开发了家谱管理系统。

二、系统概述1:目标家谱管理系统旨在提供一个集中管理、维护家族世系和血统关系的平台,方便用户进行查询、编辑和分享家谱信息。

2:功能- 登录功能:用户可以通过账号密码登录系统。

- 家族成员管理:用户可以添加、删除和修改家族成员的信息。

- 家谱维护:用户可以创建、编辑和保存家谱信息。

- 家族树展示:用户可以查看并浏览家族世系树。

- 家谱搜索:用户可以根据关键词快速搜索家谱中的成员。

- 信息分享:用户可以将家谱信息分享给他人。

- 数据备份:系统可以对家谱数据进行定期备份。

三、系统设计1:系统结构家谱管理系统采用三层架构,包括表示层、业务逻辑层和数据访问层。

表示层负责与用户的交互,业务逻辑层处理系统的业务逻辑,数据访问层负责与数据库的交互。

2:数据库设计系统采用关系型数据库存储家谱信息,包括家族成员表、家族关系表和用户表。

家族成员表存储每个成员的个人信息,家族关系表记录成员之间的血缘关系,用户表用于存储系统的用户信息。

3:用户界面设计系统的用户界面简洁明了,包括登录界面、家族成员管理界面、家谱维护界面、家族树展示界面和搜索界面。

界面设计遵循用户友好的原则,方便用户理解和操作。

四、系统实现1:技术选型系统采用Java语言进行开发,使用Spring框架进行项目管理和依赖注入,使用MySQL作为数据库,使用、CSS和JavaScript实现前端页面。

2:功能实现- 登录功能:通过编写登录逻辑和账号密码验证模块实现用户登录功能。

- 家族成员管理:设计数据库结构,编写增删改查操作的接口和逻辑。

- 家谱维护:实现家谱信息的编辑和保存功能。

- 家族树展示:使用数据结构和算法实现家族关系的图形展示。

- 家谱搜索:通过数据库查询和关键词匹配实现家谱搜索功能。

数据结构家谱管理系统

数据结构家谱管理系统

数据结构家谱管理系统该系统采用数据结构的概念和原理,以树形结构来描述家族关系。

每一个结点代表一个家族成员,包括姓名、性别、出生日期、死亡日期等基本信息,并且能够记录配偶和子女的信息。

通过构建家族树,用户可以清晰地了解家族人员之间的血缘关系和世代关系。

系统的主要功能包括:1.成员管理:用户可以添加、删除和修改家族成员的信息。

系统提供友好的界面,以便用户能够直观地操作。

用户可以输入成员的基本信息,如姓名、性别、出生日期等,并且可以添加配偶和子女的信息。

2.成员查找:用户可以根据姓名、出生日期等条件,对成员进行查询操作。

系统将根据用户输入的条件,快速找到符合条件的成员,并将其信息展示给用户。

用户可以通过查找功能,方便地找到特定成员的详细信息。

3.家族树展示:通过家族树展示功能,用户可以直观地了解家族的基本结构和成员关系。

系统将家族成员按照世代排列,通过树状图展示。

用户可以通过点击树中的结点,进一步查看该成员的详细信息。

4.信息统计:系统可以根据用户需要,进行一些基本的统计分析。

比如,系统可以统计家族的总人数、男女比例、平均寿命等信息,以便用户了解家族的整体情况。

5. 数据导出:为了方便用户保存和共享家族信息,系统提供数据导出功能。

用户可以将家族信息导出为Excel、CSV等格式的文件,以便在其他应用程序中使用。

总之,数据结构家谱管理系统通过数据结构的概念和原理,提供了一种直观、高效的方式来管理家族的信息。

它可以帮助用户了解家族结构、查找成员、进行统计分析,并方便地将数据导出保存。

希望这个系统能够帮助用户更好地管理和维护家族的信息,传承家族的文化和价值观。

数据结构-家谱管理系统

数据结构-家谱管理系统

数据结构-家谱管理系统数据结构家谱管理系统在当今数字化的时代,信息管理变得越来越重要,而家谱作为家族历史和传承的重要记录,也需要一种有效的管理方式。

一个高效的家谱管理系统能够帮助我们更好地保存、查询和分析家族信息,增强家族成员之间的联系和认同感。

接下来,让我们深入探讨一下家谱管理系统所涉及的数据结构和功能。

首先,我们来了解一下什么是数据结构。

简单来说,数据结构是指数据元素之间的关系和组织方式。

在家谱管理系统中,我们需要选择合适的数据结构来存储和操作家族成员的信息。

一种常见的数据结构选择是树形结构。

家谱本身就具有天然的层次关系,从祖先开始,逐渐分支到子孙后代。

我们可以将每个家族成员看作一个节点,通过父子关系将节点连接起来,形成一棵家族树。

这种树形结构能够清晰地展示家族的分支和传承关系。

为了实现树形结构,我们可以使用链表或者数组来存储节点信息。

链表的优点是插入和删除节点比较方便,适合家族成员信息的动态变化。

而数组则可以更高效地随机访问节点,但在插入和删除操作时可能需要移动大量元素。

在家谱管理系统中,每个家族成员的节点应该包含哪些信息呢?至少要包括姓名、性别、出生日期、婚姻状况等基本信息。

此外,还可以添加照片、个人简介、联系方式等扩展信息,以丰富家族成员的资料。

除了存储家族成员的信息,家谱管理系统还需要提供强大的查询功能。

用户可能想要查找特定姓名的家族成员,或者查找某个时间段出生的成员,甚至是查找具有特定亲属关系的成员。

为了实现这些查询功能,我们可以在数据结构中建立索引,例如按照姓名建立哈希索引,按照出生日期建立排序索引等。

这样可以大大提高查询的效率。

另外,家族关系的计算也是家谱管理系统的一个重要功能。

比如,计算两个家族成员之间的亲属关系远近,判断是否存在共同的祖先等。

这需要我们在树形结构的基础上进行深度优先搜索或者广度优先搜索等算法的应用。

在数据存储方面,我们可以选择将家谱数据存储在本地文件中,如XML 或者 JSON 格式,也可以选择将数据存储在数据库中,如关系型数据库 MySQL 或者非关系型数据库 MongoDB。

家谱管理系统(含源代码)

家谱管理系统(含源代码)

家谱管理系统——C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。

排答疑和辅导。

完整代码:#include <stdio.h>#include <stdlib.h>#include <string.h>int MATEFLAG=0; //是否入赘或嫁入这家的,1表示为是,0表示否typedef struct TreeNode//树节点定义{int Num; //保存此人儿女个数char Name[20]; //保存此人姓名char Kind; //保存此人性别,男M,女Fstruct TreeNode * NextNode[20]; //保存此人的儿女,NextNode[0]里存放配偶的地址struct TreeNode * Parent; //保存此节点的父节点}TreeNode;void CreatTree(TreeNode *Tree);//创建树void OutPutAll(TreeNode *Tree);//输出树TreeNode * SearchTree(TreeNode *Tree,char name[],int length);void MainMenu(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);//主函数void main(){TreeNode *Tree;//产生根节点Tree=(TreeNode *)malloc(sizeof(TreeNode));Tree->Parent =NULL;strcpy(Tree->Name,"0");MainMenu(Tree);//显示主菜单}//添加新的成员void AddNew(TreeNode * Tree){SubMenue2(Tree);//添加新成员界面}//显示添加家庭信息的界面void SubMenue2(TreeNode *Tree){char c;int num;char name[20];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': //添加子女信息printf("请输入那个人的名字:\n");scanf("%s",name);Tree=SearchTree(Tree,name,20);//在家谱里查找这个人if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);break;}if(Tree->Parent==NULL&&Tree->NextNode[0]==NULL||Tree->Parent!=NULL&&Tree->N ame!=Tree->Parent->NextNode[0]->Name){printf("至今还没有配偶请先添加配偶\n",Tree->Name);break;}if(Tree->Parent==NULL&&(Tree->Num>20||Tree->Num<0))Tree->Num=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->NextNode[0]=(TreeNode *)malloc(sizeof(TreeNode));NewNode->NextNode[0]=NULL;NewNode->Num=0;NewNode->Parent=Tree;Tree->NextNode[num+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->NextNode[0]->Name)==0||Tree->NextNode[0]!=NULL){printf("已经有了配偶\n");break;}if(Tree==NULL){printf("该家谱图中没有%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->NextNode[0]=NewNode;break;case 'C':printf("本项服务到此结束\n");break;case '\n':break;default:printf("对不起!你的选择错误\n");break;}if (c=='C'||c=='c')break;printf("请按Enter键继续操作\n");getchar();}}//修改某个人的信息void Change(TreeNode * Tree){char name[20];TreeNode * NewNode;printf("请输入你要修改的人的信息:\n");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);return;}else{SubMenue1(NewNode);}}//输出副菜单void SubMenue1(TreeNode * Tree){char c;int flag,i;char name[20];char Parent[2][20];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){printf("请输入修改的姓名:如果不需要修改就输入'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("是这个家谱图里最顶端的人没有父母信息!\n",name);break;}if (MATEFLAG==1) //判断是不是入赘或加入此间的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以父母信息不在家谱内包括\n");}else{printf("他是入赘此间的所以父母信息不在家谱内包括\n");}break;}if(Tree->Parent->Kind=='F'||Tree->Parent->Kind=='f'){strcpy(Parent[0],"母亲");strcpy(Parent[1],"父亲");}else{strcpy(Parent[0],"父亲");strcpy(Parent[1],"母亲");}printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[0]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[1]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->NextNode[0]->Name,name);printf("父母的信息修改成功\n");break;case 'C':NewNode=Tree->Parent;if(NewNode==NULL) //判断是不是头节点{printf("是这个家谱图里最顶端的人没有兄弟姐妹信息!\n",name);break;}if (MATEFLAG==1) //判断是不是入赘或嫁入这家的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以兄弟姐妹信息不在家谱内包括\n");}else{printf("他是入赘此间的所以兄弟姐妹信息不在家谱内包括\n");}break;}if(NewNode->Num==1){printf("没有兄弟姐妹\n");break;}else{for(i=1;i<=NewNode->Num;i++){if(NewNode->NextNode[i]->Name!=Tree->Name){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",NewNode->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(NewNode->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(NewNode->NextNode[i]->Kind=='G'||NewNode->NextNode[i]->Kind=='g') NewNode->NextNode[i]->Kind='B';else NewNode->NextNode[i]->Kind='G';}}}}printf("兄弟姐妹的信息修改成功\n");break;case 'D':if(Tree->Num==0){printf("至今还没有子女\n");break;}if (Tree->Parent !=NULL)if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0) //如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Parent;}for(i=1;i<=Tree->Num;i++){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Tree->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(Tree->NextNode[i]->Kind=='F'||Tree->NextNode[i]->Kind=='f')Tree->NextNode[i]->Kind='M';else Tree->NextNode[i]->Kind='F';}}printf("子女的信息修改成功\n");break;case 'E':if(Tree->Parent!=NULL){if(Tree->NextNode[0]==NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)!=0){printf("至今还没有配偶\n");break;}if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->Parent->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);}else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}else{if(Tree->NextNode[0]==NULL)printf("至今还没有配偶\n");else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->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();}}//输出主菜单void MainMenu(TreeNode *Tree){char c;//用于接受用户输入的选项char name[20];while(1){system("cls");//清屏printf("★★★★★★★★★★★★★欢迎进入家谱管理系统★★★★★★★★★★★\n\n\n");printf(" ◆◆菜单◆◆ \n\n");printf(" ●输入家谱信息---------------------1\n");printf(" ●查找家族成员---------------------2\n");printf(" ●添加家族成员---------------------3\n");printf(" ●输出家谱信息---------------------4\n");printf(" ●修改成员信息---------------------5\n");printf(" ●退出-----------------------------6\n");printf("\n\n★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf("请选择相应的功能:\n");c=getchar();switch(c){case '1': TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode));//建立新节点printf("请输入姓名:"); scanf("%s",Tree->Name);//给节点姓名赋值printf("请输入性别(女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); OutPutMessage(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':if(strcmp(Tree->Name,"0")==0){printf("家谱图还未建立请先建立\n");getchar();break;}Change(Tree);getchar();break;case '6':printf("本程序结束,欢迎下次使用。

家谱管理系统

家谱管理系统

家谱管理系统在现代社会,随着科技的飞速发展,各种信息管理系统应运而生,为我们的生活和工作带来了极大的便利。

其中,家谱管理系统作为一种专门用于记录和管理家族成员信息、家族历史和传承的工具,正逐渐受到人们的关注和重视。

家谱,是一个家族的生命史,它不仅记录了家族成员的姓名、出生日期、婚姻状况等基本信息,还承载着家族的文化、传统、价值观以及重要的历史事件。

对于许多家庭来说,家谱是一份珍贵的遗产,是连接家族成员之间情感的纽带,也是传承家族精神的重要载体。

然而,传统的纸质家谱存在着诸多不便,如保存困难、信息更新繁琐、查阅不便等。

为了解决这些问题,家谱管理系统应运而生。

家谱管理系统的功能通常十分强大且多样化。

首先,它具备便捷的信息录入功能。

用户可以轻松地输入家族成员的各项详细信息,包括个人基本资料、教育背景、职业经历、成就荣誉等。

而且,系统还支持批量导入和导出数据,大大提高了信息整理的效率。

其次,家谱管理系统拥有强大的查询和检索功能。

无论您是想查找某位特定的家族成员,还是了解某个时期家族的发展情况,只需输入相关的关键词或条件,系统就能迅速为您筛选出所需的信息。

这使得家族成员能够快速了解家族的脉络和历史,增进对家族的认知和归属感。

再者,系统能够实现家族关系的可视化展示。

通过图表、树形结构等形式,清晰地呈现出家族成员之间的亲属关系,让人一目了然。

这种直观的展示方式有助于年轻一代更好地理解家族结构,培养家族意识。

另外,家谱管理系统还具备信息更新功能。

随着时间的推移,家族成员的情况会发生变化,如新增成员、成员的信息变更等。

用户可以随时对系统中的信息进行更新和修改,确保家谱的准确性和时效性。

同时,一些先进的家谱管理系统还提供了数据备份和恢复功能,防止数据丢失。

此外,为了保护家族信息的安全和隐私,系统通常会设置不同级别的用户权限,只有授权用户才能查看和修改特定的信息。

在家谱管理系统的开发过程中,需要充分考虑用户的需求和使用习惯。

家谱管理系统项目简介

家谱管理系统项目简介

引言概述家谱管理系统是一个基于计算机技术的家族谱系追溯与记录工具,它的主要目标是帮助用户轻松地管理家族的谱系信息,并提供便捷的查询和维护功能。

家谱管理系统的应用范围广泛,可以适用于家族组织、家族企业、家族文化传承等方面。

本文将针对家谱管理系统进行详细的介绍和分析,包括系统架构、功能模块、技术实现等方面的内容。

正文内容1. 系统架构1.1 客户端1.1.1 用户界面家谱管理系统的客户端采用友好的图形用户界面,用户可以通过界面操作完成家谱信息的添加、查询、修改等操作。

1.1.2 数据存储客户端需要提供本地数据存储功能,用于存储用户的家谱信息。

可以通过文件存储或数据库存储的方式实现。

1.2 服务器端1.2.1 数据库管理服务器端需要建立一套完善的数据库管理系统,用于存储和管理用户的家族谱系数据,保障数据的安全性和稳定性。

1.2.2 业务逻辑处理服务器端需要实现家谱信息的增删改查等基本业务逻辑处理,包括数据的校验、数据的关联处理等功能。

1.3 网络通信客户端和服务器端之间需要建立稳定可靠的网络通信,确保用户能够正常访问服务器端的数据。

2. 功能模块2.1 家谱信息录入模块家谱管理系统需要提供一个用户友好的家谱信息录入界面,用户可以通过该界面输入家族成员的基本信息,并建立起家族成员之间的关系网。

2.2 家谱查询模块家谱管理系统提供了强大的查询功能,用户可以通过姓名、出生日期、关系等关键字进行快速搜索和查找。

并可根据用户需求展示不同级别的家族成员。

2.3 家族统计模块家谱管理系统可以根据家族成员的属性信息进行统计分析,比如年龄分布、性别比例等,为家族成员提供全面的了解。

2.4 家族事件模块家谱管理系统可以记录家族的重要事件,比如婚姻、出生、逝世等,方便用户进行追溯和回顾。

2.5 家族文化传承模块家谱管理系统可以提供家族文化资料共享功能,让家族成员可以共同学习和传承家族的优秀文化。

3. 技术实现3.1 前端技术家谱管理系统的前端界面部分可以采用HTML、CSS、JavaScript等前端技术进行开发,实现交互式的用户界面,提升用户体验。

数据结构_家谱管理系统

数据结构_家谱管理系统

数据结构_家谱管理系统【数据结构_家谱管理系统】一、引言家谱是记录家族成员关系的重要文献,传统的家谱管理方式已经无法满足现代社会的需求。

为了更好地管理家族信息,提高家族成员之间的联系和交流,我们设计并开发了一款家谱管理系统。

本文将详细介绍该系统的设计和实现。

二、系统概述家谱管理系统是一个基于数据结构的软件应用,旨在帮助用户管理家族成员的信息,包括姓名、性别、出生日期、配偶、子女等。

系统提供了多种功能,包括添加、删除、修改、查询、统计等操作,方便用户对家谱信息进行维护和管理。

三、系统设计1. 数据结构选择在家谱管理系统中,我们选择了树这种数据结构来表示家族关系。

每个节点代表一个家庭成员,节点之间通过指针连接,形成家族的层级结构。

2. 数据模型设计家族成员的信息可以通过一个结构体来表示,包括姓名、性别、出生日期等字段。

每个节点除了包含成员信息外,还包含指向配偶的指针和指向子女的指针。

3. 系统功能设计家谱管理系统提供了以下功能:(1) 添加成员:用户可以输入成员信息,系统根据用户输入创建一个新的节点,并将其插入到适当的位置。

(2) 删除成员:用户可以指定要删除的成员,系统会删除该成员及其所有子孙节点。

(3) 修改成员信息:用户可以选择要修改的成员,然后输入新的信息进行更新。

(4) 查询成员信息:用户可以通过姓名、出生日期等条件查询成员信息。

(5) 统计家族人数:系统可以统计家族的总人数、男性人数、女性人数等信息。

四、系统实现1. 数据结构实现我们使用C语言来实现家谱管理系统。

通过定义一个节点结构体,使用指针来连接各个节点,实现家族关系的表示和管理。

2. 功能实现(1) 添加成员:根据用户输入的信息,创建一个新节点,并将其插入到适当的位置。

插入操作需要遍历树来找到合适的位置。

(2) 删除成员:根据用户指定的成员,删除该节点及其所有子孙节点。

删除操作需要递归地遍历树。

(3) 修改成员信息:根据用户选择的成员,更新其信息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/* 家谱管理系统任务:实现具有下列功能的家谱管理系统功能要求:1). 输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。

2). 实现数据的存盘和读盘。

3). 以图形方式显示家谱。

4). 显示第n 代所有人的信息。

5). 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。

6). 按照出生日期查询成员名单。

7). 输入两人姓名,确定其关系。

8). 某成员添加孩子。

9). 删除某成员(若其还有后代,则一并删除)。

10).修改某成员信息。

11).按出生日期对家谱中所有人排序。

12).打开一家谱时,提示当天生日的健在成员。

要求:建立至少30个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。

界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。

测试数据:要求使用1、全部合法数据;2、局部非法数据。

进行程序测试,以保证程序的稳定。

测试数据及测试结果请在上交的资料中写明;*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#include"map.h"#define MAXN 100#define MAXMEM 100#define Elemtype char==============================//树typedef struct BiTNode{int mark;//标记int level;char name[50];//姓名char birthday[50];//生日char address[MAXN];//住址bool marriage;//婚否(true表示结婚,false表示没结婚)bool live;//建在(true表示活着,false表示过世)bool sex;//性别(true表示男,false表示女)char livemassage[50];//死亡日期(如果其已经死亡)Elemtype data;//struct BiTNode *lc,*rc;}BiTNode,*BiTree;//树的相关操作char nametemp[50];//姓名char birthdaytemp[50];//生日char addresstemp[MAXN];//住址bool marriagetemp;//婚否(true表示结婚,false表示没结婚)bool livetemp;//建在(true表示或者,false表示过世)bool sextemp;char livemassagetemp[MAXN];//死亡日期(如果其已经死亡)char ch;//额外使用int leveltemp;//人的代数int Nth;//显示第n代人时要用char searchdata[50];char searchname[50];int count;//计数int choice;//各种选择int use;BiTree temp;struct BiTNodeList{BiTree data;BiTNodeList *next;};BiTNodeList *List;//-----------void CreatBiTree(BiTree &T,FILE *in)//建立双链二叉树{fscanf(in,"%c",&ch);//printf("%c\n",ch);if(ch == '@'){T = NULL;fscanf(in,"%c",&ch);}else{T = (BiTree)malloc(sizeof(BiTNode));//fscanf(in,"%s%s%s%d%d",nametemp,birthdaytemp,addresstemp,&marriagetemp,&livetemp);fscanf(in,"%s",nametemp);strcpy(T->name,nametemp);fscanf(in,"%s",birthdaytemp);strcpy(T->birthday,birthdaytemp);fscanf(in,"%s",addresstemp);strcpy(T->address,addresstemp);fscanf(in,"%d%d%d%d",&marriagetemp,&livetemp,&leveltemp,&sextemp);T->marriage = marriagetemp;T->live = livetemp;T->level = leveltemp;T->sex = sextemp;//printf("%s %s %s %d %d\n",nametemp,birthdaytemp,addresstemp,marriagetemp,livete mp);if(!livetemp){fscanf(in,"%s",livemassagetemp);//printf("%s\n",livemassagetemp);}if(!T->live)strcpy(T->livemassage,livemassagetemp);fscanf(in,"%c",&ch);CreatBiTree(T->lc,in);CreatBiTree(T->rc,in);}}void PrintInfo(BiTree T){printf("%-10s出生于:%-10s%-10s",T->name,T->birthday,T->address);if(T->marriage)printf("\t已婚");if(!T->marriage)printf("\t未婚");if(T->sex)printf("\t男");if(!T->sex)printf("\t女");if(T->live)printf("\t健在\n");if(!T->live)printf("\t去世于:%s\n",T->livemassage);}void PreOrderTraverse_recursion(BiTree T)//递归先序遍历(检查建树是否正确) {//printf("PreOrderTraverse_recursion\n");if(T){/*printf("%-10s出生于:%-10s%-10s",T->name,T->birthday,T->address);if(T->marriage)printf("\t已婚");if(!T->marriage)printf("\t未婚");if(T->sex)printf("\t男");if(!T->sex)printf("\t女");if(T->live)printf("\t健在\n");if(!T->live)printf("\t去世于:%s\n",T->livemassage);*/PrintInfo(T);PreOrderTraverse_recursion(T->lc);PreOrderTraverse_recursion(T->rc);}}void ShowFamilyTree(BiTree T)//以图形的方式显示家谱{int i,lev;BiTree p;p = T;if(T){lev = T->level;for(i=0; i<lev; i++)printf("\t");printf("%-5s ",p->name);if(p->lc){p = T->lc;printf("★*★%5s%\n",p->name);if(p->rc){p = p->rc;ShowFamilyTree(p);}}elseprintf(" (未婚)\n");}if(T->rc){p = T->rc;ShowFamilyTree(p);}}void ShowNth(BiTree T)//显示第n代所有人的信息{if(T){if(T->level == Nth){PrintInfo(T);//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);count++;}ShowNth(T->lc);ShowNth(T->rc);}}void SearchByName(BiTree T)//按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。

不能查询祖先信息{if(T){if(T->lc){if(T->lc->rc){temp = T->lc->rc;while(temp){if(strcmp(temp->name,searchname) == 0){count++;printf("\n此人的信息为: \n");PrintInfo(temp);//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",temp->name,temp->birthday,temp->address,temp->marriage,temp->live,temp->sex);printf("此人父母的信息为: \n");PrintInfo(T);PrintInfo(T->lc);//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",T->lc->name,T->lc->birthday,T->lc->address,T->lc->m arriage,T->lc->live,T->lc->sex);if(!temp->livemassage)printf("此人还没有妻室\n");else{printf("此人妻子的信息为: \n");PrintInfo(temp->lc);//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",temp->lc->name,temp->lc->birthday,temp->lc->add ress,temp->lc->marriage,temp->lc->live,temp->lc->sex);if(temp->lc->rc){printf("此人孩子的信息为: \n");temp = temp->lc->rc;while(temp){PrintInfo(temp);//printf("%-10s%-10s%-10s%5d%5d%5d\n",temp->name,temp->birthday,temp->address,temp-> marriage,temp->live,temp->sex);temp = temp->rc;}}}return;}elsetemp = temp->rc;}}}SearchByName(T->lc);SearchByName(T->rc);}}void SearchByBirthday(BiTree T)//按照出生日期查询成员名单{if(T){if(strcmp(T->birthday,searchdata) == 0){PrintInfo(T);//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);count++;}SearchByBirthday(T->lc);SearchByBirthday(T->rc);}}void AddChild(BiTree &T)//某成员添加孩子{if(T){if(strcmp(T->name,searchname) == 0){count++;if(!T->lc){printf("该成员还没有结婚,不能添加孩子\n");return;}if(!T->sex){printf("不能为该家谱中的女性添加孩子\n");return;}else{temp = (BiTree)malloc(sizeof(BiTNode));printf("请输入添加孩子的姓名\n");scanf("%s",temp->name);printf("请输入添加孩子的出生年月(格式形如: 2010-1-1)\n");scanf("%s",temp->birthday);printf("请输入添加孩子的家庭住址\n");scanf("%s",temp->address);printf("请输入添加孩子的婚姻状况0/1 (0表示未婚,1表示已婚)\n");scanf("%d",&temp->marriage);printf("请输入添加孩子的在世情况0/1 (0表示去世,1表示在世)\n");scanf("%d",&temp->live);if(!temp->live){printf("请输入添加孩子的去世时间(格式形如: 2010-1-1)\n");scanf("%s",temp->livemassage);}printf("请输入添加孩子的性别0/1 (0表示女,1表示男)\n");scanf("%d",&temp->sex);temp->level = T->level+1;temp->rc = T->lc->rc;temp->lc = NULL;T->lc->rc = temp;printf("孩子添加成功\n");return;}}AddChild(T->lc);AddChild(T->rc);}}void AddWife(BiTree &T)//某成员添加妻子if(T){if(strcmp(T->name,searchname) == 0){count++;if(T->lc){printf("该成员已有妻子,可以通过修改的方式替换该妻子\n");return;}else{temp = (BiTree)malloc(sizeof(BiTNode));printf("请输入添加妻子的姓名\n");scanf("%s",temp->name);printf("请输入添加妻子的出生年月(格式形如: 2010-1-1)\n");scanf("%s",temp->birthday);printf("请输入添加妻子的家庭住址\n");scanf("%s",temp->address);printf("请输入添加妻子的婚姻状况0/1 (0表示未婚,1表示已婚)\n");scanf("%d",&temp->marriage);printf("请输入添加妻子的在世情况(0表示去世,1表示在世)\n");scanf("%d",&temp->live);if(!temp->live){printf("请输入添加妻子的去世时间(格式形如: 2010-1-1)\n");scanf("%s",temp->livemassage);}printf("请输入添加妻子的性别0/1 (0表示女,1表示男)\n");scanf("%d",&temp->sex);temp->level = T->level;temp->lc = NULL;temp->rc = NULL;T->lc = temp;T->marriage = true;printf("妻子添加成功\n");return;}}AddWife(T->lc);AddWife(T->rc);}}void DeleteByName(BiTree &T)//删除某成员(若其还有后代,则一并删除){//printf("PreOrderTraverse_recursion\n");if(T){if(strcmp(T->name,searchname) == 0){count++;T = NULL;return;}//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);DeleteByName(T->lc);DeleteByName(T->rc);}}void FixLevel(BiTree T){if(T){if(strcmp(T->name,searchname) == 0){count = T->level;}FixLevel(T->lc);FixLevel(T->rc);}}void FixRelation(BiTree T)//输入两人姓名,确定其关系{int levo,levt;char levone[50],levtwo[50];printf("请输入第一个人的姓名\n");scanf("%s",searchname);strcpy(levone,searchname);FixLevel(T);levo = count;if(levo == -1){printf("家谱无此人,请从新进入\n");return;}printf("请输入第二个人的姓名\n");scanf("%s",searchname);strcpy(levtwo,searchname);FixLevel(T);levt = count;if(levt == -1){printf("家谱无此人\n");return;}if(levo < levt)printf("%s 比%s 大%d 辈\n",levone,levtwo,levt-levo);else if(levo > levt)printf("%s 比%s 大%d 辈\n",levtwo,levone,levo-levt);else if(levo == levt)printf("%s 和%s 平辈\n",levone,levtwo);}void ShowAmend(){printf("1.修改姓名\n");printf("2.修改出生年月\n");printf("3.修改家庭住址\n");printf("4.修改婚姻状况\n");printf("5.修改在世情况\n");printf("6.修改性别\n");printf("7.返回上一级\n");printf("请输入选项(1-7): ");}void DoAmend(BiTree &T){while(1){system("cls");ShowAmend();scanf("%d",&choice);switch(choice){case 1:printf("请输入修改后的姓名: ");scanf("%s",T->name);break;case 2:printf("请输入修改后的出生年月: ");scanf("%s",T->birthday);break;case 3:printf("请输入修改后的住址: ");scanf("%s",T->address);break;case 4:printf("请输入修改后的婚姻状况: ");scanf("%d",&T->marriage);break;case 5:printf("请输入修改后的在世情况: ");scanf("%d",&T->live);if(!T->live){printf("请输入本人的过世时间: ");scanf("%s",T->livemassage);}break;case 6:printf("请输入修改后的性别(1表示男,0表示女): ");scanf("%d",&T->sex);case 7:return;default:printf("输入非法,请重新输入\n");break;}}}void AmendInfo(BiTree &T)//修改某成员信息。

相关文档
最新文档