C语言实现家族树的建立与操作

在只考虑直系亲属并且只考虑四代以内亲属的情况下,一个家族的族谱实际上就是一个倒立的二叉树。
我们的任务是:
1.利用树状结构保存4代家庭直系亲属;
2.能够利用程序计算任意两个家庭成员之间的关系,并给出正式名称;
能够采取合适的格式输出全部家谱树信息
这样问题就变得简单了起来
在这里插入图片描述
利用二叉树来进行存储,之后查找到输入两人所在树的层数便可得到两人辈分大小,再利用特定函数将以这二人为根节点的子树挖出来,在辈分低的树上对辈分高的结点进行编码,根据对应编码表便可得到两人关系。

#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<iostream>
#include<algorithm>
using namespace std;
char q[10];
typedef struct tree
{
	char name[20];
	tree *left;
	tree *right;
}tree;
struct wenjian
{
	char a[20];
}d[50];
void guodu(wenjian d[50])
{
	FILE *fp;
	int i=0;
	if((fp=fopen("D:\\name123.txt","r"))==NULL)
	{
		printf("FILE open error");
		exit(0);
	}
	while(!feof(fp))
	{
	fgets(d[i].a,50,fp)==NULL
	printf("%s\n",d[i].a);
	i++;
	}
	fclose(fp);
}
tree *creattree(int &len,wenjain d[50])
{
	tree *T;
	T=(tree *)malloc(sizeof(tree));
	if(d[len].a[0]=='*')
		return NULL;
	else
	{
		strcpy(T->name,d[len].a);
		T->left=creattree(len+1,d);
		T->right=creattree(len+1,d);
	}
	return T;
}
void returnlevel(tree *T,char b[20],int s,int &flag)
{
	if(T)
	{
		if(strcmp(T->name,b)==0)
			flag=s;
		returnlevel(T->left,b,s+1,flag);
		returnlevel(T->right,b,s+1,flag);
	}
}
void find(tree *T,char b[20],tree *&z)
{
	if(T)
	{
		if(strcmp(T->name,b)==0)
		{
			z=T;
		}
		find(T->left,b,z);
		find(T->right,b,z);
	}
}
void code(tree *t,tree *v,int len)
{
	static char a[10];
	if(strcmp(t->name,v->name)==0)
	{
		for(int i=0;i<len;i++)
		{
			q[i]=a[i];
		}
	}
	else
	{
		if(t->left!=NULL)
		{
			a[len]='0';
			code(t->left,v,len+1);
		}
		if(t->right!=NULL)
		{
			a[len]='1';
			code(t->right,v,len+1);
		}
	}
	
}
void prints(tree *T)
{
	if(T)
	{
		printf("%s ",T->name);
		prints(T->left);
		prints(T->right);
	}
}
void print(tree *T,char b[20],char c[20])
{
	for(int i=0;i<20;i++)
		q[i]=0;
	int x=-1,y=-1;
	tree *m,*n;
	m=(tree *)malloc(sizeof(tree));
	n=(tree *)malloc(sizeof(tree));
	returnlevel(T,b,0,x);
	returnlevel(T,c,0,y);
	if(x==-1||y==-1)
		printf("error,您的输入有误请重新输入\n");
	find(T,b,m);
	find(T,c,n);
	if(x>y)
	{
		code(n,m,0);
		if(strcmp(q,"0")==0)
			printf("%s是%s的父亲\n",b,c);
		if(strcmp(q,"00")==0)
			printf("%s是%s的爷爷\n",b,c);
		if(strcmp(q,"000")==0)
			printf("%s是%s的太爷爷\n",b,c);
		if(strcmp(q,"001")==0)
			printf("%s是%s的太奶奶\n",b,c);
		if(strcmp(q,"01")==0)
			printf("%s是%s的奶奶\n",b,c);
		if(strcmp(q,"010")==0)
			printf("%s是%s的外太爷爷\n",b,c);
		if(strcmp(q,"011")==0)
			printf("%s是%s的外太奶奶\n",b,c);
		if(strcmp(q,"1")==0)
			printf("%s是%s的母亲\n",b,c);
		if(strcmp(q,"10")==0)
			printf("%s是%s的姥爷\n",b,c);
		if(strcmp(q,"11")==0)
			printf("%s是%s的姥姥\n",b,c);
		if(strcmp(q,"100")==0)
			printf("%s是%s的太姥爷\n",b,c);
		if(strcmp(q,"101")==0)
			printf("%s是%s的太姥姥\n",b,c);
		if(strcmp(q,"110")==0)
			printf("%s是%s的外太姥爷\n",b,c);
		if(strcmp(q,"111")==0)
			printf("%s是%s的外太姥姥\n",b,c);
	}
	else if(x<y)
	{
		code(m,n,0);
		if(strcmp(q,"0")==0)
			printf("%s是%s的父亲\n",c,b);
		if(strcmp(q,"00")==0)
			printf("%s是%s的爷爷\n",c,b);
		if(strcmp(q,"000")==0)
			printf("%s是%s的太爷爷\n",c,b);
		if(strcmp(q,"001")==0)
			printf("%s是%s的太奶奶\n",c,b);
		if(strcmp(q,"01")==0)
			printf("%s是%s的奶奶\n",c,b);
		if(strcmp(q,"010")==0)
			printf("%s是%s的外太爷爷\n",c,b);
		if(strcmp(q,"011")==0)
			printf("%s是%s的外太奶奶\n",c,b);
		if(strcmp(q,"1")==0)
			printf("%s是%s的母亲\n",c,b);
		if(strcmp(q,"10")==0)
			printf("%s是%s的姥爷\n",c,b);
		if(strcmp(q,"11")==0)
			printf("%s是%s的姥姥\n",c,b);
		if(strcmp(q,"100")==0)
			printf("%s是%s的太姥爷\n",c,b);
		if(strcmp(q,"101")==0)
			printf("%s是%s的太姥姥\n",c,b);
		if(strcmp(q,"110")==0)
			printf("%s是%s的外太姥爷\n",c,b);
		if(strcmp(q,"111")==0)
			printf("%s是%s的外太姥姥\n",c,b);
	}
	else
	{
		printf("本程序仅支持计算直系亲属关系,您的输入有误请重新进行输入\n");
	}
}
int main()
{
	printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
	printf("++                                                        ++\n");
	printf("++                                                        ++\n");
	printf("++                 家庭成员关系计算器                     ++\n");
	printf("++                                                        ++\n");
	printf("++                                                        ++\n");
	printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
	printf("++                   若想退出系统请按0                    ++\n");
	printf("           请输入您想查询的两个人,不分先后顺序             \n");
	tree *T;
	wenjian d[50];
	guodu(d);
	T=creattree(0,d);
	while(1)
	{
	printf("           请输入您想查询的两个人,不分先后顺序             \n");
	char b[20],c[20];
	scanf("%s",b);
	if(b[0]=='0')
		break;
	scanf("%s",c);
	print(T,b,c);
	}
	return 0;
}
测试样例:王一 王二 王四 王八 * * 王九 * * 王五 王十 * * 王十一 * * 王三 王六 王十二 * * 王十三 * * 王七 王十四 * * 王十五 * *
发布了12 篇原创文章 · 获赞 13 · 访问量 337

猜你喜欢

转载自blog.csdn.net/weixin_45939019/article/details/104054704