家谱的设计与实现(二叉树)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
家谱的设计与实现(树,查找)
家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。可。基本功能如下:
(1)家谱中每个成员的信息包括:姓名、性别。
(2)家谱祖先数据的录入(树的根结点)。
(3)家庭成员的添加:即添加某人的儿女(包括姓名和性别),儿女的数目由控制台端给出,然后输入相应的儿女姓名和性别(此处所有儿女的姓名不能重名)。
(4)家庭成员的修改:可以修改某一成员的姓名。
(5)家庭成员的查询:查询某一成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。
(6)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后代成员。
#include
#include
#include
#include
#define MAX 10
typedef struct node{ //定义data存储结构
char name[MAX]; //姓名
char sex; //性别
int generation;//代目
}node;
typedef struct ft{ //创建结构体
struct node l; //家谱中直系家属
struct ft *brother;//用来指向兄弟
struct ft *child;//用来指向孩子
}ft;
ft *root; //root是结构体ft的指针
ft *search(ft *p,char ch[]) // 搜索指针函数
{
ft *q;
if(p==NULL)
return NULL;//没有家谱,头指针下为空
if(strcmpi(p->,ch)==0)
return p;//家谱不为空,头指针下有这个人
if(p->brother)
{
q=search(p->brother,ch);//在兄弟中找
if(q)
return q;//找到
}
if(p->child)
{
q=search(p->child,ch);//在孩子中找
if(q!=NULL)
return q;
}
return NULL;//没有找到
}
ft *parent(ft *p,ft *q,int *flag) //通过parent函数得到双亲结点。用flag标志,-1为左孩子,1为右孩子
{
if(p==NULL)
return NULL;//没有家谱,头指针下为空
if(p->child==NULL)
{
flag=0;
return NULL;
}
else
{
if(p->brother==q)
{
*flag=1;
return p;
}
else
{
if(p->child==q)
{
*flag=-1;
return p;
}
else
{
if(p->brother!=NULL)
{
parent(p->brother,q,*&flag);
}
if(p->child!=NULL)
{
parent(p->child,q,*&flag);
}
}
}
}
}
int generation(ft *p,char ch[]) // 获得搜索到的成员的代目的返回值
{
ft *q;
if(p==NULL) return NULL;
if(strcmpi(p->,ch)==0) return p->l.generation;//家谱不为空,头指针下有这个人if(p->brother)
{
q=search(p->brother,ch);//在兄弟中找
if(q) return q->l.generation;//找到
}
if(p->child)
{
q=search(p->child,ch);//在孩子中找
if(q!=NULL) return q->l.generation;
}
return NULL;
}
void saves(ft *p,char b[],char c,int d)//建立家谱孩子结点创建结点并对l赋值保存{
for(int i=0;i p->[i]=b[i]; p->l.sex=c; p->l.generation=d; } void disp(ft *n) //搜索到数据的输出 { ft *t=NULL; printf("此人姓名:%s 性别%c 为第%d代\n",n->,n->l.sex,n->l.generation); printf("\n"); printf("此人的子女:"); //子女输出 if(n->child==NULL) { printf("此人无子女!"); } else