//家谱的建立与查询
#include "stdio.h"
#include "stdlib.h"
typedef struct node{
char name;
char sex;
int age;
int flag;
}node;
typedef struct ft{
struct node l;
struct node m;
struct ft *lchild;
struct ft *rchild;
}ft;
ft *search(ft *p,char ch)//输入头指针,姓名
{
ft *q;
if(p==NULL) return NULL;//没有家谱,头指针下为空
if(p->l.name==ch) return p;//家谱不为空,头指针下有这个人
if(p->m.name==ch) return p;//家谱不为空,头指针下有这个人
if(p->lchild)
{
q=search(p->lchild,ch);//在做孩子中找
if(q) return q;//找到
}
if(p->rchild)
{
q=search(p->rchild,ch);//在右孩子中找
if(q!=NULL) return q;
}
return NULL;//没有找到
}
void done(ft *p,char b,char c,int a)//建立家谱孩子结点
{
p->l.name=b;
p->l.sex=c;
p->l.age=a;
p->l.flag=1;//标志设置
}
void done1(ft *p,char b,char c,int a)//建立家谱配偶节点
{
p->m.name=b;
p->m.sex=c;
p->m.age=a;
p->m.flag=1;
}
void main()
{
ft *root,*n,*h,*t=NULL;
int i,j=1,a,flag=0;
char b,c,d;
printf("***\t***\t***\t家 谱\t***\t***\t***\n");
printf("建立家谱的头指针:\n");
root=(ft *)malloc(sizeof(ft));
printf("输入姓名(char),性别(char),年龄(int):\n");
scanf("%c %c %d",&b,&c,&a);//输入姓名,性别,年龄
root->rchild=NULL;
root->lchild=NULL;
done(root,b,c,a);//存入结构
while(j!=0)
{
printf("选择操作(输入1或2):\n\t0.退出\n\t1.输入\n\t2.查找\n ");
scanf("%d",&j);
if(j==1)
{
getchar();
printf("请输入相关人姓名:\n");//判断是否有重名
scanf("%c",&d);
n=search(root,d);
while(n==NULL)
{
printf("此人不存在,请输入姓名:\n");
getchar();
scanf("%c",&d);
n=search(root,d);
}
printf("\t选择家庭成员类别:\n\t1.配偶\n\t2.孩子\n");
scanf("%d",&i);
if(i==1)
{
getchar();
printf("配偶输入:\n");
scanf("%c %c %d",&b,&c,&a);
//h=(ft *)malloc(sizeof(ft));
done1(n,b,c,a);
printf("完成!\n");
}
else//i=2孩子
{
getchar();
if(n->rchild==NULL)
{
n->rchild=(ft *)malloc(sizeof(ft));
n->rchild->lchild=NULL;
n->rchild->rchild=NULL;
printf("孩子输入:\n");
scanf("%c %c %d",&b,&c,&a);
done(n->rchild,b,c,a);
printf("完成!\n");
}
else{
n=n->rchild;
while(n->lchild!=NULL)
n=n->lchild;
t=(ft *)malloc(sizeof(ft));
printf("孩子输入:\n");
scanf("%c %c %d",&b,&c,&a);
done(t,b,c,a);
t->lchild=NULL;
t->rchild=NULL;
n->lchild=t;
printf("完成!\n");
}
}
}
if(j==2)
{
getchar();
printf("输入姓名,查找相关信息:\n");
scanf("%c",&d);
n=search(root,d);
while(n==NULL)
{
printf("此人不存在,请再次输入:\n");
getchar();
scanf("%c",&d);
n=search(root,d);
}
printf("此人:\n");//?
printf("%c %c %d\n",n->l.name,n->l.sex,n->l.age);
printf("此人的配偶为:\n");//?
if(n->m.flag==1)
printf("%c %c %d\n",n->m.name,n->m.sex,n->m.age);
else printf("此人未婚!\n");
printf("此人的孩子:\n");
if(n->rchild==NULL)
printf("此人没有孩子!\n");
else if(n->rchild->lchild==NULL)
printf("%c %c %d\n",n->rchild->l.name,n->rchild->l.sex,n->rchild->l.age);
else{
printf("%c %c %d\n",n->rchild->l.name,n->rchild->l.sex,n->rchild->l.age);
t=n->rchild->lchild;
while(t!=NULL)
{
printf("%c %c %d\n",t->l.name,t->l.sex,t->l.age);
t=t->lchild;
}
}
}
}
printf("完成!");
}
#include "stdio.h"
#include "stdlib.h"
typedef struct node{
char name;
char sex;
int age;
int flag;
}node;
typedef struct ft{
struct node l;
struct node m;
struct ft *lchild;
struct ft *rchild;
}ft;
ft *search(ft *p,char ch)//输入头指针,姓名
{
ft *q;
if(p==NULL) return NULL;//没有家谱,头指针下为空
if(p->l.name==ch) return p;//家谱不为空,头指针下有这个人
if(p->m.name==ch) return p;//家谱不为空,头指针下有这个人
if(p->lchild)
{
q=search(p->lchild,ch);//在做孩子中找
if(q) return q;//找到
}
if(p->rchild)
{
q=search(p->rchild,ch);//在右孩子中找
if(q!=NULL) return q;
}
return NULL;//没有找到
}
void done(ft *p,char b,char c,int a)//建立家谱孩子结点
{
p->l.name=b;
p->l.sex=c;
p->l.age=a;
p->l.flag=1;//标志设置
}
void done1(ft *p,char b,char c,int a)//建立家谱配偶节点
{
p->m.name=b;
p->m.sex=c;
p->m.age=a;
p->m.flag=1;
}
void main()
{
ft *root,*n,*h,*t=NULL;
int i,j=1,a,flag=0;
char b,c,d;
printf("***\t***\t***\t家 谱\t***\t***\t***\n");
printf("建立家谱的头指针:\n");
root=(ft *)malloc(sizeof(ft));
printf("输入姓名(char),性别(char),年龄(int):\n");
scanf("%c %c %d",&b,&c,&a);//输入姓名,性别,年龄
root->rchild=NULL;
root->lchild=NULL;
done(root,b,c,a);//存入结构
while(j!=0)
{
printf("选择操作(输入1或2):\n\t0.退出\n\t1.输入\n\t2.查找\n ");
scanf("%d",&j);
if(j==1)
{
getchar();
printf("请输入相关人姓名:\n");//判断是否有重名
scanf("%c",&d);
n=search(root,d);
while(n==NULL)
{
printf("此人不存在,请输入姓名:\n");
getchar();
scanf("%c",&d);
n=search(root,d);
}
printf("\t选择家庭成员类别:\n\t1.配偶\n\t2.孩子\n");
scanf("%d",&i);
if(i==1)
{
getchar();
printf("配偶输入:\n");
scanf("%c %c %d",&b,&c,&a);
//h=(ft *)malloc(sizeof(ft));
done1(n,b,c,a);
printf("完成!\n");
}
else//i=2孩子
{
getchar();
if(n->rchild==NULL)
{
n->rchild=(ft *)malloc(sizeof(ft));
n->rchild->lchild=NULL;
n->rchild->rchild=NULL;
printf("孩子输入:\n");
scanf("%c %c %d",&b,&c,&a);
done(n->rchild,b,c,a);
printf("完成!\n");
}
else{
n=n->rchild;
while(n->lchild!=NULL)
n=n->lchild;
t=(ft *)malloc(sizeof(ft));
printf("孩子输入:\n");
scanf("%c %c %d",&b,&c,&a);
done(t,b,c,a);
t->lchild=NULL;
t->rchild=NULL;
n->lchild=t;
printf("完成!\n");
}
}
}
if(j==2)
{
getchar();
printf("输入姓名,查找相关信息:\n");
scanf("%c",&d);
n=search(root,d);
while(n==NULL)
{
printf("此人不存在,请再次输入:\n");
getchar();
scanf("%c",&d);
n=search(root,d);
}
printf("此人:\n");//?
printf("%c %c %d\n",n->l.name,n->l.sex,n->l.age);
printf("此人的配偶为:\n");//?
if(n->m.flag==1)
printf("%c %c %d\n",n->m.name,n->m.sex,n->m.age);
else printf("此人未婚!\n");
printf("此人的孩子:\n");
if(n->rchild==NULL)
printf("此人没有孩子!\n");
else if(n->rchild->lchild==NULL)
printf("%c %c %d\n",n->rchild->l.name,n->rchild->l.sex,n->rchild->l.age);
else{
printf("%c %c %d\n",n->rchild->l.name,n->rchild->l.sex,n->rchild->l.age);
t=n->rchild->lchild;
while(t!=NULL)
{
printf("%c %c %d\n",t->l.name,t->l.sex,t->l.age);
t=t->lchild;
}
}
}
}
printf("完成!");
}