(完整word版)家谱管理系统

合集下载

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

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

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

排答疑和辅导。

完整代码:#include<stdio.h>#include<stdlib.h>#include<string.h>intMATEFLAG=0;//是否入赘或嫁入这家的,1表示为是,0表示否typedefstructTreeNode//树节点定义{intNum;//保存此人儿女个数charName[20];//保存此人姓名charKind;//保存此人性别,男M,女FstructTreeNode*NextNode[20];〃保存此人的儿女,NextNode[0]里存放配偶的地址structTreeNode*Parent;//保存此节点的父节点}TreeNode;voidCreatTree(TreeNode*Tree);//创建树voidOutPutAll(TreeNode*升66);//输出树TreeNode*SearchTree(TreeNode*Tree,charname[],intlength); voidMainMenu(TreeNode*Tree);voidSubMenue1(TreeNode*Tree);voidSubMenue2(TreeNode*Tree);voidChange(TreeNode*Tree);voidAddNew(TreeNode*Tree);voidOutPutMessage(TreeNode*Tree,charname[],intlength);//主函数voidmain(){TreeNode*Tree;//产生根节点Tree=(TreeNode*)malloc(sizeof(TreeNode));Tree->Parent=NULL;strcpy(Tree->Name,"0");MainMenu(Tree);//显示主菜单}//添加新的成员voidAddNew(TreeNode*Tree){SubMenue2(Tree);//添加新成员界面}//显示添加家庭信息的界面voidSubMenue2(TreeNode*Tree){charc;intnum;charname[20];TreeNode*NewNode;getchar();while(1){system("cls");printf("请选择你的操作%");printf("A:添加某个人的子女的信息\n");printf("B:添加某个人配偶的信息\n");printf("C:退出\n");printf("请选择相应功能:\n");c=getchar();switch(c){case'A'://添加子女信息printf("请输入那个人的名字:3");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->Name!=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("请输入那个人的名字:3");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键继续操作3");getchar();getchar();}}//修改某个人的信息voidChange(TreeNode*Tree){charname[20];TreeNode*NewNode;printf("请输入你要修改的人的信息:\n");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);return;}else{SubMenue1(NewNode);}}//输出副菜单voidSubMenue1(TreeNode*Tree){charc;intflag,i;charname[20];charParent[2][20];TreeNode*NewNode;getchar();while(1){system("cls");printf("请选择你的操作%");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';elseTree->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';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';elseTree->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键继续操作3");getchar();getchar();}}//输出主菜单voidMainMenu(TreeNode*Tree){charc;//用于接受用户输入的选项charname[20];while(1){5丫5{6巾("03");//清屏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键继续操作3");getchar();break;case'2':if(strcmp(Tree->Name,"0")=0){printf("家谱图还未建立请先建立%");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("家谱图还未建立请先建立㈠");getchar();break;}AddNew(Tree);getchar();break;case'4':if(strcmp(Tr ee->Name,"0")==0){printf("家谱图还未建立请先建立\n");getchar();break;}printf("整个家谱的主要信息如下:\n");OutPutAll(Tree);getchar();break;case'5':if(strcmp(Tree->Name,"0")==0){printf("家谱图还未建立请先建立%");getchar();break;}Change(Tree);getchar();break;case'6':printf("本程序结束,欢迎下次使用。

家谱管理系统1

家谱管理系统1

《软件综合设计》家谱管理系统院系:计算机科学技术学院二系班级:计11 – 2班姓名:刘文秀(15)合作者:姜雪(05) 、岳奉宜(33)指导教师:薛曼玲2013 年 12 月 01 日《软件综合设计》任务书一、题目:家谱管理系统二、设计要求(1)刘文秀(组长)、姜雪和岳奉宜组成课程设计小组。

(2)小组成员分工协作完成。

要求每个成员有自己相对独立的模块,,同时要了解其他组员完成的内容。

(3)查阅相关资料,自学具体课题中涉及到的新知识。

(4)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。

(5)所设计的系统应有菜单、动画和音乐。

(6)按要求写出课程设计报告,并于设计结束后1周内提交。

其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求分析、总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序清单(带中文注释)、参考文献等。

报告一律用A4纸打印,正文的中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。

1级标题中文字体为黑体,西文字体为Time New Roma,采用三号字;段落为居中、段前18磅、段后12磅、行距采用“固定值”18磅,首行缩进:无,段中不分页,与下段同页。

仅一级标题上目录。

三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在400行有效程序行以上,不得抄袭。

四、课程设计工作计划2013年12月2日,指导教师讲课,学生根据题目准备资料,需求分析;2013年12月3日,设计小组进行总体方案设计和任务分工;2013年12月4日~2013年12月10日,每人完成自己承担的程序模块并通过独立编译;2013年12月11日~12日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;2013年12月13日,验收、开始撰写课程设计报告;2013年12月18日前,提交课程设计报告和软件。

数据结构-家谱管理系统

数据结构-家谱管理系统

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(完整word版)家谱树

(完整word版)家谱树

);
printf( "\t\t*
*\n"
);
printf( "\t\t* * * * * * * * * * * * * * * * * * * * * * *\n"
);
}
void CreatePedTree(PedTree Tree) // 创建 Pedigree 树 {
fflush(stdin); // 清除键盘缓冲区 system( "cls" ); /*Tree=(PedTree)malloc(sizeof(PedTNode)); if(!Tree) {
下面是程序代码(用文本过滤一下粘贴到工程中就可用)

#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <conio.h> #define OK 1
#define FALSE 0 #define ERROR -1 typedef int status; typedef struct {
void ShowMenu1(PedTree Tree); // 显示要查找人的信息
//void ShowSelfInfor(PedTree Tree,char Name[],int Length);//
void ShowMenu2(); // 显示添加信息的菜单
int AddNewInfor(PedTree Tree); // 添加新的家谱信息
在树中查找
bool SearchPedTree(PedTree Tree, char Name[],PedTree* DrawTree); // 在树中查找

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

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

精心整理/*家谱管理系统任务:实现具有下列功能的家谱管理系统功能要求:1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以2).3).4).5).。

6).7).8).9).10).11).12).打开一家谱时,提示当天生日的健在成员。

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

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

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

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

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

测试数据及测试结果请在上交的资料中写明;*///树{intmark;//标记intlevel;charname[50];//姓名charbirthday[50];//生日charaddress[MAXN];//住址boolmarriage;//婚否(true表示结婚,false表示没结婚)boollive;//建在(true表示活着,false表示过世)boolsex;//性别(true表示男,false表示女)charlivemassage[50];//死亡日期(如果其已经死亡)Elemtypedata;////charsearchdata[50];charsearchname[50];intcount;//计数intchoice;//各种选择intuse;BiTreetemp;structBiTNodeList{BiTreedata;BiTNodeList*next;};{{}else{T=(BiTree)malloc(sizeof(BiTNode));//fscanf(in,"%s%s%s%d%d",nametemp,birthdaytemp,addresstemp,&mar riagetemp,&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);p);{}if(!T->live)strcpy(T->livemassage,livemassagetemp); fscanf(in,"%c",&ch);CreatBiTree(T->lc,in);CreatBiTree(T->rc,in);}}voidPrintInfo(BiTreeT){printf("%-10s出生于}voidPreOrderTraverse_recursion(BiTreeT)//递归先序遍历(检查建树是否正确){//printf("PreOrderTraverse_recursion\n");if(T){/*printf("%-10s出生于:%-10s%-10s",T->name,T->birthday,T->address);if(T->marriage)PreOrderTraverse_recursion(T->rc);}}voidShowFamilyTree(BiTreeT)//以图形的方式显示家谱{inti,lev;BiTreep;p=T;if(T){{{}}elseprintf("(未婚)\n"); }if(T->rc){p=T->rc;ShowFamilyTree(p);}}{{{}}}voidSearchByName(BiTreeT)//按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。

家谱管理系统.doc

家谱管理系统.doc

家谱管理系统。

洛阳科技学院课程设计报告数据结构课程设计课程名称_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _家谱管理系统设计主题_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _计算机科学与技术专业_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ b 150405班级_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ b 15080822学校编号_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _宋世龙的姓氏是_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x XXX,2006年12月30日。

完成日期_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _家谱管理系统设计的内容和要求;[问题描述]以下内容:实现了具有以下功能的家谱树管理系统1)。

(完整word版)数据结构家谱图代码

(完整word版)数据结构家谱图代码

//main.cpp# include <stdio.h># include <string.h># include <stdlib.h># include <conio.h># include <windows.h># include "Head.h"void main(){HANDLE consolehwnd;//字体颜色的改变consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);//字体颜色的改变int chose,i;BinTree T;T=NULL;while(1){SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_RED);//字体颜色的改变printf("***************家谱信息功能表*************\n");SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_BLUE|F OREGROUND_GREEN);printf("1:新建一个根节点\n");printf("2:以添加成员节点构造家谱图\n");printf("3:家谱树的层次显示\n");printf("4家谱树保存到文件!\n");printf("5:家谱树读入文件!\n");printf(":家谱信息的删除\n");printf("6:结束程序\n");SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_RED);//字体颜色的改变printf("************按以上功能表进行操作*************\n");SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_BLUE+F OREGROUND_GREEN+FOREGROUND_RED);for(i=1;i<=100;){printf("请输入你在功能表上的选项:") ;scanf("%d",&chose);if(1<=chose<=11)break;elseprintf("你输入的选项不正确,请重新输入!\n");}switch(chose){case 1:system("cls"); //在控制台程序使用清屏函数InPut(T); //录入个人信息printf("按任意键返回"); //等待程序system("pause");system("cls");break;case 2:system("cls");Addchild(T); //比较兄弟岁数后再添加system("pause");system("cls");break;case 3:system("cls");LevelOutput(T);system("pause");system("cls");break;case 4:system("cls");KCreatTree(T); //将家谱信息保存到文件中system("pause");system("cls");break;case 5:system("cls");LCreateTree(T); //从文件中读出家谱成员的信息system("pause");system("cls");break;case 6:system("cls");exit(0);system("pause");system("cls");break;default:fflush(stdin);printf("你输入的选项不正确!\n");printf("请从新输入菜单的选项!\n");system("pause");system("cls");}}}//Head.h# include <stdio.h># include <string.h># include <stdlib.h># include <conio.h># include <windows.h># define QUEUESIZE 100typedef struct Data //出生日期结构体{int day;int month;int year;}dataly;typedef struct BiTNode //个人资料信息{char live[15]; //建在(T表示活着,F表示过世)char name[20]; //姓名char sex[15]; //性别char marriage[15]; //是否已婚(Y为已婚,N为未婚)char birthadd[20]; //出生地char address[15]; //家庭地址char profession[20]; //职业char fathername[20]; //父亲姓名int generation; //辈分int message; //接点孩子的个数int hight; //升高int age; //年龄dataly birthday; //出生日期dataly dieday; //死亡日期(如果其已经死亡)struct BiTNode *brother; //兄弟struct BiTNode *child; //孩子struct BiTNode *parent; //父母}BiTNode,*BinTree;typedef BinTree QElemType;/*typedef struct{int front;int rear;QElemType elem[QUEUESIZE];}SqQueue;*/typedef struct QNode{QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front,rear;}LinkQueue;int JudgeTime(BinTree);int Comepare(BinTree);void InPut(BinTree &T);BinTree LevelFind(BinTree &T,BinTree a);void CreatfTree(BinTree &T);void Addchild(BinTree &T);void OutPut(BinTree T);void LevelOutput(BinTree T);void PreOrderD(BinTree T);void KCreatTree(BinTree &s);void KeepTTFile(BinTree T,FILE *fp);void PrinfTree(BinTree p,FILE *fp);void LAddchild(BinTree &T,LinkQueue &S,FILE *fp);void LCreateTree(BinTree &T);//function.cpp# include "Head.h"//********************************************************* //********************************************************* void InitQueue(LinkQueue &Q){if(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)))){exit(0);}Q.front->next=NULL;return;}int QueueEmpty(LinkQueue Q){return(Q.front->next==NULL);}int GetHead(LinkQueue Q,QElemType &e){if(Q.front==Q.rear){return 0;}e=Q.front->next->data;return 1;}void EnQueue(LinkQueue &Q,QElemType e){QueuePtr p;if(!(p=(QueuePtr)malloc(sizeof(QNode)))) {exit(0);}p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return;}int DeQueue(LinkQueue &Q,QElemType &e){QueuePtr p;if(Q.front==Q.rear)return 0;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return 1;}void QueueTraverse(LinkQueue Q){QueuePtr p;p=Q.front->next;while(p){printf("%d",p->data);p=p->next;}printf("\n");return;}//**************************************************************************** //**************************************************************************** int JudgeTime(BinTree p) //判断输入的出生日期是否正确{if(p->birthday.year>2013||p->birthday.year<=0){printf("你输入的年份错误,请重新输入!\n");return 0;}if(12<p->birthday.month||p->birthday.month<1){printf("你输入的年份错误,请重新输入!\n");return 0;}if(p->birthday.month==1||p->birthday.month==3||p->birthday.month==5||p->bi rthday.month==7||p->birthday.month==8||p->birthday.month==10||p->birthday.month==12) {if(31<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误,请重新输入!\n");return 0;}}if(p->birthday.month=='4'||p->birthday.month=='6'||p->birthday.month=='11' ){if(30<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误,请重新输入!\n");return 0;}}if(p->birthday.year%400==0||p->birthday.year%4==0&&p->birthday.year%100!=0 ){if(p->birthday.month==2){if(29<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误!\n");return 0;}}}else{if(p->birthday.month==2){if(28<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误!\n");return 0;}}}return 1;}//*************************************************************************** //*************************************************************************** int Comepare(BinTree q) //判断出生日期和死亡日期是否错误{if(q->dieday.year<q->birthday.year){printf("你输入的死亡年份日期错误,请重新输入!\n");return 0;}if(q->dieday.year==q->birthday.year){if(q->dieday.month<q->birthday.month){printf("你输入的月份死亡日期错误,请重新输入!\n");return 0;}}if(q->dieday.year==q->birthday.year){if(q->dieday.month==q->birthday.month){if(q->dieday.day<q->birthday.day){printf("你输入的天数死亡日期错误,请重新输入!\n");return 0;}}}return 1;}//**************************************************************************** //**************************************************************************** void InPut(BinTree &T){int i;T=(BinTree)malloc(sizeof(BiTNode));T->brother=NULL;T->child=NULL;T->parent=NULL;printf("*******请输入你入录人信息********\n");printf("请输入姓名:\n");scanf("%s",T->name);for(i=0;i<=100;i++){printf("请输入性别:(男(m)或女(f))\n");scanf("%s",T->sex);if(strcmp(T->sex,"m")||strcmp(T->sex,"f")||strcmp(T->sex,"M")||strcmp(T->s ex,"F"))break;}T->generation=1;T->message=0;printf("请输入身高:\n");scanf("%d",&T->hight);printf("请输入家庭住址:\n");scanf("%s",T->address);printf("请输入出生地:\n");scanf("%s",T->birthadd);printf("请输入职业:\n");scanf("%s",T->profession);strcpy(T->fathername,"0");for(i=1;i<=3;i++){printf("请输入出生日期\n");printf("请输入年:\n"); //判断出生日期是否正确,如果不正确,请重新输入scanf("%d",&(T->birthday.year));printf("请输入月:\n");scanf("%d",&(T->birthday.month));printf("请输入日:\n");scanf("%d",&(T->birthday.day));int t=JudgeTime(T);if(t)break;}for(i=0;i<=100;i++){printf("请输入此人是否健在:(健在(l或L),过逝(d或D))\n");scanf("%s",T->live);if(strcmp(T->live,"l")==0||strcmp(T->live,"d")==0||strcmp(T->live,"L")==0| |strcmp(T->live,"D")==0)break;}if(strcmp(T->live,"d")==0||strcmp(T->live,"D")==0){for(i=1;i<=3;i++){printf("请输入死亡日期\n");printf("请输入年:\n");scanf("%d",&T->dieday.year);printf("请输入月:\n");scanf("%d",&T->dieday.month);printf("请输入日:\n");scanf("%d",&(T->dieday.day));if(Comepare(T))break;}}if(strcmp(T->live,"d")==0||strcmp(T->live,"D")==0){T->age=(T->dieday.year-T->birthday.year);}else{T->age=(2012-T->birthday.year);}printf("你已成功入录此人的信息\n");}//**************************************************************************** ****//**************************************************************************** ****BinTree LevelFind(BinTree &T,char Name[15]){BinTree e;if(T==NULL){printf("没有找到你输入的信息\n");return NULL;}else{LinkQueue S;InitQueue(S); //初始化队列EnQueue(S,T);while( !QueueEmpty(S)){DeQueue(S,e);if(strcmp(e->name,Name)==0){return e;}else{if(e->brother!=NULL)EnQueue(S,e->brother);if(e->child!=NULL)EnQueue(S,e->child);}}printf("没有找到你输入的信息\n");return NULL;}}//***********************************************************************//*********************************************************************** void CreatfTree(BinTree &T) //按层次遍历生成此家谱{BinTree p;LinkQueue S;InitQueue(S); //构造一个空队列T=(BinTree)malloc(sizeof(BiTNode));printf("请输入家谱成员的信息!\n");InPut(T);EnQueue(S,T); //T进入队列中while(!QueueEmpty(S)){DeQueue(S,p);if(p->message==0){continue;}else{int i=0,x=1;i=p->message;BinTree p1,p2;p2=p1=(BinTree)malloc(sizeof(BiTNode));printf("请输入%s第%d个孩子的信息:\n",p->name,x);InPut(p1);p1->parent=p;i--; //结点的孩子数EnQueue(S,p1);while(i!=0){x=x+1;BinTree p3;p3=(BinTree)malloc(sizeof(BiTNode));printf("请输入%s第%d个孩子的信息:\n",p->name,x);InPut(p3);p1->brother=p3;p3->parent=p;p1=p3; //将p3的地址保存起来,以便下次连接它的兄弟EnQueue(S,p3);i--;}p->child=p2;}}}//*************************************************************************** //*************************************************************************** void OutPut(BinTree T){printf("*******输出个人信息********\n");printf("\n姓名:%s",T->name);printf("\n性别:%s",T->sex);printf("\n年龄:");printf("%d",T->age);printf("\n辈分:");printf("%d",T->generation);printf("\n身高:");printf("%d",T->hight);printf("\n孩子的个数:");printf("%d",T->message);printf("\n家庭住址:");printf("%s",T->address);printf("\n出生地:");printf("%s",T->birthadd);printf("\n职业:");printf("%s",T->profession);printf("\n父亲姓名:");printf("%s",T->fathername);if (strcmp(T->live,"d")==0||strcmp(T->live,"D")==0 ){printf("\n死亡日期:");printf("%d ",T->dieday.year);printf("%d ",T->dieday.month);printf("%d \n",T->dieday.day);}printf("\n出生日期:%d %d %d\n",T->birthday.year,T->birthday.month,T->birthday.day);}//*************************************************************************** //*************************************************************************** void LevelOutput(BinTree T){BinTree e;e=(BinTree)malloc(sizeof(BiTNode));e=T;if(T==NULL){printf("此家谱图为空,没有信息可以输出!\n");return;}else{LinkQueue S;InitQueue(S); //初始化队列EnQueue(S,e);while( !QueueEmpty(S)){DeQueue(S,e);OutPut(e);if(e->brother!=NULL)EnQueue(S,e->brother);if(e->child!=NULL)EnQueue(S,e->child);}return;}}//************************************************************************** //************************************************************************** void PreOrderD(BinTree T){if(T){T->generation++;PreOrderD(T->brother);PreOrderD(T->child);}}//*************************************************************************** //*************************************************************************** void Addchild(BinTree &T) //比较兄弟岁数后再添加{char Name[15];BinTree Tree,p,t,t1;int c,i,j=1;if(T==NULL){T=(BinTree)malloc(sizeof(BiTNode));printf("家谱不存在,则新建家谱树\n");printf("请输入整个家谱图的信息:\n");CreatfTree(T);//调用创建家谱图}else{while(j){printf("请输入你的选项(1~2):\n");printf("1:添加新成员作为整个家谱的祖先\n");printf("2:添加新成员作为某一成员的孩子\n");for(i=0;i<=3;i++){printf("选项为:");scanf("%d",&c);if(c==1||c==2){break;}elseprintf("你输入的选项有错,请重新输入!\n");}switch(c){case 1:Tree=(BinTree)malloc(sizeof(BiTNode));InPut(Tree);//输入增加节点的信息Tree->child=T;Tree->message++;T->parent=Tree;strcpy(T->fathername,Tree->name) ;PreOrderD(T);//递归函数将整个家族的辈分增加T=Tree;//将指针返回j=0;break;case 2:printf("请输入所添加成员的父亲姓名:\n你有3次机会\n");i=1;while((i++)!=4){scanf("%s",Name);p=LevelFind(T,Name);//将要插入的结点的父亲的指针找出来if(p==NULL){printf("父亲姓名输入错误\n你还有%d次机会\n请从新输入:\n",i-1);if (i==4) {return;}continue;}else{break;}}printf("请输入所添加成员的信息\n");Tree=(BinTree)malloc(sizeof(BiTNode));InPut(Tree); //输入增加节点的信息strcpy(Tree->fathername,p->name);Tree->generation=p->generation+1; //辈分加1if(p->child!=NULL){t1=p;t=p->child;while(t){if(Tree->age<=t->age){if(t->brother==NULL){t->brother=Tree;Tree->parent=p;p->message++; //辈分加1j=0;break;}if (Tree->age<=t->age&&Tree->age>=t->brother->age){Tree->brother=t->brother;t->brother=Tree;Tree->parent=p;p->message++;j=0;break;}t1=t;t=t->brother;continue;}else{Tree->brother=t;t1->child=Tree;Tree->parent=p;p->message++;j=0;break;}}}else{p->child=Tree;Tree->parent=p;p->message++;j=0;break;}break;default:printf("\n\n\t对不起,你的选择不在服务范围之内!\n");printf("\n请再次选择你所要的操作:\n");continue;}}}}//**************************************************************************** ****************//**************************************************************************** ****************void KeepTTFile(BinTree T,FILE *fp) //将树的信息保存到文件中{fprintf(fp,"%s ",T->name);fprintf(fp,"%s ",T->sex);fprintf(fp,"%d ",T->age);fprintf(fp,"%d ",T->generation);fprintf(fp,"%d ",T->hight);fprintf(fp,"%d ",T->message);fprintf(fp,"%s ",T->address);fprintf(fp,"%s ",T->birthadd);fprintf(fp,"%s ",T->profession);fprintf(fp,"%s ",T->fathername);fprintf(fp,"%s ",T->live);if (strcmp(T->live,"d")==0||strcmp(T->live,"D")==0){fprintf(fp,"%d ",T->dieday.year);fprintf(fp,"%d ",T->dieday.month);fprintf(fp,"%d ",T->dieday.day);}fprintf(fp," %d %d %d\n",T->birthday.year,T->birthday.month,T->birthday.da y);}//**************************************************************************** ******************//**************************************************************************** ******************void KCreatTree(BinTree &s) //层次遍历将家谱树保存在文件中{LinkQueue S;BinTree a,p;if (s==NULL){printf("家谱图的信息为空,不用保存到文件中!\n请重新构建家谱图·····\n");return;}FILE *fp;fp=fopen("familytree","wb+");if(fp==NULL){printf("Can not open file\n");exit (0);}InitQueue(S);EnQueue(S,s);while (!QueueEmpty(S)){DeQueue(S,a);KeepTTFile(a,fp);if (a->child!=NULL){EnQueue(S,a->child);p=a->child;while (p->brother!=NULL){EnQueue(S,p->brother); //将一个父亲的所以兄弟都压到队列中,层次保存文件p=p->brother;}}}fclose(fp);printf("家谱信息已成功保存到文件中!\n");return;}//**************************************************************************** ******************//**************************************************************************** ******************void PrinfTree(BinTree T,FILE *fp){fscanf(fp,"%s ",T->name);fflush(stdin);fscanf(fp,"%s ",T->sex);fflush(stdin);fscanf(fp,"%d ",&T->age);fflush(stdin);fscanf(fp,"%d ",&T->generation);fflush(stdin);fscanf(fp,"%d ",&T->hight);fflush(stdin);fscanf(fp,"%d ",&T->message);fflush(stdin);fscanf(fp,"%s ",T->address);fflush(stdin);fscanf(fp,"%s ",T->birthadd);fflush(stdin);fscanf(fp,"%s ",T->profession);fflush(stdin);fscanf(fp,"%s ",T->fathername);fflush(stdin);fscanf(fp,"%s ",T->live);if (strcmp(T->live,"D")==0||strcmp(T->live,"d")==0){fscanf(fp,"%d ",&T->dieday.year);fflush(stdin);fscanf(fp,"%d ",&T->dieday.month);fflush(stdin);fscanf(fp,"%d ",&T->dieday.day);fflush(stdin);}fscanf(fp,"%d %d %d\n",&T->birthday.year,&T->birthday.month,&T->birthday.d ay);fflush(stdin);}//**************************************************************************** *************************//**************************************************************************** **************************void LAddchild(BinTree &T,LinkQueue &S,FILE *fp) //按层次遍历将孩子存储在文件{int i=0;i=T->message;BinTree p1,p2;p2=p1=(BinTree)malloc(sizeof(BiTNode));p1->child=NULL;p1->brother=NULL;p1->parent=T;T->child=p2;i--; //结点的孩子数PrinfTree(p1,fp); //将T结点的信息读入到文件中EnQueue(S,p1);while(i!=0){BinTree p3;p3=(BinTree)malloc(sizeof(BiTNode));p3->parent=T;p3->child=NULL;p3->brother=NULL;p1->brother=p3;p1=p3; //将p3的地址保存起来,以便下次连接它的兄弟PrinfTree(p3,fp);EnQueue(S,p3);i--;}}//**************************************************************************** ***********//**************************************************************************** ***********void LCreateTree(BinTree &T) //从文件中读入成员信息按层次遍历生成家谱{BinTree p;T=(BinTree)malloc(sizeof(BiTNode));T->brother=NULL; //将T的孩子和兄弟初始化为空;T->child=NULL;T->parent=NULL;LinkQueue S;InitQueue(S); //构造一个空队列printf("从文件中读入家谱的成员\n");FILE *fp;fp=fopen("familytree","rb+");if(fp==NULL){printf("Can not open file\n");exit (0);}PrinfTree(T,fp); //将T结点的信息读入到文件中EnQueue(S,T); //T进入队列中while(!QueueEmpty(S)){DeQueue(S,p);if(p->message==0){continue;}else{LAddchild(p,S,fp);}}fclose(fp);printf("家谱信息已从文件中成功读出!\n");return;}。

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

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

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

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

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

3). 显示家谱。

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

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

6). 修改某成员信息。

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

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

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

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

测试数据及测试结果请在上交的资料中写明。

指导教师:_______________年月日课程设计评语成绩:指导教师:_______________年月日一、算法思想本程序是一个管理家谱的系统,通过这个系统可以对家族成员进行创建、显示、查找、修改、以及保存家谱和读取家谱功能。

该系统分为以下几个模块,分别是:创建家谱,显示家谱、按姓名和生日查找家庭成员、修改家谱、存盘、读盘以及退出系统。

本程序用到的存储形式为多叉树,因为家谱中每个人既有父母又有孩子,而且孩子的个数并不确定,所以用多叉树来存储最为合适。

用多叉树来存储,就用用到多叉树的递归创建及递归遍历。

因为是多叉树,所以遍历时用广度优先搜索合适。

本函数最主要的思想就是递归调用,每个子函数中都会用到递归。

定义结构体时给定指针数组的最大容量,来规定家谱中最多可以存多少人。

定义一个家族树的指针变量用来当每个子函数的参数,从而将其返回到主函数中。

以下时算法思想流程图:二、模块划分1.int main():主函数2.void CreatTree(TreeNode *Tree):创建家族树3.void OutPutAll(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 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 TreeNode{int ChildNum; //记录这个人拥有几个儿女char Name[20];//记录这个人的姓名char birthday[20];//生日int marriage;//婚否(1表示结婚,0表示没结婚)int death;//生死(1表示活着,0表示过世)char Kind;//标示节点的种类有女G男Bchar address[100];//住址char livemassage[50];//死亡日期(如果其已经死亡)struct TreeNode *NextNode[20]; //记录这个人的儿女struct TreeNode *Parent; //记录这个节点的父节点}TreeNode,*tree;四、测试第一组数据为:爷爷,奶奶,爸爸,妈妈,我,二叔,二婶,姐姐,三叔,三婶,弟弟一共三代11个人。

其中爷爷是根节点,奶奶为爷爷的配偶,同时也是爷爷的第一个后继节点。

爸爸,二叔,三叔为爷爷的子女。

爸爸的配偶是妈妈,爸爸的子女是我。

二叔的配偶是二婶,子女是姐姐。

三叔的的配偶是三婶,三叔的的子女是弟弟。

进入程序之后,首先进行创建家谱,然后进行存盘,之后进行修改和查询等步骤。

退出程序在进入程序时,进行读盘。

之后在进行其他操作,程序完成之后退出即可。

图1 家族树第一组数据测试截图为:图2 显示家谱爷爷 爸爸 二叔 奶奶三叔 妈妈 二婶 三婶我 姐姐弟弟图3 按照姓名查找家族成员图4 存盘第二组数据为:图4 王家家族树第二组数据测试截屏为:图5 修改家族成员的信息王老王大 刘老王二 李大张二王小一王小二图6 修改某个人的具体信息图7 按照生日查找某人图8 读盘五、源程序#include <stdio.h>#include <stdlib.h>#include <string.h>#ifdef WIN32#define CLEAR system("cls")#define TipForSaveFilePosition printf("\t\t输入文件名及保存位置(eg: D:\\\\example.txt):")#define TipForReadFilePosition printf("\t\t文件名及其路径(eg: D:\\\\example.txt): ")#else#define CLEAR system("clear")#define TipForSaveFilePosition printf("\t\t输入文件名及保存位置(eg: /home/xiong/example.txt): ")#define TipForReadFilePosition printf("\t\t文件名及其路径(eg: /home/xiong/example.txt): ")#endif#define maxFileNameLen 50 //保存的文件名的最大长度int FLAG=0;int a=1;typedef struct TreeNode{int ChildNum; //记录这个人拥有几个儿女char Name[20];//记录这个人的姓名char birthday[20];//生日int marriage;//婚否(1表示结婚,0表示没结婚)int death;//生死(1表示活着,0表示过世)char Kind;//标示节点的种类有女G男Bchar address[100];//住址char livemassage[50];//死亡日期(如果其已经死亡)struct TreeNode *NextNode[20]; //记录这个人的儿女struct TreeNode *Parent; //记录这个节点的父节点}TreeNode,*tree;void CreatTree(TreeNode *Tree);void OutPutAll(TreeNode *Tree);void Menue(TreeNode *Tree);void SubMenue1(TreeNode * Tree);void SubMenue2(TreeNode *Tree);void Change(TreeNode * Tree);void AddNew(TreeNode * Tree);TreeNode * SearchTree(TreeNode *Tree,char name[],int length);TreeNode * SearchTree1(TreeNode *Tree,char birth[],int length) ;void OutPutMessage(TreeNode * Tree,char name[],int length);void OutPutMessage1(TreeNode * Tree,char birth[],int length);void SaveFamily(TreeNode *root);void ReadFamily(TreeNode **root);int main()//主函数{TreeNode *Tree;//TreeNode **Tree1;//Tree1=&(*Tree);Tree=(TreeNode *)malloc(sizeof(TreeNode));Tree->Parent =NULL;strcpy(Tree->Name,"0");Menue(Tree);return 0;}void Menue(TreeNode *Tree)//输出主菜单{/*TreeNode **Tree1;Tree1=&Tree;*/char c;char name[20];char birth[20];while(1){system("cls");printf("\t");printf("\n\n\t\t**********欢迎使用家族管理系统**********\n\n");printf("\n\t\t A:输入家谱信息建立树");printf("\n\t\t B:输出整个家谱信息");printf("\n\t\t C:按出生日期查找某人"); printf("\n\t\t D:按姓名查找某人"); printf("\n\t\t E:修改某个人的信息"); printf("\n\t\t F:存盘");printf("\n\t\t G:读盘");printf("\n\t\t H:退出整个程序\n\t"); c=getchar();switch(c){case 'A':TreeNode * NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode));printf("\n\t请输入姓名:");scanf("%s",Tree->Name);printf("\n\t请输入性别女G男B:");getchar();scanf("%c",&(Tree->Kind));Tree->Parent=NewNode;Tree->Parent=NULL;//CreatTree(Tree); //printf("\n\t--------------家谱图已经建立成功---------------\n\n");printf("\n\n\t--------------请按Enter键继续操作--------------");getchar();break;case 'B':if(strcmp(Tree->Name,"0")==0){printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar();break;}printf("\n\n\t整个家谱的主要信息如下:");OutPutAll(Tree);getchar();break;case 'C':if(strcmp(Tree->birthday,"0")==0){printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar();break;}scanf("%s",birth);OutPutMessage1(SearchTree1(Tree,birth,20),birth,20);printf("\n\n\t-----*----*----*----*----*----*----*----*----*----*----\n\t");getchar();break;case 'D':if(strcmp(Tree->Name,"0")==0){printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar();break;}printf("\n\t请输入你要查找的人的姓名:\n\t");scanf("%s",name);OutPutMessage(SearchTree(Tree,name,20),name,20);printf("\n\n\t-----*----*----*----*----*----*----*----*----*----*----\n\t");getchar();break;case 'E':if(strcmp(Tree->Name,"0")==0){printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar();break;}Change(Tree);getchar();break;case 'F':if(strcmp(Tree->Name,"0")==0){printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar();break;}SaveFamily(Tree);getchar();break;case 'G':/*if(strcmp(Tree->Name,"0")==0){printf("\n\t家谱图的多叉树尚未建立请先建立树\n");getchar();}*/ReadFamily(&Tree);getchar();break;case 'H':printf("\n\n\t-----------------本次服务到此结束------------------");printf("\n\t------------------欢迎下次使用---------------------");printf("\n\t----------------------谢谢-------------------------\n\n");break;case '\n':break;default:printf("\n\n\t--------对不起!你的选择不在服务范围之内!-----------");printf("\n\t-----------请您再次选择所需的服务项!---------------");printf("\n\t------------------谢谢------------------------\n\t");getchar();break;}if (c=='H'||c=='f')break;getchar();}}void CreatTree(TreeNode *Node) //创建树{int i;TreeNode *NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode));Node->NextNode[0]=NewNode;Node->NextNode[0]=NULL;printf("\n\t请输入出生日期:");scanf("%s",Node->birthday);printf("\n\t请输入家庭住址:");getchar();scanf("%s",Node->address);printf("\n\t请输入是否建在(1-是或0-否):");scanf("%d",&(Node->death));if(Node->death==0){printf("\n\t请输入去世日期:");scanf("%s",Node->livemassage);}else if(Node->death=='1')printf("\n\t仍然建在");scanf("%s",NewNode->Name);if(strcmp(NewNode->Name,"0")!=0){printf("\t请输入配偶的出生日期:");scanf("%s",NewNode->birthday);printf("\n\t请输入家庭住址:");getchar();scanf("%s",NewNode->address);printf("\n\t请输入是否建在(1-是或0-否):");scanf("%d",&(NewNode->death));if(NewNode->death==0){printf("\n\t请输入去世日期:");scanf("%s",NewNode->livemassage);}else if(NewNode->death=='1')printf("\n\t仍然建在");}printf("\n\t请输入%s的子女的数目(当子女输入0时便停止输入该成员有关信息):",Node->Name);scanf("%d",&(Node->ChildNum));if((Node->ChildNum)==0&&strcmp(NewNode->Name,"0")==0)return ;if(Node->Kind=='G'||Node->Kind=='g')NewNode->Kind='B';elseNewNode->Kind='G';NewNode->ChildNum=0;NewNode->NextNode[0]=NULL;Node->NextNode[0]=NewNode;Node->NextNode[0]->Parent=Node;//孩子的父母for(i=1;i<=Node->ChildNum;i++){NewNode=(TreeNode *)malloc(sizeof(TreeNode));a++;printf("\n\t请输入%s的第%d子女的名字:",Node->Name,i);scanf("%s",NewNode->Name);printf("\n\t请输入%s的第%d子女的性别女G男B:",Node->Name,i);getchar();scanf("%c",&NewNode->Kind);NewNode->ChildNum=-1;NewNode->Parent=Node;Node->NextNode[i]=NewNode;CreatTree(Node->NextNode[i]); //从子女的数目开始}}void OutPutAll(TreeNode *Tree)int i, flag=0;printf("\n\t---****---***---***---***---***---***---***---***---***---");printf("\n\t姓名:%s 出生日期:%s 家庭住址:%s 性别: %c",Tree->Name,Tree->birthday,Tree->address,Tree->Kind);if (Tree->Kind=='G'||Tree->Kind=='g'){flag=1;printf("女");}elseprintf("男");printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) printf("1");else if(Tree->death==0) printf("0");if (!(Tree->NextNode[0])){printf("\n\t至今没有配偶和子女\n");return;}if(flag==1)printf("\n\t丈夫姓名:%s",Tree->NextNode[0]->Name);elseprintf("\n\t妻子姓名:%s",Tree->NextNode[0]->Name);printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) printf("1");else if(Tree->death==0) printf("0");for(i=1;i<=Tree->ChildNum;i++){printf("\n\t第%d个子女的姓名:%s 出生日期:%s 家庭住址:%s 性别%c",i,Tree->NextNode[i]->Name,Tree->NextNode[i]->birthday,Tree->NextNode[i]->address,Tre e->NextNode[i]->Kind);if (Tree->NextNode[i]->Kind=='G'||Tree->NextNode[i]->Kind=='g')printf("女");elseprintf("男");printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) printf("1");else if(Tree->death==0) printf("0");}printf("\n\t");for(i=1;i<=Tree->ChildNum;i++){OutPutAll(Tree->NextNode[i]);}TreeNode * SearchTree(TreeNode *Tree,char name[],int length){int i;TreeNode *NewNode;if(strcmp(Tree->Name,name)==0){if(length==0)FLAG=1;elseFLAG=0;return Tree;}if(Tree->NextNode[0]==NULL)return NULL;for(i=0;i<=Tree->ChildNum;i++){if (i==0)NewNode=SearchTree(Tree->NextNode[i],name,0);elseNewNode=SearchTree(Tree->NextNode[i],name,20);if (NewNode!=NULL)return NewNode;}return NULL;}void OutPutMessage(TreeNode * Tree,char name[],int length){int flag=0,i;TreeNode *NewNode;printf("\n\n\t-----*----*----*----*----*----*----*----*----*----*----");if(Tree==NULL){printf("\n\n\t****该家谱图中没有%s这个人的信息请确认是否输入错误*****\n",name);return;}printf("\n\n\t您所要找的人已经找到信息如下所示:");printf("\n\n\t姓名:%s出生日期:%s 家庭住址:%s 性别:%c",name,Tree->birthday,Tree->address,Tree->Kind);if (Tree->Kind=='G'||Tree->Kind=='g'){flag=1; //标记他(她)的性别}elseprintf("男");printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) printf("1");else if(Tree->death==0) printf("0");NewNode=Tree->Parent;if (FLAG==1){if(flag==1){printf("\n\n\t她是嫁入此家族的所以亲生父母信息不在家谱内包括");printf("\n\t丈夫姓名:%s",NewNode->Name);}else{printf("\n\n\t他是入赘此家族的所以亲生父母信息不在家谱内包括");printf("\n\t妻子姓名:%s",NewNode->Name);}if ((NewNode->ChildNum)>0) //判断他(她)是否有孩子{printf("\n\t的孩子的信息如下:"); //输出他(她)的孩子的信息for(i=1;i<=NewNode->ChildNum;i++){printf("\n\t姓名:%s 性别:",NewNode->NextNode[i]->Name);if (NewNode->NextNode[i]->Kind=='G'||NewNode->Kind=='g')printf("女");elseprintf("男");printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) printf("1");else if(Tree->death==0) printf("0");}}return;}if(NewNode==NULL)//判断它是不是根节点如果是的话就没有父母兄弟信息printf("\n\t是这个家谱图里最年长的人",name);else{if (NewNode->Kind=='G'||NewNode->Kind=='g') //判断父亲节点是父亲还是母亲{printf("\n\t父亲姓名:%s",NewNode->NextNode[0]->Name);}else{printf("\n\t母亲姓名:%s",NewNode->NextNode[0]->Name);printf("\n\t父亲姓名:%s",NewNode->Name);}if(Tree->NextNode[0]!=NULL) //判断他(她)是否有配偶{if(flag==1)//输出他(她)的配偶的信息printf("\n\t丈夫姓名:%s",Tree->NextNode[0]->Name);elseprintf("\n\t妻子姓名:%s",Tree->NextNode[0]->Name);if (Tree->ChildNum>0) //判断他(她)是否有孩子{printf("\n\t的孩子的信息如下:"); //输出他(她)的孩子的信息for(i=1;i<=Tree->ChildNum;i++){printf("\n\t姓名:%s 性别:",Tree->NextNode[i]->Name);if (Tree->NextNode[i]->Kind=='G'||Tree->Kind=='g')printf("女");elseprintf("男");printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) printf("1");else if(Tree->death==0) printf("0");}}elseprintf("\n\t%s至今还没有孩子",name);}elseprintf("\n\t%s至今还没有配偶和孩子\n",Tree->Name);}}TreeNode * SearchTree1(TreeNode *Tree,char birth[],int length){int i;TreeNode *NewNode;if(strcmp(Tree->birthday,birth)==0)if(length==0)FLAG=1;elseFLAG=0;return Tree;}if(Tree->NextNode[0]==NULL)return NULL;for(i=0;i<=Tree->ChildNum;i++){if (i==0)NewNode=SearchTree1(Tree->NextNode[i],birth,0);elseNewNode=SearchTree1(Tree->NextNode[i],birth,20);if (NewNode!=NULL)return NewNode;}return NULL;}void OutPutMessage1(TreeNode * Tree,char birth[],int length){int flag=0,i;TreeNode *NewNode;printf("\n\n\t-----*----*----*----*----*----*----*----*----*----*----");if(Tree==NULL){printf("\n\n\t****该家谱图中没有出生日期为%s这个人的信息请确认是否输入错误*****\n",birth);return;}printf("\n\n\t您所要找的人已经找到信息如下所示:");printf("\n\n\t姓名:%s出生日期:%s 家庭住址:%s 性别:%c",Tree->Name,Tree->birthday,Tree->address,Tree->Kind);if (Tree->Kind=='G'||Tree->Kind=='g'){flag=1; //标记他(她)的性别printf("女");}elseprintf("男");}void Change(TreeNode * Tree) //修改某个人的信息{TreeNode * NewNode;printf("\n\t请输入你要修改的人的姓名:\n\t");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){printf("\n\n\t****该家谱图中没有%s这个人的信息请确认是否输入错误*****\n",name);return;}else{SubMenue1(NewNode);}}void SubMenue1(TreeNode * Tree) //输出副菜单{char c;int flag,i;char name[20];char birth[20];char address1[50];char Parent[2][20];TreeNode * NewNode;getchar();while(1){system("cls");printf("\t");printf("\n\n\t ---*****---请选择你的操作---****--- ");printf("\n\t---*---*---*---A:修改个人的信息---*---*---*---*---*---*---- ");printf("\n\t---*---*---*---B:修改父母的信息---*---*---*---*---*---*---- ");printf("\n\t---*---*---*---C:修改子女的信息---*---*---*---*---*---*---- ");printf("\n\t---*---*---*---D:退出-*---*---*---*---*---*---*---*---*----\n\t");c=getchar();switch(c){case 'A':printf("\n\n\t请输入修改的姓名:如果不需要修改就输入‘0’然后按Enter键继续\n\t");scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Name,name);继续\n\t");scanf("%d",&flag);if (flag==1){if(Tree->Kind=='G'||Tree->Kind=='g')Tree->Kind='B';else Tree->Kind='G';}printf("\n\n\t请输入修改的出生日期:如果不需要修改就输入‘0’然后按Enter键继续\n\t");scanf("%s",birth);if(strcmp(birth,"0")!=0)strcpy(Tree->birthday,birth);printf("\n\n\t请输入修改的家庭地址:如果不需要修改就输入‘0’然后按Enter键继续\n\t");scanf("%s",address1);if(strcmp(address1,"0")!=0)strcpy(Tree->address,address1);printf("\n\n\t个人信息修改成功");break;case 'B':if(Tree->Parent==NULL) //判断是不是头节点{printf("\n\t是这个家谱图里最顶端的人没有父母信息!",name);break;}if (FLAG==1) //判断是不是入赘或加入此间的{if(Tree->Kind=='G'||Tree->Kind=='g'){printf("\n\n\t她是嫁入此间的所以父母信息不在家谱内包括");}else{printf("\n\n\t他是入赘此间的所以父母信息不在家谱内包括");}break;}if(Tree->Parent->Kind=='G'||Tree->Parent->Kind=='g'){strcpy(Parent[0],"母亲");strcpy(Parent[1],"父亲");}else{strcpy(Parent[0],"父亲");strcpy(Parent[1],"母亲");}printf("\n\n\t请输入%s要修改的姓名:如果不需要修改就输入‘0’然后按Enter键继续\n\t",Parent[0]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);printf("\n\n\t请输入%s要修改的姓名:如果不需要修改就输入‘0’然后按Enter键继续\n\t",Parent[1]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->NextNode[0]->Name,name);printf("\n\n\t-------------父母的信息修改成功----------------");break;case 'C':if(Tree->ChildNum==0){printf("\n\n\t至今还没有子女");break;}if (Tree->Parent !=NULL)if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0)//如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Parent;}for(i=1;i<=Tree->ChildNum;i++){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入‘0’然后按Enter键继续\n\t",Tree->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[i]->Name,name);printf("\n\n\t是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n\t");scanf("%d",&flag);if (flag==1){if(Tree->NextNode[i]->Kind=='G'||Tree->NextNode[i]->Kind=='g')Tree->NextNode[i]->Kind='B';else Tree->NextNode[i]->Kind='G';}}printf("\n\n\t---------------子女的信息修改成功----------------");break;case 'D':printf("\n\n\t----------------本项服务到此结束-----------------");break;case '\n':break;default:printf("\n\n\t--------对不起!你的选择不在服务范围之内!---------");printf("\n\t-----------请您再次选择所需的服务项!-------------");printf("\n\t------------------谢谢合作!----------------------\n\t");break;}if (c=='D'||c=='d')break;printf("\n\n\t--------------请按Enter键继续操作--------------");getchar();getchar();}}void SaveFamily(TreeNode *root)//保存家谱至指定文件{char saveFileName[maxFileNameLen];FILE* fp;TreeNode *queue[50], *head;int i, front, rear;//队列的头指针,尾指针printf(" ***** 保存家谱*****\n\n");//if(root==NULL)if(root == NULL){printf("\t\t家谱中无成员,无法保存!\n");return;}TipForSaveFilePosition;//文件及其绝对路径格式scanf("%s", saveFileName);getchar();fp = fopen(saveFileName, "w");//不存在则新建。

相关文档
最新文档