家谱的设计与实现(二叉树)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档