家谱的设计与实现(树,查找)家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。可。基本功能如下:(1)家谱中每个成员的信息包括:姓名、性别。(2)家谱祖先数据的录入(树的根结点)。(3)家庭成员的添加:即添加某人的儿女(包括姓名和性别),儿女的数目由控制台端给出,然后输入相应的儿女姓名和性别(此处所有儿女的姓名不能重名)。(4)家庭成员的修改:可以修改某一成员的姓名。(5)家庭成员的查询:查询某一成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。(6)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后代成员。#includestdio.h#includemalloc.h#includestring#includestdlib.h#defineMAX10typedefstructnode{//定义data存储结构charname[MAX];//姓名charsex;//性别intgeneration;//代目}node;typedefstructft{//创建结构体structnodel;//家谱中直系家属structft*brother;//用来指向兄弟structft*child;//用来指向孩子}ft;ft*root;//root是结构体ft的指针ft*search(ft*p,charch[])//搜索指针函数{ft*q;if(p==NULL)returnNULL;//没有家谱,头指针下为空if(strcmpi(p-l.name,ch)==0)returnp;//家谱不为空,头指针下有这个人if(p-brother){q=search(p-brother,ch);//在兄弟中找if(q)returnq;//找到}if(p-child){q=search(p-child,ch);//在孩子中找if(q!=NULL)returnq;}returnNULL;//没有找到}ft*parent(ft*p,ft*q,int*flag)//通过parent函数得到双亲结点。用flag标志,-1为左孩子,1为右孩子{if(p==NULL)returnNULL;//没有家谱,头指针下为空if(p-child==NULL){flag=0;returnNULL;}else{if(p-brother==q){*flag=1;returnp;}else{if(p-child==q){*flag=-1;returnp;}else{if(p-brother!=NULL){parent(p-brother,q,*&flag);}if(p-child!=NULL){parent(p-child,q,*&flag);}}}}}intgeneration(ft*p,charch[])//获得搜索到的成员的代目的返回值{ft*q;if(p==NULL)returnNULL;if(strcmpi(p-l.name,ch)==0)returnp-l.generation;//家谱不为空,头指针下有这个人if(p-brother){q=search(p-brother,ch);//在兄弟中找if(q)returnq-l.generation;//找到}if(p-child){q=search(p-child,ch);//在孩子中找if(q!=NULL)returnq-l.generation;}returnNULL;}voidsaves(ft*p,charb[],charc,intd)//建立家谱孩子结点创建结点并对l赋值保存{for(inti=0;iMAX;i++)p-l.name[i]=b[i];p-l.sex=c;p-l.generation=d;}voiddisp(ft*n)//搜索到数据的输出{ft*t=NULL;printf(此人姓名:%s性别%c为第%d代\n,n-l.name,n-l.sex,n-l.generation);printf(\n);printf(此人的子女:);//子女输出if(n-child==NULL){printf(此人无子女!);}else{if(n-child-brother==NULL){printf(姓名:%s性别:%c\t,n-child-l.name,n-child-l.sex);}else{printf(姓名:%s性别:%c\t,n-child-l.name,n-child-l.sex);t=n-child-brother;while(t!=NULL){printf(姓名:%s性别:%c\t,t-l.name,t-l.sex);t=t-brother;}}}printf(\n);printf(\n);printf(此人的同辈成员:);//同辈输出if(n-brother==NULL){printf(此人无同辈成员!);}else{if(n-brother-brother==NULL){printf(姓名:%s性别:%c\t,n-brother-l.name,n-brother-l.sex);}else{printf(姓名:%s性别:%c\t,n-brother-l.name,n-brother-l.sex);t=n-brother-brother;while(t!=NULL){printf(姓名:%s性别:%c\t,t-l.name,t-l.sex);t=t-brother;}}}printf(\n);}voidInitTree()//初始化{charb[MAX],c;inta;printf(请输入始祖的姓名性别:);free(root);//释放root(ft)空间root=(ft*)malloc(sizeof(ft));//创建一个ft结构体大小的空间然后强制转换为ft*类型的指针然后赋值给root//这时root指向一个structdictree结构体大小的新空间scanf(%s%c,&b,&c);a=1;//输入姓名,性别root-child=NULL;//清空左右孩子root-brother=NULL;saves(root,b,c,a);//存入结构printf(家谱重构成功!\n);}voidManu(){printf(*********************************************\n);printf(*****请选择对家谱的操作:*****\n);printf(*****0.退出*****\n);printf(*****1.添加*****\n);printf(*****2.查找*****\n);printf(*****3.修改*****\n);printf(*****4.删除*****\n);printf(*****5.重构*****\n);printf(*********************************************\n);}voidAdd()//添加{ft*n,*m,*t=NULL;charb[MAX],c,d[MAX];inti;printf(请输入要添加子女的上一辈的姓名:\n);//判断是否有重名scanf(%s,&d);n=search(root,d);inta=generation(root,d);while(n==NULL){printf(此人不在家谱内,请重新输入姓名:\n);scanf(%s,&d);n=search(root,d);}//孩子信息添加if(n-child==NULL){printf(孩子姓名与性别输入:\n);scanf(%s%c,&b,&c);a++;m=search(root,b);if(m!=NULL){printf(出现重名,添加失败!\n);}else{n-child=(ft*)malloc(sizeof(ft));n-child-brother=NULL;n-child-child=NULL;saves(n-child,b,c,a);printf(添加成功!\n);}}else{n=n-child;while(n-brother!=NULL)n=n-brother;printf(孩子姓名与性别输入:\n);scanf(%s%c,&b,&c);a++;m=search(root,b);if(m!=NULL)printf(出现重名,添加失败!\n);else{t=(ft*)malloc(sizeof(ft));saves(t,b,c,a);t-brother=NULL;t-child=NULL;n-brother=t;printf(添加成功!\n);}}}voidSearch()//查询{ft*n;chard[MAX];printf(输入姓名,查找相关信息:\n);scanf(%s,&d);n=search(root,d);while(n==NULL){printf(此人不存在,请再次输入:\n);scanf(%s,&d);n=search(root,d);}disp(n);}voidChange()//修改{chara[MAX],r[MAX],c;ft*n;printf(请输入要修改人的姓名:);scanf(%s,&a);n=search(root,a);while(n==NULL){printf(此人不存在,请重新输入姓名:\n);scanf(%s,&a);n=search(root,a);}printf(此人存在,请输入新信息:);scanf(%s%c,&r,&c);for(inti=0;iMAX;i++)n-l.name[i]=r[i];n-l.sex=c;printf(修改成功!\n);}voidDel()//删除{ft*n,*m;intflag;chard[MAX],a[MAX];printf(请输入要删除人的姓名:);scanf(%s,a);n=search(root,a);while(n==NULL){printf(此人不存在,请重新输入姓名:\n);scanf(%s,&a);n=search(root,a);}printf(\n);printf(此人已找到!\n);printf(\n);m=parent(root,n,&flag);if(flag0){m-brother=n-brother;printf(删除成功!\n);}elseif(flag0){m-child=n-brother;printf(删除成功!\n);}}intmain(){InitTree();for(;;){system(pause);system(cls);Manu();intchoice;scanf(%d,&choice);switch(choice){case0:exit(0);break;//退出case1:Add();break;//添加case2:Search();break;//查找case3:Change();break;//修改case4:Del();break;//删除case5:InitTree();break;//初始化}}return0;}