家谱的设计与实现(二叉树)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(p==NULL) return NULL;//没有家谱,头指针下为空 if(strcmpi(p->l.name,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)Fra Baidu bibliotek//通过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;
while(t!=NULL) { printf("姓名:%s t=t->brother; } }
性别:%c\t",t->l.name,t->l.sex);
} 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"); } void InitTree() //初始化
ft *n,*m; int flag; char d[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");} else if(flag<0) { m->child=n->brother; printf("删除成功!\n");} } int main() { InitTree(); for(;;) { system("pause"); system("cls"); Manu(); int choice; scanf("%d",&choice); switch(choice) { case 0:exit(0); break;//退出 case 1:Add(); break;//添加 case 2:Search(); break;//查找 case 3:Change(); break;//修改 case 4:Del(); break;//删除 case 5:InitTree(); break;//初始化 } } return 0; }
char a[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(int i=0;i<MAX;i++) n->l.name[i]=r[i]; n->l.sex=c; printf("修改成功!\n"); } void Del() { //删除
{ char b[MAX],c; int a; printf(" 请输入始祖的姓名 性别:"); free(root); //释放root (ft) 空间 root=(ft *)malloc(sizeof(ft)); // 创建一个ft结构体大小的空间 然后强制 转换为ft *类型的指针 然后赋值给root // 这时 root指 向一个struct dictree结构体大小的新空间 scanf("%s %c",&b,&c);a=1;//输入姓名,性别 root->child=NULL; //清空左右孩子 root->brother=NULL; saves(root,b,c,a);//存入结构 printf("家谱重构成功!\n"); } void Manu() { printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" printf(" }
void Add() //添加 { ft *n,*m,*t=NULL; char b[MAX],c,d[MAX]; int i; printf("请输入要添加子女的上一辈的姓名:\n");//判断是否有重名 scanf("%s",&d); n=search(root,d);
int a=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;
家谱的设计与实现(树,查找) 家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、 删除等功能。可。基本功能如下: (1)家谱中每个成员的信息包括:姓名、性别。 (2)家谱祖先数据的录入(树的根结点)。 (3)家庭成员的添加:即添加某人的儿女(包括姓名和性别),儿女 的数目由控制台端给出,然后输入相应的儿女姓名和性别(此处所有儿 女的 姓名不能重名)。 (4)家庭成员的修改:可以修改某一成员的姓名。 (5)家庭成员的查询:查询某一成员在家族中的辈分(第几代),并 能查询此成员的所有子女及这一辈的所有成员。 (6)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后 代成员。
#include <stdio.h> #include <malloc.h> #include <string> #include <stdlib.h> #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; // 搜索指针函数
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"); } } } void Search() //查询 { ft *n; char d[MAX]; printf("输入姓名,查找相关信息:\n"); scanf("%s",&d); n=search(root,d); while(n==NULL) { printf("此人不存在,请再次输入:\n"); scanf("%s",&d); n=search(root,d); } disp(n); } void Change() { //修改
} 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->l.name,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<MAX;i++) p->l.name[i]=b[i]; p->l.sex=c; p->l.generation=d; } void disp(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;
*********************************************\n"); ***** 请选择对家谱的操作: *****\n"); ***** 0.退出 *****\n"); ***** 1.添加 *****\n"); ***** 2.查找 *****\n"); ***** 3.修改 *****\n"); ***** 4.删除 *****\n"); ***** 5.重构 *****\n"); *********************************************\n");