家谱地设计与实现二叉树.docx
- 文档编号:24819803
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:14
- 大小:16.75KB
家谱地设计与实现二叉树.docx
《家谱地设计与实现二叉树.docx》由会员分享,可在线阅读,更多相关《家谱地设计与实现二叉树.docx(14页珍藏版)》请在冰豆网上搜索。
家谱地设计与实现二叉树
家谱的设计与实现(树,查找)
家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。
可。
基本功能如下:
(1)家谱中每个成员的信息包括:
姓名、性别。
(2)家谱祖先数据的录入(树的根结点)。
(3)家庭成员的添加:
即添加某人的儿女(包括姓名和性别),儿女的数目由控制台端给出,然后输入相应的儿女姓名和性别(此处所有儿女的姓名不能重名)。
(4)家庭成员的修改:
可以修改某一成员的姓名。
(5)家庭成员的查询:
查询某一成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。
(6)家庭成员的删除:
删除此成员时,若其有后代,将删除其所有后代成员。
#include
#include
#include
#include
#defineMAX10
typedefstructnode{//定义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;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;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(flag>0) {m->brother=n->brother;printf("删除成功! \n");} elseif(flag<0) {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; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 家谱 设计 实现 二叉