数据结构课程设计(八)---家谱管理系统(十几个功能)

1、任务简述:
实现具有下列功能的家谱管理系统。

要求:
(1)输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。
(2)实现数据的文件存储和读取。
(3)以图形方式显示家谱。
(4)显示第n 代所有人的信息。
(5)按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
(6)按照出生日期查询成员名单。
(7)输入两人姓名,确定其关系。
(8)某成员添加孩子。
(9)删除某成员(若其还有后代,则一并删除)。
(10)修改某成员信息。
(11)要求建立至少20个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。
(12)界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
(13)存储结构:根据系统功能要求自行设计,但是要求相关数据要存储在数据文件中。测试数据:要求使用1、全部合法数据;2、局部非法数据。进行程序测试,以保证程序的稳定。

2、算法描述:
数据结构:

typedef struct
{ 
	int num;//孩子个数 
	char name[Maxx];///姓名 
	int sex;//性别 
	char ldata[Maxx];//出生日期
	int alive; //是否死亡
	char pass[Maxx];//死亡日期
	char adress[Maxx];//地址
	
	char spouse[Maxx];//配偶的姓名
	char ldata1[Maxx];//出生日期
	int alive1; //是否死亡(1:活着,-1:死亡)
	char pass1[Maxx];//死亡日期
	int dai;  //第几代 
}DataType;


typedef struct TNode
{ 
	DataType data;//数据域 
	struct TNode* nextstr[10];//指针域,指向孩子 
	struct TNode* parent;//指针域,指向父亲 
}PedTNode,*PedTree;//家谱树

收到到B-树的启发,直接采用多叉树结构,即一个父节点有多个子分支,这样用来画图方便,好看,二来操作和二叉树差不多,难度不大。然后递归的生成这颗多叉树。然后根据不同的要求写了相应的函数。下面简单的介绍一下:
1.显示第n 代所有人的信息:因为我是多叉树,可以通过深搜来寻找
2.按照姓名/出生日期查询人员信息:直接递归遍历这棵多叉树。
3.输入两人姓名,确定其关系:我们只写了一些简单的关系,其他的可以递归的来找关系,比如xxx的父亲是xxx父亲的兄弟。
4.某成员添加孩子:TNode* nextstr[10](指针域,指向孩子)直接添加即可。
5.删除某成员:思路和二叉树差不多,只是二叉树是递归的删除左孩子和右孩子,这里多叉树用while即可。

3、源代码

#include 
#include 
#include 
#include 
#include "graphpainter.h"
#include "graphpainter.cpp"
#define OK 1 
#define FALSE 0 
#define ERROR -1 
#define Maxx 50
#define DAI 5   //记录该宗族的最新一代 
typedef int status; 

typedef struct
{ 
	int num;//孩子个数 
	char name[Maxx];///姓名 
	int sex;//性别 
	char ldata[Maxx];//出生日期
	int alive; //是否死亡
	char pass[Maxx];//死亡日期
	char adress[Maxx];//地址
	
	char spouse[Maxx];//配偶的姓名
	char ldata1[Maxx];//出生日期
	int alive1; //是否死亡(1:活着,-1:死亡)
	char pass1[Maxx];//死亡日期
	int dai;  //第几代 
}DataType;


typedef struct TNode
{ 
	DataType data;//数据域 
	struct TNode* nextstr[10];//指针域,指向孩子 
	struct TNode* parent;//指针域,指向父亲 
}PedTNode,*PedTree;//家谱树



void OutMenu();//输出家谱菜单 
void CreateNewPedTreeNode(PedTree Tree,int *k);//创建孩子,递归调用 
void CreatePedTree(PedTree Tree,int k);//创建Pedigree树 
void OutOneInfor(PedTree Tree);//递归调用实现输出整个家谱树 
void OutAllPedTree(PedTree Tree);//输出整个家谱信息 
bool SearchPedTree(PedTree Tree,char Name[],PedTree* DrawTree);//在树中查找 
bool SearchPedTree2(PedTree Tree,char Name[],PedTree* DrawTree);//在树中查找配偶是否匹配 
void ShowMenu1(PedTree Tree);//显示要查找人的信息 
void ShowMenu2();//显示添加信息的菜单 
int AddNewInfor(PedTree Tree);//添加新的家谱信息 
void AddChildInfor(PedTree Tree);//添加子女的信息 
void AddPouseInfor(PedTree Tree);//添加配偶信息 
int ChangeInfor(PedTree Tree);//修改家谱信息 
void ShowMenu3();//显示修改信息的菜单
void Seach_all_n(PedTree Tree,int aa);//输出所有n代成员 
void Seach_all_ldata(PedTree Tree,char *aa);//输出所有生日为aa的成员
void Seach_all_guanxi(PedTree Tree,char *name1,char *name2);//输出name1和name2的关系 
PedTree delbt(PedTree Tree,char *name);//删除掉名字为name的成员
PedTree delbtall(PedTree Tree);//删除树 
void draw(PedTree Tree);


char Name[Maxx][Maxx],Spouse[Maxx][Maxx],Address[Maxx][Maxx],Idata[Maxx][Maxx],Idata1[Maxx][Maxx],Pass[Maxx][Maxx],Pass1[Maxx][Maxx];
int Alive[Maxx],Alive1[Maxx],Num[Maxx],Sex[Maxx],Dai[Maxx],Flag=0;

int main() 
{
	FILE *fp;
	char choice; 
	char s1[Maxx],s2[Maxx],s3[Maxx],s4[Maxx],s5[Maxx],s6[Maxx],s7[Maxx],ss[Maxx],name1[Maxx],name2[Maxx];
	int a,b,c,d,i=0,s;
	int aa;  //查找第几代 
	system("color 1f"); 
	PedTNode TreeNode; 
	PedTree Tree=&TreeNode; 
	bool flag=false;//标志是否执行建立家谱 
	fp=fopen("zlh.txt","r");
	if(fp==NULL)
	{
		printf("can not open file\n");
		exit(0);
	}
	while(fscanf(fp,"%s%s%d%s%s%s%d%d%s%s%d%d",s1,s2,&s,s3,s4,s5,&a,&b,s6,s7,&c,&d)!=EOF)   //顺序为:姓名,配偶姓名,性别,地址,出生日期,配偶出生日期,是否死亡,配偶是否死亡,死亡日期,配偶死亡日期,子女数量,第几代 
	{
		strcpy(Name[i],s1);
		strcpy(Spouse[i],s2);
		Sex[i]=s;
		strcpy(Address[i],s3);
		strcpy(Idata[i],s4);
		strcpy(Idata1[i],s5);
		Alive[i]=a;
		Alive1[i]=b;
		strcpy(Pass[i],s6);
		strcpy(Pass1[i],s7);
		Num[i]=c;
		Dai[i]=d;
		i++;
	}
	fclose(fp);
	while(1) 	
	{	 
		fflush(stdin);//清除键盘缓冲区 
 		system("cls"); 
 		OutMenu(); 
 		printf("\n"); 
 		printf("\t\t请您选择:"); 
 		choice=getchar(); 
 		switch(choice) 
 		{ 
 		case '1': 
  			if(!flag) 
  			{ 
   				CreatePedTree(Tree,0);//创建Pedigree树
   				flag=true; 
  			} 
  			else 
  			{ 
   				printf("\n\t\t家谱不能多次建立\n"); 
   				printf("\n\t\t按任意键继续:"); 
   				fflush(stdin); 
   				getch(); 
  			} 
  			break; 
 		case '2': 
  			if(flag) 
   				ShowMenu1(Tree);//显示要查找人的信息 
  			else 
  			{ 
   				printf("\n\t\t家谱未建立,请您先建立家谱\n"); 
   				printf("\n\t\t按任意键继续:"); 
   				fflush(stdin); 
   				getch(); 
  			} 
  			break; 
 		case '3': 
  			if(flag) 
   				AddNewInfor(Tree);//添加新的家谱信息 
  			else 
  			{ 
  				printf("\n\t\t家谱未建立,请您先建立家谱\n"); 
   				printf("\n\t\t按任意键继续:"); 
  				fflush(stdin); 
   				getch(); 
  			} 
  			break; 
 		case '4': 
  			if(flag) 
   				OutAllPedTree(Tree);//输出整个家谱信息 
  			else 
  			{ 
   				printf("\n\t\t家谱未建立,请您先建立家谱\n"); 
   				printf("\n\t\t按任意键继续:"); 
   				fflush(stdin); 
   				getch(); 
  			} 
  			break; 
 		case '5': 
  			if(flag) 
   				ChangeInfor(Tree);//修改家谱信息 
  			else 
  			{ 
   				printf("\n\t\t家谱未建立,请您先建立家谱\n"); 
   				printf("\n\t\t按任意键继续:"); 
   				fflush(stdin); 
   				getch(); 
  			} 
  			break;
  		case '6':
  			if(flag)
			{ 
  				printf("\n\t\t请输入查找第几代的所有成员:");
  				scanf("%d",&aa);
  				if(aa<=DAI)
  					Seach_all_n(Tree,aa);  //输出所有aa代的成员 
  				else
  					printf("\n\t\t越界,该宗族没有这一代!\n");
  				getch(); 
  			}
  			else
  			{
  				printf("\n\t\t家谱未建立,请您先建立家谱\n"); 
   				printf("\n\t\t按任意键继续:"); 
   				fflush(stdin); 
   				getch();	
  			}
  			break;
 		case '7':
 			if(flag)
 			{
 				printf("\n\t\t请输入查找所有成员的生日为:");
  				scanf("%s",ss);
 				Seach_all_ldata(Tree,ss);
 				if(Flag==0)
 					printf("\n\t\t这一天没有成员过生日\n");
 				getch();
 			}
 			else
 			{
 				printf("\n\t\t家谱未建立,请您先建立家谱\n"); 
   				printf("\n\t\t按任意键继续:"); 
   				fflush(stdin); 
   				getch();	
 			}
 			break;
 		case '8':
 			if(flag)
 			{
 				printf("\n\t\t请输入第一个人的姓名:");
 				scanf("%s",name1);
 				printf("\n\t\t请输入第二个人的姓名:");
 				scanf("%s",name2);
 				Seach_all_guanxi(Tree,name1,name2);
 			}
 			else
 			{
 				printf("\n\t\t家谱未建立,请您先建立家谱\n"); 
   				printf("\n\t\t按任意键继续:"); 
   				fflush(stdin); 
   				getch();	
 			}
 			break;
 		case '9':
 			if(flag)
 			{
 				printf("\n\t\t请输入待删除人员的姓名:");
 				scanf("%s",name1);
 				Tree=delbt(Tree,name1);//删除掉名字为name1的成员
 				getch();
 			}
 			else
			{
				printf("\n\t\t家谱未建立,请您先建立家谱\n"); 
   				printf("\n\t\t按任意键继续:"); 
   				fflush(stdin); 
   				getch();
			}
 			break;
 		case 'a':
 				draw(Tree);
 				fflush(stdin); 
   				getch();
   			break;
		case '0':
  			return 0; 
 		} 
	} 
//return 0; 
}
void OutMenu() 
{
	printf("\t\t---------------081810221朱林昊---------------\n");
	printf("\n\t\t------------------家谱管理-------------------\n\n");  //说明该代码的实现功能
	printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n"); 
	printf("\t\t*                                           *\n"); 
	printf("\t\t*         家谱信息管理菜单                 *\n"); 
	printf("\t\t*                                          *\n"); 
	printf("\t\t*          1:输入家谱信息                  *\n"); 
	printf("\t\t*          2:查找并输出某人信息            *\n"); 
	printf("\t\t*          3:添加新的家庭成员              *\n"); 
	printf("\t\t*          4:输出整个家谱信息              *\n"); 
	printf("\t\t*          5:修改某个人的信息              *\n");
	printf("\t\t*          6:输出第n代所有人的信息         *\n");
	printf("\t\t*          7:输出所有人生日为aa的信息      *\n");
	printf("\t\t*          8:输出两个人的关系              *\n");
	printf("\t\t*          9:删除名为name的成员            *\n"); 
	printf("\t\t*          a:画图                          *\n"); 
	printf("\t\t*          0:退出整个程序                  *\n"); 
	printf("\t\t*                                           *\n"); 
	printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n"); 
}


void CreatePedTree(PedTree Tree,int k)//创建Pedigree树 
{
	fflush(stdin);//清除键盘缓冲区 
	system("cls"); 
	strcpy(Tree->data.name,Name[k]);
	Tree->data.sex=Sex[k];  
	strcpy(Tree->data.ldata,Idata[k]);
	Tree->data.alive=Alive[k];
	strcpy(Tree->data.pass,Pass[k]); 
	strcpy(Tree->data.adress,Address[k]); 
	Tree->data.num=Num[k]; 
	strcpy(Tree->data.spouse,Spouse[k]);
	strcpy(Tree->data.ldata1,Idata1[k]); 
	Tree->data.alive1=Alive1[k];
	strcpy(Tree->data.pass1,Pass[k]);
	Tree->data.dai=Dai[k];
	k++;
	if(strcmp(Tree->data.spouse,"0")==0 && Tree->data.num!=0) 
	{ 
 		printf("\t\t%s的配偶不存在,不能有孩子!\n",Tree->data.name); 
 		Tree->data.num=0;
		Tree->data.alive1=0;
		strcpy(Tree->data.pass1,"0");
		strcpy(Tree->data.ldata1,"0");
	} 
	Tree->parent=NULL; 

	for(int i=0;i<Tree->data.num;i++) 
	{ 
 		printf("\n"); 
 		PedTree ChildTree=(PedTree)malloc(sizeof(PedTNode)); 
 		if(!ChildTree) 
 		{ 
  			printf("Insufficient Memory!\n"); 
  			exit(-1); 
 		} 
 		Tree->nextstr[i]=ChildTree;//指向子女 
 		strcpy(ChildTree->data.name,Name[k]);
 		ChildTree->data.sex=Sex[k]; 
		strcpy(ChildTree->data.ldata,Idata[k]);
		ChildTree->data.alive=Alive[k];
		strcpy(ChildTree->data.pass,Pass[k]);
		strcpy(ChildTree->data.adress,Address[k]);
 		ChildTree->data.num=Num[k];
 		strcpy(ChildTree->data.spouse,Spouse[k]);
		strcpy(ChildTree->data.ldata1,Idata1[k]);
		ChildTree->data.alive1=Alive1[k];
		strcpy(ChildTree->data.pass1,Pass[k]);
		ChildTree->data.dai=Dai[k];
		k++;
 		if(strcmp(ChildTree->data.spouse,"0")==0 && ChildTree->data.num!=0) 
 		{ 
  			printf("\t\t%s的配偶不存在,不能有孩子!\n",ChildTree->data.name); 
  			ChildTree->data.num=0;
  			ChildTree->data.alive1=0;
			strcpy(ChildTree->data.pass1,"0");
			strcpy(ChildTree->data.ldata1,"0");
		} 
 		ChildTree->parent=Tree;//将孩子指向父母 
		CreateNewPedTreeNode(ChildTree,&k); 
	} 
	fflush(stdin);//清除键盘缓冲区 
	printf("\n\n\t\t- - - - 家谱建造成功- - - - - \n"); 
	printf("\n\t\t按任意键继续:"); 
	getch();
}

void CreateNewPedTreeNode(PedTree Tree,int *k)//创建孩子,递归调用 
{
	for(int i=0;i<Tree->data.num;i++) 
	{ 
 		printf("\n"); 
 		PedTree ChildTree=(PedTree)malloc(sizeof(PedTNode)); 
 		if(!ChildTree) 
 		{ 
  			printf("\t\tInsufficient Memory!\n"); 
  			exit(1); 
 		} 
 		Tree->nextstr[i]=ChildTree;//指向子女 
 		strcpy(ChildTree->data.name,Name[*k]);
 		ChildTree->data.sex=Sex[*k]; 
		strcpy(ChildTree->data.ldata,Idata[*k]);
		ChildTree->data.alive=Alive[*k];
		strcpy(ChildTree->data.pass,Pass[*k]);
		strcpy(ChildTree->data.adress,Address[*k]);
 		ChildTree->data.num=Num[*k];
 		strcpy(ChildTree->data.spouse,Spouse[*k]);
		strcpy(ChildTree->data.ldata1,Idata1[*k]);
		ChildTree->data.alive1=Alive1[*k];
		strcpy(ChildTree->data.pass1,Pass[*k]);
		ChildTree->data.dai=Dai[*k];
		(*k)++;
 		if(strcmp(ChildTree->data.spouse,"0")==0 && ChildTree->data.num!=0) 
 		{ 
  			printf("\t\t%s的配偶不存在,不能有孩子!\n",ChildTree->data.name); 
  			ChildTree->data.num=0;
  			ChildTree->data.alive1=0;
			strcpy(ChildTree->data.pass1,"0");
			strcpy(ChildTree->data.ldata1,"0");
		} 
		ChildTree->parent=Tree;//将孩子指向父母 
		CreateNewPedTreeNode(ChildTree,k); 
	}
}

void draw(PedTree Tree) 
{
	char a[255],b[225],c[225];
	PedTree q[200],p;//定义队列,指针数组,可以存放指向结点的指针,指针p用来做访问和遍历
	int head=0,rear=0;//队列的队头队尾两个参数,初始都为0,表示队列为空
	if(strcmp(Tree->data.name,"0")==0)
	{
		printf("家谱为空");
		return ;
	}
	q[rear]=Tree;//初始将根节点入队
	graphpainter GP("graphpainter\\graphpainter.exe");
	
	GP.newpainter("graph.txt", Graph,joel);
	GP.setfigure("figsize","8,5");
	GP.setfigure("dpi","100");
	GP.setlayout("root", "0");
	GP.setdraw("node_size","1000");
	if(strcmp(q[rear]->data.name,"0")!=0)
	{
		if(strcmp(q[rear]->data.spouse,"0")!=0)
			sprintf(a,"\"%s\\n%s\"",q[rear]->data.name,q[rear]->data.spouse);
		else
			sprintf(a,"\"%s\"",q[rear]->data.name);
	}
	sprintf(b,"%d",head);
	GP.setnode(b, a);
	rear++;//队尾更新
	while(head!=rear)//只要队列非空
	{
		
		p=q[head];//访问队头元素
		for(int i=0;i<p->data.num;i++)
		{
			q[rear]=p->nextstr[i];
			sprintf(b,"%d",head);
			sprintf(c,"%d",rear);
			if(strcmp(p->nextstr[i]->data.name,"0")!=0)
			{
				if(strcmp(p->nextstr[i]->data.spouse,"0")!=0)
					sprintf(a,"\"%s\\n%s\"",p->nextstr[i]->data.name,p->nextstr[i]->data.spouse);
				else
					sprintf(a,"\"%s\"",p->nextstr[i]->data.name);
				GP.setnode(c, a);
				GP.setedge(b, c);
			}
			rear++;
		}
		head++;
	}
	printf("\n");
	/*
	//设置点 
	GP.setnode("0", "\"DDD--EEE\"");
	GP.setnode("1", "\"朱林昊--AAA\"");
	GP.setnode("2", "\"TTT--0\"");
	GP.setnode("3", "\"周晨浩--BBB\"");
	GP.setnode("4", "\"CCC--0\"");
	GP.setnode("5", "\"AAAAAAA--王子明\"");
	GP.setnode("6", "\"王浩云--0\"");
	GP.setnode("7", "\"朱淑琦--0\"");
	//设置边 
	GP.setedge("0", "1");
	GP.setedge("0", "5");
	GP.setedge("0", "7");
	GP.setedge("1", "2");
	GP.setedge("1", "3");
	GP.setedge("3", "4");
	GP.setedge("5", "6");*/
	//sprintf(a,"2+%d",s);
	//printf("%s",a);
	GP.draw();
	GP.close();
}

void OutAllPedTree(PedTree Tree)//输出整个家谱信息 
{
	fflush(stdin);//清除键盘缓冲区 
	system("cls"); 
	printf("\n\n\t\t整个家谱主要的信息如下:\n"); 
	printf("\n\t\t---***---***---***---***---***---***---\n");
	if(strcmp(Tree->data.name,"0")!=0) 
		printf("\t\t姓名:%s  ",Tree->data.name); 
	if(Tree->data.sex==1) 
	{ 
 		printf("性别:男\n"); 
 		if(strcmp(Tree->data.spouse,"0")!=0) 
 			printf("\t\t太太姓名:%s\n",Tree->data.spouse);
 		else
 			printf("\t\t没有太太,未婚\n");
	} 
	else if(Tree->data.sex==-1) 
	{ 
 		printf("性别:女\n");
 		if(strcmp(Tree->data.spouse,"0")!=0) 
 			printf("\t\t丈夫姓名:%s\n",Tree->data.spouse);
 		else
 			printf("\t\t没有丈夫,未婚\n"); 
	} 
	for(int i=0;i<Tree->data.num;i++) 
	{ 
 		printf("\t\t第%d个子女的姓名:%s  ",i+1,(Tree->nextstr[i])->data.name); 
 		if(((Tree->nextstr[i])->data.sex)==1) 
  			printf("性别:男\n"); 
 		else if(((Tree->nextstr[i])->data.sex)==-1) 
  			printf("性别:女\n"); 
	} 
	for(int j=0;j<Tree->data.num;j++) 
  		OutOneInfor(Tree->nextstr[j]); 
	fflush(stdin);//清除键盘缓冲区 
 	printf("\n\t\t按任意键继续:"); 
	getch();
}

void OutOneInfor(PedTree Tree)//递归调用实现输出整个家谱树 
{
	if(strcmp(Tree->data.name,"0")!=0)
	{
		printf("\n\t\t---***---***---***---***---***---***---\n");
		printf("\t\t姓名:%s  ",Tree->data.name);
	}
	if(Tree->data.sex==1) 
	{ 
 		printf("性别:男\n"); 
 		if(strcmp(Tree->data.spouse,"0")!=0) 
 			printf("\t\t太太姓名:%s\n",Tree->data.spouse);
 		else
 			printf("\t\t没有太太,未婚\n");
	}	 
	else if(Tree->data.sex==-1)
	{ 
 		printf("性别:女\n"); 
 		if(strcmp(Tree->data.spouse,"0")!=0) 
 			printf("\t\t丈夫姓名:%s\n",Tree->data.spouse);
 		else
 			printf("\t\t没有丈夫,未婚\n");
	}	 
	for(int i=0;i<Tree->data.num;i++) 
	{ 
		if(strcmp((Tree->nextstr[i])->data.name,"0")!=0)
 			printf("\t\t第%d个子女的姓名:%s  ",i+1,(Tree->nextstr[i])->data.name); 
 		if(((Tree->nextstr[i])->data.sex)==1) 
  			printf("性别:男\n"); 
 		else if(((Tree->nextstr[i])->data.sex)==-1) 
  			printf("性别:女\n"); 
	}
	printf("\n");
	for(int j=0;j<Tree->data.num;j++) 
  		OutOneInfor(Tree->nextstr[j]);
}

void ShowMenu1(PedTree Tree)//显示要查找人的信息 
{
	PedTree TempTree=NULL; 
	char Name[20]; 
	fflush(stdin);//清除键盘缓冲区 
	system("cls"); 
	printf("\t\t请输入你要查找的人的姓名:"); 
	scanf("%s",Name); 
	if(SearchPedTree(Tree,Name,&TempTree))//在树中查找 
	{ 
		printf("\n\n\t\t----*----*----*----*----*----*----*----*----*----*----\n"); 
		if(TempTree->parent!=NULL) 
 		{ 
 			printf("\t\t第%d代\n",TempTree->data.dai);
  			printf("\t\t姓名:%s  \n",TempTree->data.name); 
  			if((TempTree->data.sex)==1) 
   				printf("\t\t性别:男\n"); 
  			else if((TempTree->data.sex)==-1) 
   				printf("\t\t性别:女\n");
   			printf("\t\t居住地址:%s \n",TempTree->data.adress);
   			printf("\t\t出生日期:%s \n",TempTree->data.ldata);
   			if(TempTree->data.alive==1)
   				printf("\t\t生死情况:健在 \n");
   			else
			   printf("\t\t生死情况:死亡,死亡日期:%s \n",TempTree->data.pass); 
  			//输出父母亲的姓名 
  			if((TempTree->parent->data.sex)==1) 
  			{ 
   				printf("\t\t父亲姓名:%s \n",TempTree->parent->data.name); 
   				printf("\t\t母亲姓名:%s \n",TempTree->parent->data.spouse); 
  			} 
			else if((TempTree->parent->data.sex)==-1) 
  			{ 
   				printf("\t\t父亲姓名:%s \n",TempTree->parent->data.spouse); 
   				printf("\t\t母亲姓名:%s \n",TempTree->parent->data.name); 
  			} 
		}
		else 
 		{ 
 			printf("\t\t第1代\n");
  			printf("\t\t姓名:%s  \n",TempTree->data.name); 
  			if((TempTree->data.sex)==1) 
   				printf("\t\t性别:男\n"); 
  			else if((TempTree->data.sex)==-1) 
   				printf("\t\t性别:女\n"); 
   			printf("\t\t居住地址:%s \n",TempTree->data.adress);
   			printf("\t\t出生日期:%s \n",TempTree->data.ldata);
   			if(TempTree->data.alive==1)
   				printf("\t\t生死情况:健在 \n");
   			else
			   printf("\t\t生死情况:死亡,死亡日期:%s \n",TempTree->data.pass);
 		} 
 		//输出配偶信息 
 		if((TempTree->data.sex)==1)
		{ 
  			if(strcmp(TempTree->data.spouse,"0")!=0) 
 				printf("\t\t太太姓名:%s\n",TempTree->data.spouse);
 			else
 				printf("\t\t没有太太,未婚\n");
		} 
 		else if((TempTree->data.sex)==-1)
  		{
  			if(strcmp(TempTree->data.spouse,"0")!=0) 
 				printf("\t\t丈夫姓名:%s\n",TempTree->data.spouse);
 			else
 				printf("\t\t没有丈夫,未婚\n");
		} 
 		//输出孩子信息 
 		if((TempTree->data.num)!=0) 
  			printf("\t\t孩子信息:\n"); 
 		for(int j=0;j<TempTree->data.num;j++) 
 		{ 
  			PedTree ChildTree; 
  			ChildTree=TempTree->nextstr[j];
			if(strcmp(ChildTree->data.name,"0")==0)
			  	continue; 
  			printf("\t\t\t第%d个孩子:姓名:%s  \n",j+1,ChildTree->data.name); 
  			if((ChildTree->data.sex)==1) 
   				printf("\t\t\t\t\t性别:男\n"); 
  			else if((ChildTree->data.sex)==-1) 
   				printf("\t\t\t\t\t性别:女\n");
   			printf("\t\t\t\t\t居住地址:%s \n",ChildTree->data.adress);
   			printf("\t\t\t\t\t出生日期:%s \n",ChildTree->data.ldata);
   			if(ChildTree->data.alive==1)
   				printf("\t\t\t\t\t生死情况:健在 \n");
   			else
			   printf("\t\t\t\t\t生死情况:死亡,死亡日期:%s \n",ChildTree->data.pass);
 		} 
 		printf("\t\t----*----*----*----*----*----*----*----*----*----*----\n\n"); 
	}
	else if(SearchPedTree2(Tree,Name,&TempTree))//在配偶中查找 
	{ 
 		printf("\n\n\t\t----*----*----*----*----*----*----*----*----*----*----\n"); 
 		printf("\n\t\t你要找的人已找到,信息如下:\n"); 
 		printf("\t\t姓名:%s  \n",TempTree->data.spouse); 
 		if((TempTree->data.sex)==1) 
 		{ 
  			printf("\t\t性别:女\n");
  			printf("\n\t\t她已嫁入本家族,所以父母信息不存在家谱中\n"); //继续修改 
  			printf("\n\t\t丈夫姓名:%s\n",TempTree->data.name);
  			printf("\t\t居住地址:%s \n",TempTree->data.adress);
   			printf("\t\t出生日期:%s \n",TempTree->data.ldata1);
   			if(TempTree->data.alive1==1)
   				printf("\t\t生死情况:健在 \n");
   			else
			   printf("\t\t生死情况:死亡,死亡日期:%s \n",TempTree->data.pass1);
		}
 		else if((TempTree->data.sex)==-1) 
 		{ 
  			printf("\t\t性别:男\n"); 
  			printf("\n\t\t他入赘本家族,所以父母信息不存在家谱中\n"); 
  			printf("\n\t\t太太姓名:%s\n",TempTree->data.name);
  			printf("\t\t居住地址:%s \n",TempTree->data.adress);
   			printf("\t\t出生日期:%s \n",TempTree->data.ldata1);
   			if(TempTree->data.alive1==1)
   				printf("\t\t生死情况:健在 \n");
   			else
			   printf("\t\t生死情况:死亡,死亡日期:%s \n",TempTree->data.pass1);
		}
		//输出孩子信息 
 		if((TempTree->data.num)!=0) 
  			printf("\t\t孩子信息:\n"); 
 		for(int j=0;j<TempTree->data.num;j++) 
 		{ 
  			PedTree ChildTree; 
  			ChildTree=TempTree->nextstr[j]; 
  			printf("\t\t\t第%d个孩子:姓名:%s  \n",j+1,ChildTree->data.name); 
  			if((ChildTree->data.sex)==1) 
   				printf("\t\t\t\t\t性别:男\n"); 
  			else if((ChildTree->data.sex)==-1) 
   				printf("\t\t\t\t\t性别:女\n");
   			printf("\t\t\t\t\t居住地址:%s \n",ChildTree->data.adress);
   			printf("\t\t\t\t\t出生日期:%s \n",ChildTree->data.ldata);
   			if(ChildTree->data.alive==1)
   				printf("\t\t\t\t\t生死情况:健在 \n");
   			else
			   printf("\t\t\t\t\t生死情况:死亡,死亡日期:%s \n",ChildTree->data.pass);
 		} 
 		printf("\t\t----*----*----*----*----*----*----*----*----*----*----\n\n"); 
	}
	else 
	{ 
 		printf("\n\n\t\t----*----*----*----*----*----*----*----*----*----*----\n\n"); 
 		printf("\t\t***该家谱图中没有%s这个人的信息请确认是否输入正确***\n\n",Name); 
 		printf("\t\t----*----*----*----*----*----*----*----*----*----*----\n\n"); 
	} 
	fflush(stdin);//清除键盘缓冲区 
	printf("\n\t\t按任意键继续:"); 
	getch(); 
}

PedTree delbt(PedTree Tree,char *name)
{
	PedTree TempTree=NULL;
	int i; 
	if(SearchPedTree(Tree,name,&TempTree))  //要删除的是有血缘关系的,所以其妻子/丈夫一并删除 
	{
		delbtall(TempTree);
		printf("\n\t\t删除成功");
		return Tree;
	}
	else if(SearchPedTree2(Tree,name,&TempTree))            //要删除的是没有血缘关系的,所以只删除其妻子和孩子. 
	{
		for(i=0;i<TempTree->data.num;i++)
			delbtall(TempTree->nextstr[i]);
		TempTree->data.alive1=0;
		strcpy(TempTree->data.ldata1,"0");
		TempTree->data.num=0;
		strcpy(TempTree->data.pass1,"0");
		strcpy(TempTree->data.spouse,"0");
		printf("\n\t\t删除成功"); 
		return Tree;
	}
	else
	{
		printf("\n\n\t\t----*----*----*----*----*----*----*----*----*----*----\n\n"); 
 		printf("\t\t***该家谱图中没有%s这个人的信息请确认是否输入正确***\n\n",name); 
 		printf("\t\t----*----*----*----*----*----*----*----*----*----*----\n\n");
 		return Tree;
	}
}

PedTree delbtall(PedTree Tree)
{
	int i;
	if(Tree)
	{
		for(i=0;i<Tree->data.num;i++)
			Tree->nextstr[i]=delbtall(Tree->nextstr[i]);
		strcpy(Tree->data.adress,"0");
		Tree->data.alive=0;
		Tree->data.alive1=0;
		Tree->data.dai=0;
		strcpy(Tree->data.ldata,"0");
		strcpy(Tree->data.ldata1,"0");
		strcpy(Tree->data.name,"0");
		Tree->data.num=0;
		strcpy(Tree->data.pass,"0");
		strcpy(Tree->data.pass1,"0");
		Tree->data.sex=0;
		strcpy(Tree->data.spouse,"0");
	}
}

bool SearchPedTree(PedTree Tree,char Name[],PedTree* DrawTree)//在树中查找 
{
	if(strcmp(Tree->data.name,Name)==0) 
	{ 
 		*DrawTree=Tree; 
 		return true; 
	} 
	else 
	{ 
 		for(int i=0;i<Tree->data.num;i++) 
 		{ 
 			if(SearchPedTree(Tree->nextstr[i],Name,DrawTree)) 
  			return true; 
 		} 
 		return false; 
	} 
}

bool SearchPedTree2(PedTree Tree,char Name[],PedTree* DrawTree)//在树中查找配偶是否匹配 
{
	if(strcmp(Tree->data.spouse,Name)==0) 
	{ 
 		*DrawTree=Tree; 
 		return true; 
	} 
	else 
	{ 
		for(int i=0;i<Tree->data.num;i++) 
 		{ 
  			if(SearchPedTree2(Tree->nextstr[i],Name,DrawTree)) 
   				return true; 
 		} 
 		return false; 
	}
}

void Seach_all_guanxi(PedTree Tree,char *name1,char *name2)//输出name1和name2的关系,只判断是不是亲兄弟姐妹,父子母女这些关系,别的关系可以判断,但是代码会很长,故别的关系只显示谁是谁的晚辈/长辈什么的。 
{
	PedTree TempTree1=NULL,TempTree2=NULL;
	int flag=0,temp1,temp2;
	if(SearchPedTree(Tree,name1,&TempTree1)&&SearchPedTree(Tree,name2,&TempTree2))//都在树中查找到 
	{
		flag++;
		temp1=TempTree1->data.dai;
		temp2=TempTree2->data.dai;
		if(temp1==temp2)
		{
			if(TempTree1->parent->data.name==TempTree2->parent->data.name)
			{
				if(TempTree1->data.sex==1&&TempTree2->data.sex==1) 
				{
					if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)==-1)
						printf("\n\t\t%s和%s是双胞胎",TempTree1->data.name,TempTree2->data.name);
					else if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<0)
						printf("\n\t\t%s是%s的哥哥,%s是%s的弟弟",TempTree1->data.name,TempTree2->data.name,TempTree2->data.name,TempTree1->data.name);
					else
						printf("\n\t\t%s是%s的哥哥,%s是%s的弟弟",TempTree2->data.name,TempTree1->data.name,TempTree1->data.name,TempTree2->data.name);
				}
				else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
				{
					if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)==0)
						printf("\n\t\t%s和%s是双胞胎",TempTree1->data.name,TempTree2->data.name);
					else if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<0)
						printf("\n\t\t%s是%s的哥哥,%s是%s的妹妹",TempTree1->data.name,TempTree2->data.name,TempTree2->data.name,TempTree1->data.name);
					else
						printf("\n\t\t%s是%s的姐姐,%s是%s的弟弟",TempTree2->data.name,TempTree1->data.name,TempTree1->data.name,TempTree2->data.name);	
				}
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
				{
					if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)==0)
						printf("\n\t\t%s和%s是双胞胎",TempTree1->data.name,TempTree2->data.name);
					else if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<0)
						printf("\n\t\t%s是%s的姐姐,%s是%s的弟弟",TempTree1->data.name,TempTree2->data.name,TempTree2->data.name,TempTree1->data.name);
					else
						printf("\n\t\t%s是%s的哥哥,%s是%s的妹妹",TempTree2->data.name,TempTree1->data.name,TempTree1->data.name,TempTree2->data.name);	
				}
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
				{
					if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)==0)
						printf("\n\t\t%s和%s是双胞胎",TempTree1->data.name,TempTree2->data.name);
					else if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<0)
						printf("\n\t\t%s是%s的姐姐,%s是%s的妹妹",TempTree1->data.name,TempTree2->data.name,TempTree2->data.name,TempTree1->data.name);
					else
						printf("\n\t\t%s是%s的姐姐,%s是%s的妹妹",TempTree2->data.name,TempTree1->data.name,TempTree1->data.name,TempTree2->data.name);
				}
			}
			else
			{
				if(TempTree1->parent->data.sex==1)
				{ 
					if(TempTree1->data.sex==1&&TempTree2->data.sex==1) 
					{
						if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<=0)
							printf("\n\t\t%s是%s的堂哥",TempTree1->data.name,TempTree2->data.name);
						else
							printf("\n\t\t%s是%s的堂哥",TempTree2->data.name,TempTree1->data.name);
					}
					else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
					{
						if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<=0)
							printf("\n\t\t%s是%s的堂哥",TempTree1->data.name,TempTree2->data.name);
						else
							printf("\n\t\t%s是%s的堂姐",TempTree2->data.name,TempTree1->data.name);	
					}
					else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
					{
						if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<=0)
							printf("\n\t\t%s是%s的堂姐",TempTree1->data.name,TempTree2->data.name);
						else
							printf("\n\t\t%s是%s的堂哥",TempTree2->data.name,TempTree1->data.name);	
					}
					else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
					{
						if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<=0)
							printf("\n\t\t%s是%s的堂姐",TempTree1->data.name,TempTree2->data.name);
						else
							printf("\n\t\t%s是%s的堂姐",TempTree2->data.name,TempTree1->data.name);
					}
				}
				else  if(TempTree1->parent->data.sex==-1)
				{
					if(TempTree1->data.sex==1&&TempTree2->data.sex==1) 
					{
						if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<=0)
							printf("\n\t\t%s是%s的表哥",TempTree1->data.name,TempTree2->data.name);
						else
							printf("\n\t\t%s是%s的表哥",TempTree2->data.name,TempTree1->data.name);
					}
					else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
					{
						if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<=0)
							printf("\n\t\t%s是%s的表哥",TempTree1->data.name,TempTree2->data.name);
						else
							printf("\n\t\t%s是%s的表姐",TempTree2->data.name,TempTree1->data.name);	
					}
					else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
					{
						if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<=0)
							printf("\n\t\t%s是%s的表姐",TempTree1->data.name,TempTree2->data.name);
						else
							printf("\n\t\t%s是%s的表哥",TempTree2->data.name,TempTree1->data.name);	
					}
					else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
					{
						if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<=0)
							printf("\n\t\t%s是%s的表姐",TempTree1->data.name,TempTree2->data.name);
						else
							printf("\n\t\t%s是%s的表姐",TempTree2->data.name,TempTree1->data.name);
					}
				}
			} 
		}
		else if(temp1-temp2==-1)
		{
			if(TempTree1->data.name==TempTree2->parent->data.name)
			{
				if(TempTree1->data.sex==1&&TempTree2->data.sex==1) 
					printf("\n\t\t%s是%s的父亲,%s是%s的儿子",TempTree1->data.name,TempTree2->data.name,TempTree2->data.name,TempTree1->data.name);
				else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的父亲,%s是%s的女儿",TempTree1->data.name,TempTree2->data.name,TempTree2->data.name,TempTree1->data.name);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
					printf("\n\t\t%s是%s的母亲,%s是%s的儿子",TempTree1->data.name,TempTree2->data.name,TempTree2->data.name,TempTree1->data.name);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的母亲,%s是%s的女儿",TempTree1->data.name,TempTree2->data.name,TempTree2->data.name,TempTree1->data.name);
			}
			else
			{ 
				if(TempTree1->data.sex==1) 
					printf("\n\t\t%s是%s的叔叔",TempTree1->data.name,TempTree2->data.name);
				else if(TempTree1->data.sex==-1) 
					printf("\n\t\t%s是%s的婶婶",TempTree1->data.name,TempTree2->data.name);
			} 
		}
		else if(temp2-temp1==-1)
		{
			if(TempTree2->data.name==TempTree1->parent->data.name)
			{
				if(TempTree2->data.sex==1&&TempTree1->data.sex==1) 
					printf("\n\t\t%s是%s的父亲,%s是%s的儿子",TempTree2->data.name,TempTree1->data.name,TempTree1->data.name,TempTree2->data.name);
				else if(TempTree2->data.sex==1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s是%s的父亲,%s是%s的女儿",TempTree2->data.name,TempTree1->data.name,TempTree1->data.name,TempTree2->data.name);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==1)
					printf("\n\t\t%s是%s的母亲,%s是%s的儿子",TempTree2->data.name,TempTree1->data.name,TempTree1->data.name,TempTree2->data.name);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s是%s的母亲,%s是%s的女儿",TempTree2->data.name,TempTree1->data.name,TempTree1->data.name,TempTree2->data.name);
			}
			else
			{ 
				if(TempTree2->data.sex==1) 
					printf("\n\t\t%s是%s的叔叔",TempTree2->data.name,TempTree1->data.name);
				else if(TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的婶婶",TempTree2->data.name,TempTree1->data.name);
			} 
		}
		else if(temp1-temp2==-2)
		{
			if(TempTree1->data.name==TempTree2->parent->parent->data.name)
			{
				if(TempTree1->data.sex==1)
					printf("\n\t\t%s是%s的爷爷",TempTree1->data.name,TempTree2->data.name);
				else if(TempTree1->data.sex==-1)
					printf("\n\t\t%s是%s的奶奶",TempTree1->data.name,TempTree2->data.name);
			}
			else
			{
				if(TempTree1->data.sex==1&&TempTree2->parent->parent->data.sex==1)
					printf("\n\t\t%s是%s爷爷的兄弟",TempTree1->data.name,TempTree2->data.name);
				else if(TempTree1->data.sex==1&&TempTree2->parent->parent->data.sex==-1)
				{
					if(strcmp(TempTree1->data.ldata,TempTree2->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的奶奶的哥哥",TempTree1->data.name,TempTree2->data.name);
					else
						printf("\n\t\t%s是%s的奶奶的弟弟",TempTree1->data.name,TempTree2->data.name);
				}
				else if(TempTree1->data.sex==-1&&TempTree2->parent->parent->data.sex==1)
				{
					if(strcmp(TempTree1->data.ldata,TempTree2->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的爷爷的姐姐",TempTree1->data.name,TempTree2->data.name);
					else
						printf("\n\t\t%s是%s的爷爷的妹妹",TempTree1->data.name,TempTree2->data.name);
				}
				else if(TempTree1->data.sex==-1&&TempTree2->parent->parent->data.sex==-1)
					printf("\n\t\t%s是%s奶奶的姐妹",TempTree1->data.name,TempTree2->data.name);
			}
		}
		else if(temp2-temp1==-2)
		{
			if(TempTree2->data.name==TempTree1->parent->parent->data.name)
			{
				if(TempTree2->data.sex==1)
					printf("\n\t\t%s是%s的爷爷",TempTree2->data.name,TempTree1->data.name);
				else if(TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的奶奶",TempTree2->data.name,TempTree1->data.name);
			}
			else
			{
				if(TempTree2->data.sex==1&&TempTree1->parent->parent->data.sex==1)
					printf("\n\t\t%s是%s爷爷的兄弟",TempTree2->data.name,TempTree1->data.name);
				else if(TempTree2->data.sex==1&&TempTree1->parent->parent->data.sex==-1)
				{
					if(strcmp(TempTree2->data.ldata,TempTree1->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的奶奶的哥哥",TempTree2->data.name,TempTree1->data.name);
					else
						printf("\n\t\t%s是%s的奶奶的弟弟",TempTree2->data.name,TempTree1->data.name);
				}
				else if(TempTree2->data.sex==-1&&TempTree1->parent->parent->data.sex==1)
				{
					if(strcmp(TempTree2->data.ldata,TempTree1->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的爷爷的姐姐",TempTree2->data.name,TempTree1->data.name);
					else
						printf("\n\t\t%s是%s的爷爷的妹妹",TempTree2->data.name,TempTree1->data.name);
				}
				else if(TempTree2->data.sex==-1&&TempTree1->parent->parent->data.sex==-1)
					printf("\n\t\t%s是%s奶奶的姐妹",TempTree2->data.name,TempTree1->data.name);
			}
		}
		else if(temp1-temp2==-3)
		{
			if(TempTree1->data.name==TempTree2->parent->parent->parent->data.name)
			{
				if(TempTree1->data.sex==1)
					printf("\n\t\t%s是%s的曾爷爷",TempTree1->data.name,TempTree2->data.name);
				else if(TempTree1->data.sex==-1)
					printf("\n\t\t%s是%s的曾奶奶",TempTree1->data.name,TempTree2->data.name);
			}
			else
			{
				if(TempTree1->data.sex==1&&TempTree2->parent->parent->parent->data.sex==1)
					printf("\n\t\t%s是%s曾爷爷的兄弟",TempTree1->data.name,TempTree2->data.name);
				else if(TempTree1->data.sex==1&&TempTree2->parent->parent->parent->data.sex==-1)
				{
					if(strcmp(TempTree1->data.ldata,TempTree2->parent->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的曾奶奶的哥哥",TempTree1->data.name,TempTree2->data.name);
					else
						printf("\n\t\t%s是%s的曾奶奶的弟弟",TempTree1->data.name,TempTree2->data.name);
				}
				else if(TempTree1->data.sex==-1&&TempTree2->parent->parent->parent->data.sex==1)
				{
					if(strcmp(TempTree1->data.ldata,TempTree2->parent->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的曾爷爷的姐姐",TempTree1->data.name,TempTree2->data.name);
					else
						printf("\n\t\t%s是%s的曾爷爷的妹妹",TempTree1->data.name,TempTree2->data.name);
				}
				else if(TempTree1->data.sex==-1&&TempTree2->parent->parent->parent->data.sex==-1)
					printf("\n\t\t%s是%s曾奶奶的姐妹",TempTree1->data.name,TempTree2->data.name);
			}
		}
		else if(temp2-temp1==-3)
		{
			if(TempTree2->data.name==TempTree1->parent->parent->parent->data.name)
			{
				if(TempTree2->data.sex==1)
					printf("\n\t\t%s是%s的曾爷爷",TempTree2->data.name,TempTree1->data.name);
				else if(TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的曾奶奶",TempTree2->data.name,TempTree1->data.name);
			}
			else
			{
				if(TempTree2->data.sex==1&&TempTree1->parent->parent->parent->data.sex==1)
					printf("\n\t\t%s是%s曾爷爷的兄弟",TempTree2->data.name,TempTree1->data.name);
				else if(TempTree2->data.sex==1&&TempTree1->parent->parent->parent->data.sex==-1)
				{
					if(strcmp(TempTree2->data.ldata,TempTree1->parent->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的曾奶奶的哥哥",TempTree2->data.name,TempTree1->data.name);
					else
						printf("\n\t\t%s是%s的曾奶奶的弟弟",TempTree2->data.name,TempTree1->data.name);
				}
				else if(TempTree2->data.sex==-1&&TempTree1->parent->parent->parent->data.sex==1)
				{
					if(strcmp(TempTree2->data.ldata,TempTree1->parent->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的曾爷爷的姐姐",TempTree2->data.name,TempTree1->data.name);
					else
						printf("\n\t\t%s是%s的曾爷爷的妹妹",TempTree2->data.name,TempTree1->data.name);
				}
				else if(TempTree2->data.sex==-1&&TempTree1->parent->parent->parent->data.sex==-1)
					printf("\n\t\t%s是%s曾奶奶的姐妹",TempTree2->data.name,TempTree1->data.name);
			}
		}
		else if(temp1-temp2==-4)
		{
			if(TempTree1->data.name==TempTree2->parent->parent->parent->parent->data.name)
			{
				if(TempTree1->data.sex==1)
					printf("\n\t\t%s是%s的曾曾爷爷",TempTree1->data.name,TempTree2->data.name);
				else if(TempTree1->data.sex==-1)
					printf("\n\t\t%s是%s的曾曾奶奶",TempTree1->data.name,TempTree2->data.name);
			}
			else
			{
				if(TempTree1->data.sex==1&&TempTree2->parent->parent->parent->parent->data.sex==1)
					printf("\n\t\t%s是%s曾曾爷爷的兄弟",TempTree1->data.name,TempTree2->data.name);
				else if(TempTree1->data.sex==1&&TempTree2->parent->parent->parent->parent->data.sex==-1)
				{
					if(strcmp(TempTree1->data.ldata,TempTree2->parent->parent->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的曾曾奶奶的哥哥",TempTree1->data.name,TempTree2->data.name);
					else
						printf("\n\t\t%s是%s的曾曾奶奶的弟弟",TempTree1->data.name,TempTree2->data.name);
				}
				else if(TempTree1->data.sex==-1&&TempTree2->parent->parent->parent->parent->data.sex==1)
				{
					if(strcmp(TempTree1->data.ldata,TempTree2->parent->parent->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的曾曾爷爷的姐姐",TempTree1->data.name,TempTree2->data.name);
					else
						printf("\n\t\t%s是%s的曾曾爷爷的妹妹",TempTree1->data.name,TempTree2->data.name);
				}
				else if(TempTree1->data.sex==-1&&TempTree2->parent->parent->parent->parent->data.sex==-1)
					printf("\n\t\t%s是%s曾曾奶奶的姐妹",TempTree1->data.name,TempTree2->data.name);
			}
		}
		else
		{
			if(TempTree2->data.name==TempTree1->parent->parent->parent->parent->data.name)
			{
				if(TempTree2->data.sex==1)
					printf("\n\t\t%s是%s的曾曾爷爷",TempTree2->data.name,TempTree1->data.name);
				else if(TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的曾曾奶奶",TempTree2->data.name,TempTree1->data.name);
			}
			else
			{
				if(TempTree2->data.sex==1&&TempTree1->parent->parent->parent->parent->data.sex==1)
					printf("\n\t\t%s是%s曾曾爷爷的兄弟",TempTree2->data.name,TempTree1->data.name);
				else if(TempTree2->data.sex==1&&TempTree1->parent->parent->parent->parent->data.sex==-1)
				{
					if(strcmp(TempTree2->data.ldata,TempTree1->parent->parent->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的曾曾奶奶的哥哥",TempTree2->data.name,TempTree1->data.name);
					else
						printf("\n\t\t%s是%s的曾曾奶奶的弟弟",TempTree2->data.name,TempTree1->data.name);
				}
				else if(TempTree2->data.sex==-1&&TempTree1->parent->parent->parent->parent->data.sex==1)
				{
					if(strcmp(TempTree2->data.ldata,TempTree1->parent->parent->parent->parent->data.ldata)<=0)
						printf("\n\t\t%s是%s的曾曾爷爷的姐姐",TempTree2->data.name,TempTree1->data.name);
					else
						printf("\n\t\t%s是%s的曾曾爷爷的妹妹",TempTree2->data.name,TempTree1->data.name);
				}
				else if(TempTree2->data.sex==-1&&TempTree1->parent->parent->parent->parent->data.sex==-1)
					printf("\n\t\t%s是%s曾曾奶奶的姐妹",TempTree2->data.name,TempTree1->data.name);
			}
		}
	}
	else if(SearchPedTree2(Tree,name1,&TempTree1)&&SearchPedTree2(Tree,name2,&TempTree2))//都在配偶中查找到 
	{
		temp1=TempTree1->data.dai;
		temp2=TempTree2->data.dai;
		if(temp1==temp2)
		{
			if(TempTree1->parent->data.name==TempTree2->parent->data.name)
			{
				if(TempTree1->data.sex==1&&TempTree2->data.sex==1)
					printf("\n\t\t%s和%s互为妯娌",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
				{
					printf("\n\t\t%s的丈夫和%s的妻子:",TempTree1->data.spouse,TempTree2->data.spouse);
					Seach_all_guanxi(Tree,TempTree1->data.name,TempTree2->data.name);
				}
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
				{
					printf("\n\t\t%s的妻子和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
					Seach_all_guanxi(Tree,TempTree1->data.name,TempTree2->data.name);
				}
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
				{
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
					Seach_all_guanxi(Tree,TempTree1->data.name,TempTree2->data.name);
				}
			}
			else
			{
				if(TempTree1->data.sex==1&&TempTree2->data.sex==1)
					printf("\n\t\t%s的妻子和%s的妻子",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的妻子:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
					printf("\n\t\t%s的妻子和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				Seach_all_guanxi(Tree,TempTree1->data.name,TempTree2->data.name);
			}
		}
		else if(temp1-temp2==-1)
		{
			if(TempTree1->data.name==TempTree2->parent->data.name)
			{
				if(TempTree1->data.sex==1&&TempTree2->data.sex==1) 
					printf("\n\t\t%s和%s是婆媳关系",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的女婿",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
					printf("\n\t\t%s是%s的儿媳妇",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的岳父",TempTree2->data.spouse,TempTree1->data.spouse);
			}
			else
			{ 
				if(TempTree1->data.sex==1&&TempTree2->data.sex==1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的妻子:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
					printf("\n\t\t%s的妻子和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				Seach_all_guanxi(Tree,TempTree1->data.name,TempTree2->data.name);
			} 
		}
		else if(temp2-temp1==-1)
		{
			if(TempTree2->data.name==TempTree1->parent->data.name)
			{
				if(TempTree2->data.sex==1&&TempTree1->data.sex==1) 
					printf("\n\t\t%s和%s是婆媳关系",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s是%s的女婿",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==1)
					printf("\n\t\t%s是%s的儿媳妇",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s是%s的岳父",TempTree1->data.spouse,TempTree2->data.spouse);
			}
			else
			{ 
				if(TempTree2->data.sex==1&&TempTree1->data.sex==1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的妻子:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==1)
					printf("\n\t\t%s的妻子和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				Seach_all_guanxi(Tree,TempTree2->data.name,TempTree1->data.name);
			} 
		}
		else if(temp1-temp2==-2)
		{
			if(TempTree1->data.name==TempTree2->parent->parent->data.name)
			{
				if(TempTree1->data.sex==1)
					printf("\n\t\t%s是%s的孙媳妇",TempTree2->data.name,TempTree1->data.name);
				else if(TempTree1->data.sex==-1)
					printf("\n\t\t%s是%s的孙女婿",TempTree1->data.name,TempTree2->data.name);
			}
			else
			{
				if(TempTree2->data.sex==1&&TempTree1->data.sex==1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的妻子:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==1)
					printf("\n\t\t%s的妻子和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				Seach_all_guanxi(Tree,TempTree2->data.name,TempTree1->data.name);
			}
		}
		else if(temp2-temp1==-2)
		{
			if(TempTree2->data.name==TempTree1->parent->parent->data.name)
			{
				if(TempTree2->data.sex==1)
					printf("\n\t\t%s是%s的孙媳妇",TempTree1->data.name,TempTree2->data.name);
				else if(TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的孙女婿",TempTree2->data.name,TempTree1->data.name);
			}
			else
			{
				if(TempTree1->data.sex==1&&TempTree2->data.sex==1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的妻子:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
					printf("\n\t\t%s的妻子和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				Seach_all_guanxi(Tree,TempTree1->data.name,TempTree2->data.name);
			}
		}
		else if(temp1-temp2==-3)
		{
			if(TempTree1->data.name==TempTree2->parent->parent->parent->data.name)
			{
				if(TempTree1->data.sex==1)
					printf("\n\t\t%s是%s的曾孙媳妇",TempTree2->data.name,TempTree1->data.name);
				else if(TempTree1->data.sex==-1)
					printf("\n\t\t%s是%s的曾孙女婿",TempTree1->data.name,TempTree2->data.name);
			}
			else
			{
				if(TempTree2->data.sex==1&&TempTree1->data.sex==1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的妻子:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==1)
					printf("\n\t\t%s的妻子和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				Seach_all_guanxi(Tree,TempTree2->data.name,TempTree1->data.name);
			}
		}
		else if(temp2-temp1==-3)
		{
			if(TempTree2->data.name==TempTree1->parent->parent->parent->data.name)
			{
				if(TempTree2->data.sex==1)
					printf("\n\t\t%s是%s的曾孙媳妇",TempTree1->data.name,TempTree2->data.name);
				else if(TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的曾孙女婿",TempTree2->data.name,TempTree1->data.name);
			}
			else
			{
				if(TempTree1->data.sex==1&&TempTree2->data.sex==1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的妻子:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
					printf("\n\t\t%s的妻子和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				Seach_all_guanxi(Tree,TempTree1->data.name,TempTree2->data.name);
			}
		}
		else if(temp1-temp2==-4)
		{
			if(TempTree1->data.name==TempTree2->parent->parent->parent->parent->data.name)
			{
				if(TempTree1->data.sex==1)
					printf("\n\t\t%s是%s的曾曾孙媳妇",TempTree2->data.name,TempTree1->data.name);
				else if(TempTree1->data.sex==-1)
					printf("\n\t\t%s是%s的曾曾孙女婿",TempTree1->data.name,TempTree2->data.name);
			}
			else
			{
				if(TempTree2->data.sex==1&&TempTree1->data.sex==1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的妻子:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==1)
					printf("\n\t\t%s的妻子和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				else if(TempTree2->data.sex==-1&&TempTree1->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree2->data.spouse,TempTree1->data.spouse);
				Seach_all_guanxi(Tree,TempTree2->data.name,TempTree1->data.name);
			}
		}
		else
		{
			if(TempTree2->data.name==TempTree1->parent->parent->parent->parent->data.name)
			{
				if(TempTree2->data.sex==1)
					printf("\n\t\t%s是%s的曾曾孙媳妇",TempTree1->data.name,TempTree2->data.name);
				else if(TempTree2->data.sex==-1)
					printf("\n\t\t%s是%s的曾曾孙女婿",TempTree2->data.name,TempTree1->data.name);
			}
			else
			{
				if(TempTree1->data.sex==1&&TempTree2->data.sex==1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的妻子:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==1)
					printf("\n\t\t%s的妻子和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				else if(TempTree1->data.sex==-1&&TempTree2->data.sex==-1)
					printf("\n\t\t%s的丈夫和%s的丈夫:",TempTree1->data.spouse,TempTree2->data.spouse);
				Seach_all_guanxi(Tree,TempTree1->data.name,TempTree2->data.name);
			}
		}
	}
	else if(SearchPedTree(Tree,name1,&TempTree1)&&SearchPedTree2(Tree,name2,&TempTree2))//一个在树中查找到,一个在配偶中查找到
	{
		if(TempTree2->data.name==TempTree1->data.name)
			printf("\n\t\t%s和%s互为夫妻",TempTree1->data.name,TempTree2->data.spouse);
		else if(TempTree2->data.sex==1)
		{
			printf("\n\t\t%s和%s的老公:",TempTree1->data.name,TempTree2->data.spouse);
			Seach_all_guanxi(Tree,TempTree1->data.name,TempTree2->data.name);
		}
		else if(TempTree2->data.sex==-1)
		{
			printf("\n\t\t%s和%s的妻子:",TempTree1->data.name,TempTree2->data.spouse);
			Seach_all_guanxi(Tree,TempTree1->data.name,TempTree2->data.name);
		}
	}
	else if(SearchPedTree(Tree,name2,&TempTree2)&&SearchPedTree2(Tree,name1,&TempTree1))//一个在树中查找到,一个在配偶中查找到
	{
		if(TempTree1->data.name==TempTree2->data.name)
			printf("\n\t\t%s和%s互为夫妻",TempTree2->data.name,TempTree1->data.spouse);
		else if(TempTree1->data.sex==1)
		{
			printf("\n\t\t%s和%s的老公:",TempTree2->data.name,TempTree1->data.spouse);
			Seach_all_guanxi(Tree,TempTree2->data.name,TempTree1->data.name);
		}
		else if(TempTree1->data.sex==-1)
		{
			printf("\n\t\t%s和%s的妻子:",TempTree2->data.name,TempTree1->data.spouse);
			Seach_all_guanxi(Tree,TempTree2->data.name,TempTree1->data.name);
		}
	}
	else 
	{ 
 		printf("\n\n\t\t----*----*----*----*----*----*----*----*----*----*----\n\n"); 
 		printf("\t\t***该家谱图中没有相关信息,请确认是否输入正确***\n\n"); 
 		printf("\t\t----*----*----*----*----*----*----*----*----*----*----\n\n"); 
	} 
	fflush(stdin);//清除键盘缓冲区 
	printf("\n\t\t按任意键继续:"); 
	getch(); 
}

void Seach_all_n(PedTree Tree,int aa)//输出所有aa代成员 
{
	if(Tree->data.dai==aa)
	{
		if(strcmp(Tree->data.name,"0")!=0)
			printf("\n\t\t姓名:%s\n",Tree->data.name);
		if(Tree->data.sex==1)
			printf("\t\t姓别:男\n");
		if(Tree->data.sex==-1)
			printf("\t\t姓名:女\n");
		if((strcmp(Tree->data.spouse,"0")==0)&&strcmp(Tree->data.name,"0")!=0)
			printf("\t\t婚姻状况:未婚\n");
		if(strcmp(Tree->data.spouse,"0")!=0)
			printf("\t\t婚姻状况:和%s已结婚\n",Tree->data.spouse);
		if(strcmp(Tree->data.adress,"0")!=0)
			printf("\t\t住址:%s\n",Tree->data.adress);
		if(Tree->data.alive==1)
			printf("\t\t健康在世\n");
		if(Tree->data.alive==-1)
			printf("\t\t去世时间:%s\n",Tree->data.pass); 
	}
	else
	{
		for(int i=0;i<Tree->data.num;i++)
			Seach_all_n(Tree->nextstr[i],aa);
	}
} 

void Seach_all_ldata(PedTree Tree,char *aa)
{
	if((strcmp(Tree->data.ldata,aa)==0)||strcmp(Tree->data.ldata1,aa)==0)
	{
		Flag++;      //只是为了判断有没有生日是aa的人 
		if(strcmp(Tree->data.ldata,aa)==0)
		{
			printf("\n\t\t姓名:%s\n",Tree->data.name);
			if(Tree->data.sex==1)
				printf("\t\t姓别:男\n");
			else
				printf("\t\t姓名:女\n");
			if(strcmp(Tree->data.spouse,"0")==0)
				printf("\t\t婚姻状况:未婚\n");
			else
				printf("\t\t婚姻状况:和%s已结婚\n",Tree->data.spouse);
			printf("\t\t住址:%s\n",Tree->data.adress);
			if(Tree->data.alive==1)
				printf("\t\t健康在世\n");
			else
				printf("\t\t去世时间:%s\n",Tree->data.pass); 
		}
		if(strcmp(Tree->data.ldata1,aa)==0)
		{
			printf("\n\t\t姓名:%s\n",Tree->data.spouse);
			if(Tree->data.sex==0)
				printf("\t\t姓别:男\n");
			else
				printf("\t\t姓名:女\n");
			printf("\t\t婚姻状况:和%s已结婚\n",Tree->data.name);
			printf("\t\t住址:%s\n",Tree->data.adress);
			if(Tree->data.alive1==1)
				printf("\t\t健康在世\n");
			else
				printf("\t\t去世时间:%s\n",Tree->data.pass);
		}
	}
	else
	{
		for(int i=0;i<Tree->data.num;i++)
			Seach_all_ldata(Tree->nextstr[i],aa);
	}
}

int AddNewInfor(PedTree Tree)//添加新的家谱信息 
{
	fflush(stdin);//清除键盘缓冲区 
	char choice; 
	while(1) 
	{ 
 		fflush(stdin);//清除键盘缓冲区 
 		system("cls"); 
 		ShowMenu2();//显示添加信息的菜单 
 		printf("\n"); 
 		printf("\t  请您选择:"); 
 		choice=getchar(); 
 		switch(choice) 
 		{ 
 			case '1': 
  				AddChildInfor(Tree);//添加子女的信息    
  				break; 
 			case '2': 
  				AddPouseInfor(Tree);//添加配偶信息 
  				break; 
 			case '3': 
  				return 0; 	
 		} 
	}
}

void AddChildInfor(PedTree Tree)//添加子女的信息 
{
	fflush(stdin);//清除键盘缓冲区 
	system("cls"); 
	char Name[20]; 
	PedTree TempTree=NULL; 
	printf("\n\t\t请输入要添加子女的父母的名字:"); 
	scanf("%s",Name); 
	/*if((TempTree=SearchPedTree(Tree,Name))==NULL)*/ 
	if(SearchPedTree(Tree,Name,&TempTree)||SearchPedTree2(Tree,Name,&TempTree))//在树中查找 
	{ 
 		if(strcmp(TempTree->data.spouse,"0")!=0) 
 		{ 
  			PedTree ChildTree; 
  			int num=TempTree->data.num; 
  			TempTree->nextstr[num]=(PedTree)malloc(sizeof(PedTNode));//父母指向孩子 
  			ChildTree=TempTree->nextstr[num]; 
  			if(!ChildTree) 
  			{ 
   				printf("\t\tInsufficient Memory!\n"); 
   				exit(1); 
  			} 
  			printf("\n\t\t请输入要添加的子女的姓名:"); 
  			scanf("%s",ChildTree->data.name);
  			printf("\n\t\t请输入添加子女的性别(1男,-1女):");
			fflush(stdin);//清除键盘缓冲区  
  			scanf("%d",&(ChildTree->data.sex));
  			printf("\n\t\t请输入要添加的子女的出生日期:");
  			fflush(stdin);//清除键盘缓冲区
  			scanf("%s",ChildTree->data.ldata); 
  			printf("\n\t\t请输入要添加的子女是否死亡(-1:死亡,1:活着):");
  			scanf("%d",&(ChildTree->data.alive)); 
			printf("\n\t\t请输入要添加的子女的死亡日期(未死亡写0):");
  			scanf("%s",ChildTree->data.pass);
			printf("\n\t\t请输入要添加的子女的居住地址:");
  			fflush(stdin);//清除键盘缓冲区
  			scanf("%s",ChildTree->data.adress);
			ChildTree->data.dai=TempTree->data.dai+1;
 			(TempTree->data.num)++;//父母孩子数加1 
  			ChildTree->parent=TempTree;//孩子指向父母 
  			strcpy(ChildTree->data.spouse,"0");//将配偶初始为
  			strcpy(ChildTree->data.ldata1,"0");
			ChildTree->data.alive1=0;
			strcpy(ChildTree->data.pass1,"0");
			ChildTree->data.num=0;
			printf("\n\n\t\t- - - - 子女信息添加成功- - - - - \n"); 
 		} 
 		else 
  			printf("\n\t\t配偶不存在,不能添加子女信息\n"); 
	} 
	else 
 		printf("\n\n\t\t不存在该父母!\n"); 
	fflush(stdin);//清除键盘缓冲区 
	printf("\n\t\t按任意键继续:"); 
	getch(); 
}

void AddPouseInfor(PedTree Tree)//添加配偶信息 
{
	fflush(stdin);//清除键盘缓冲区 
	system("cls"); 
	char Name[20]; 
	bool flag=false; 
	PedTree TempTree=NULL; 
	printf("\n\t\t请输入要添加人的配偶的名字:"); 
	scanf("%s",Name); 
	if(!SearchPedTree(Tree,Name,&TempTree))//在树中查找 
	{ 
 		printf("\n\n\t\t不存在该人!\n"); 
 		flag=true; 
	} 
	else 
	{ 
 		if(strcmp(TempTree->data.spouse,"0")==0) 
 		{ 
  			printf("\n\t\t请入要填加的人的姓名:"); 
  			scanf("%s",TempTree->data.spouse);
  			printf("\n\t\t请入要填加的人的出生日期:");
  			fflush(stdin);//清除键盘缓冲区 
  			scanf("%s",TempTree->data.ldata1);
  			printf("\n\t\t请入要填加的人是否死亡(-1:死亡,1:活着):");
  			scanf("%d",&(TempTree->data.alive1));
  			printf("\n\t\t请输入要添加的人的死亡日期(未死亡写0):");
  			scanf("%s",TempTree->data.pass1);
 		} 
 		else 
 		{ 
  			printf("\n\n\t\t已存在配偶,请专一,谢谢!\n"); 
  			flag=true; 
 		} 
	} 
	fflush(stdin);//清除键盘缓冲区 
	if(!flag) 
 		printf("\n\n\t\t- - - - 配偶信息添加成功- - - - - \n"); 
	printf("\n\t\t按任意键继续:"); 
	getch(); 
}

void ShowMenu2()//显示添加信息的菜单 
{
	printf("\n\n\t\t-----****----请选择你的操作----****-----\n\n"); 
	printf("\t   ----****----1.添加某个人的子女的信息----****----\n"); 
	printf("\t   ----****----2.添加某个人的配偶的信息----****----\n"); 
	printf("\n\t     ----****---***---3.退出---***----****-----\n"); 
}

int ChangeInfor(PedTree Tree)//修改家谱信息 
{
	fflush(stdin);//清除键盘缓冲区 
	system("cls"); 
	char Name[20]; 
	char choice;// 
	int tempch; 
	char TempName[20];
	char TempData[20];
	int n;
	PedTree TempTree; 
	printf("\n\t\t请输入要修改人的姓名:"); 
	scanf("%s",Name); 
	if(SearchPedTree(Tree,Name,&TempTree)) 
	{ 
 		PedTree TempParent=TempTree->parent; 
 		while(1) 
 		{ 
  			fflush(stdin);//清除键盘缓冲区 
  			system("cls"); 
  			ShowMenu3(); 
  			printf("\n"); 
  			printf("\t\t请您选择:"); 
  			choice=getchar(); 
  			switch(choice) 
  			{ 
  			case '1': 
   				printf("\n\t\t请输入要修改人的姓名:(不需要修改输入0)\n\t\t"); 
   				scanf("%s",TempName); 
   				if(strcmp(TempName,"0")!=0) 
   	 				strcpy(TempTree->data.name,TempName);  
   				fflush(stdin);//清除键盘缓冲区
   				printf("\n\t\t请输入要修改人的性别:(1男,-1女)\n\t\t");  
				scanf("%d",&tempch); 
    			if(tempch!='0') 
     				TempTree->data.sex=tempch; 
     			fflush(stdin);//清除键盘缓冲区 
   				printf("\n\t\t请输入要修改人的出生日期:(不需要修改输入0)\n\t\t");  
				scanf("%s",TempData); 
    			if(strcmp(TempData,"0")!=0) 
     				strcpy(TempTree->data.ldata,TempData); 
     			printf("\n\t\t请输入要修改人是否死亡(-1:死亡,1:活着,不需要修改输入0)\n\t\t");  
				scanf("%d",&n); 
    			if(n!=0) 
     				TempTree->data.alive=n;
     			printf("\n\t\t请输入要修改人的死亡日期:(不需要修改输入0)\n\t\t");  
				scanf("%s",TempData); 
    			if(strcmp(TempData,"0")!=0) 
     				strcpy(TempTree->data.pass,TempData);
     			fflush(stdin);//清除键盘缓冲区	
     			printf("\n\t\t请输入要修改人的住址:(不需要修改输入0)\n\t\t");  
				scanf("%s",TempData); 
    			if(strcmp(TempData,"0")!=0) 
     				strcpy(TempTree->data.adress,TempData);
   				printf("\n\t\t----****---***---信息修改成功---***----****-----"); 
   				fflush(stdin);//清除键盘缓冲区 
   				printf("\n\t\t按任意键继续:"); 
   				getch();  
				break; 
  			case '2': 
   				if(TempTree->parent==NULL) 
    				printf("\n\t\t这是家谱中最顶端的人,不存在父母的信息!\n"); 
   				else 
   				{ 
    				printf("\n\t\t请输入该人父母是有宗族直接血缘关系的姓名:(不需要修改输入0)\n\t\t");
    				scanf("%s",TempName); 
    				if(strcmp(TempName,"0")!=0) 
     					strcpy(TempParent->data.name,TempName);
     				fflush(stdin);//清除键盘缓冲区
     				printf("\n\t\t请输入该人父母是有宗族直接血缘关系的配偶的姓名:(不需要修改输入0)\n\t\t");
     				scanf("%s",TempName); 
    				if(strcmp(TempName,"0")!=0) 
     					strcpy(TempParent->data.spouse,TempName);
     				fflush(stdin);//清除键盘缓冲区
    				printf("\n\t\t请输入该人父母是有宗族直接血缘关系的性别:(1:男,-1:女)\n\t\t"); 
 					scanf("%d",&tempch); 
    			 	if(tempch!='0') 
      					TempParent->data.sex=tempch; 
    				fflush(stdin);//清除键盘缓冲区
    				printf("\n\t\t请输入该人父母是有宗族直接血缘关系的出生日期:(不需要修改输入0)\n\t\t");
    				scanf("%s",TempData); 
    				if(strcmp(TempData,"0")!=0) 
     					strcpy(TempParent->data.ldata,TempData);
     				fflush(stdin);//清除键盘缓冲区
     				printf("\n\t\t请输入该人父母是有宗族直接血缘关系的配偶的出生日期:(不需要修改输入0)\n\t\t");
     				scanf("%s",TempData); 
    				if(strcmp(TempData,"0")!=0) 
     					strcpy(TempParent->data.ldata1,TempData);	
    				printf("\n\t\t请输入该人父母是有宗族直接血缘关系是否死亡(-1:死亡,1:活着,不需要修改输入0)\n\t\t");  
					scanf("%d",&n); 
    				if(n!=0) 
     					TempParent->data.alive=n;
     				printf("\n\t\t请输入该人父母是有宗族直接血缘关系的配偶是否死亡(-1:死亡,1:活着,不需要修改输入0)\n\t\t");  
					scanf("%d",&n); 
    				if(n!=0) 
     					TempParent->data.alive1=n;
     				printf("\n\t\t请输入要该人父母是有宗族直接血缘关系的死亡日期:(不需要修改输入0)\n\t\t");  
					scanf("%s",TempData); 
    				if(strcmp(TempData,"0")!=0) 
     					strcpy(TempParent->data.pass,TempData);
     				fflush(stdin);//清除键盘缓冲区
					printf("\n\t\t请输入要该人父母是有宗族直接血缘关系的配偶的死亡日期:(不需要修改输入0)\n\t\t");  
					scanf("%s",TempData); 
    				if(strcmp(TempData,"0")!=0) 
     					strcpy(TempParent->data.pass1,TempData);
					fflush(stdin);//清除键盘缓冲区	
     				printf("\n\t\t请输入要该人的父母的住址:(不需要修改输入0)\n\t\t");  
					scanf("%s",TempData); 
    				if(strcmp(TempData,"0")!=0) 
     					strcpy(TempParent->data.adress,TempData);
    				printf("\n\t\t----****---***---信息修改成功---***----****-----"); 
   				} 
   				fflush(stdin);//清除键盘缓冲区 
   				printf("\n\t\t按任意键继续:"); 
   				getch(); 
   				break; 
  			case '3': 
   				if(TempTree->parent==NULL) 
    				printf("\n\t\t这是家谱中最顶端的人,不存在兄弟姐妹的信息!\n"); 
   				else 
   				{ 
    				for(int i=1;i<TempParent->data.num;i++) 
    				{ 
     					printf("\n\t\t请输入%s 修改后的姓名:(不需要修改输入0)\n\t\t",TempParent->nextstr[i]->data.name); 
     					scanf("%s",TempName); 
     					if(strcmp(TempName,"0")!=0) 
     						strcpy(TempParent->nextstr[i]->data.name,TempName); 
     					fflush(stdin);//清除键盘缓冲区 
     					printf("\n\t\t请输入%s 修改后的性别:(1:男,-1:女)\n\t\t",TempParent->nextstr[i]->data.name);     
     					scanf("%d",&tempch); 
     					if(tempch!='0') 
      						TempParent->nextstr[i]->data.sex=tempch; 
     					fflush(stdin);//清除键盘缓冲区
						printf("\n\t\t请输入%s 修改后的出生日期:(不需要修改输入0)\n\t\t",TempParent->nextstr[i]->data.name); 
     					scanf("%s",TempData); 
     					if(strcmp(TempData,"0")!=0) 
     						strcpy(TempParent->nextstr[i]->data.ldata,TempData); 
     					printf("\n\t\t请输入%s 是否死亡(-1:死亡,1:活着,不需要修改输入0)\n\t\t",TempParent->nextstr[i]->data.name);  
						scanf("%d",&n); 
    					if(n!=0) 
     						TempParent->nextstr[i]->data.alive=n;
     					printf("\n\t\t请输入%s 的死亡日期:(不需要修改输入0)\n\t\t",TempParent->nextstr[i]->data.name);  
						scanf("%s",TempData); 
    					if(strcmp(TempData,"0")!=0) 
     						strcpy(TempParent->nextstr[i]->data.pass,TempData);
     					fflush(stdin);//清除键盘缓冲区	
     					printf("\n\t\t请输入%s 的住址:(不需要修改输入0)\n\t\t",TempParent->nextstr[i]->data.name);  
						scanf("%s",TempData); 
    					if(strcmp(TempData,"0")!=0) 
     						strcpy(TempParent->nextstr[i]->data.adress,TempData);	
    				} 
					printf("\n\t\t----****---***---信息修改成功---***----****-----"); 
   				} 
   				fflush(stdin);//清除键盘缓冲区 
   				printf("\n\t\t按任意键继续:"); 
   				getch(); 
   				break; 
  			case '4': 
   				if(TempTree->data.num<=0) 
   					printf("\n\t\t%s还没有子女,请先添加\n",TempTree->data.name); 
   				else 
   				{ 
    				for(int i=0;i<TempParent->data.num;i++) 
   					{ 
     					printf("\n\t\t请输入%s 修改后的姓名:(不需要修改输入0)\n\t\t",TempTree->nextstr[i]->data.name); 
     					scanf("%s",TempName); 
     					if(strcmp(TempName,"0")!=0) 
     						strcpy(TempTree->nextstr[i]->data.name,TempName);
     					fflush(stdin);//清除键盘缓冲区 
     					printf("\n\t\t请输入%s 修改后的性别(1男,-1女):\n\t\t",TempTree->nextstr[i]->data.name);     
     					scanf("%d",&tempch); 
     					TempTree->nextstr[i]->data.sex=tempch; 
     					fflush(stdin);//清除键盘缓冲区
     					printf("\n\t\t请输入%s 修改后的出生日期:(不需要修改输入0)\n\t\t",TempTree->nextstr[i]->data.name); 
     					scanf("%s",TempData); 
     					if(strcmp(TempData,"0")!=0) 
     						strcpy(TempTree->nextstr[i]->data.ldata,TempData);  
     					printf("\n\t\t请输入%s 是否死亡(-1:死亡,1:活着,不需要修改输入0)\n\t\t",TempTree->nextstr[i]->data.name);  
						scanf("%d",&n); 
    					if(n!=0) 
     						TempTree->nextstr[i]->data.alive=n;
     					printf("\n\t\t请输入%s 的死亡日期:(不需要修改输入0)\n\t\t",TempTree->nextstr[i]->data.name);  
						scanf("%s",TempData); 
    					if(strcmp(TempData,"0")!=0) 
     						strcpy(TempTree->nextstr[i]->data.pass,TempData);
     					fflush(stdin);//清除键盘缓冲区	
     					printf("\n\t\t请输入%s 的住址:(不需要修改输入0)\n\t\t",TempTree->nextstr[i]->data.name);  
						scanf("%s",TempData); 
    					if(strcmp(TempData,"0")!=0) 
     						strcpy(TempTree->nextstr[i]->data.adress,TempData);	
    				} 
					printf("\n\t\t----****---***---信息修改成功---***----****-----"); 
   				} 
   				fflush(stdin);//清除键盘缓冲区 
   				printf("\n\t\t按任意键继续:"); 
   				getch(); 
   				break; 
  			case '5': 
   				if(strcmp(TempTree->data.spouse,"0")==0) 
    				printf("\n\t\t%s还没有配偶,请先添加\n",TempTree->data.name); 
   				else 
   				{ 
    				printf("\n\t\t请输入%s 修改后的姓名:(不需要修改输入0)\n\t\t",TempTree->data.spouse); 
    				scanf("%s",TempName); 
    				if(strcmp(TempName,"0")!=0) 
     					strcpy(TempTree->data.spouse,TempName);  
    				fflush(stdin);//清除键盘缓冲区 
					printf("\n\t\t请输入要修改人的出生日期:(不需要修改输入0)\n\t\t");  
					scanf("%s",TempData); 
    				if(strcmp(TempData,"0")!=0) 
     					strcpy(TempTree->data.ldata1,TempData); 
     				printf("\n\t\t请输入要修改人是否死亡(-1:死亡,1:活着,不需要修改输入0)\n\t\t");  
					scanf("%d",&n); 
    				if(n!=0) 
     					TempTree->data.alive1=n;
     				printf("\n\t\t请输入要修改人的死亡日期:(不需要修改输入0)\n\t\t");  
					scanf("%s",TempData); 
    				if(strcmp(TempData,"0")!=0) 
     					strcpy(TempTree->data.pass1,TempData);
     				fflush(stdin);//清除键盘缓冲区	
     				printf("\n\t\t请输入要修改人的住址:(不需要修改输入0)\n\t\t");  
					scanf("%s",TempData); 
    				if(strcmp(TempData,"0")!=0) 
     					strcpy(TempTree->data.adress,TempData);	 
     			} 
   				printf("\n\t   ----****---***---信息修改成功---***----****-----"); 
   				fflush(stdin);//清除键盘缓冲区 
   				printf("\n\t\t按任意键继续:"); 
   				getch(); 
				break; 
  			case '6': 
   				return 0; 
  			} 
 		}   
	} 
	else 
		printf("\n\t\t找不到你要查找的人!\n"); 
	fflush(stdin);//清除键盘缓冲区 
	printf("\n\t\t按任意键继续:"); 
	getch(); 
}

void ShowMenu3()//显示修改信息的菜单 
{
	printf("\n\n\t\t-----****----请选择你的操作----****-----\n\n"); 
	printf("\t    ----****------1.修改个人的信息--------****----\n"); 
	printf("\t    ----****------2.修改父母的信息--------****----\n"); 
	printf("\t    ----****------3.修改兄弟姐妹的信息----****----\n"); 
	printf("\t    ----****------4.修改子女的信息--------****----\n"); 
	printf("\t    ----****------5.修改配偶的信息--------****----\n"); 
	printf("\n\t      ----****---***---6.退出---***----****-----\n"); 
}//1834行 

4、运行结果

先输入1创建并且画图,图片如下:
数据结构课程设计(八)---家谱管理系统(十几个功能)_第1张图片
然后输入4,进行预览:
数据结构课程设计(八)---家谱管理系统(十几个功能)_第2张图片
然后输入2,看“李云峰”的信息:
数据结构课程设计(八)---家谱管理系统(十几个功能)_第3张图片
然后输入3,给添加一个孩子,然后再输入2查询:
数据结构课程设计(八)---家谱管理系统(十几个功能)_第4张图片
数据结构课程设计(八)---家谱管理系统(十几个功能)_第5张图片
数据结构课程设计(八)---家谱管理系统(十几个功能)_第6张图片
然后输入6,找出所有第2代人的信息:
数据结构课程设计(八)---家谱管理系统(十几个功能)_第7张图片
然后输入7,查询生日为“2023.6.7”的人的信息:
数据结构课程设计(八)---家谱管理系统(十几个功能)_第8张图片
然后输入8,查询两人的关系:
数据结构课程设计(八)---家谱管理系统(十几个功能)_第9张图片
然后输入9,删除“李宝爱”:
数据结构课程设计(八)---家谱管理系统(十几个功能)_第10张图片
然后画图:
数据结构课程设计(八)---家谱管理系统(十几个功能)_第11张图片
(右下角可以拖动)
5、总结
性能分析:
大体上由于涉及到了所有成员的遍历,并且不能像二叉树那样,所有时间复杂度可以认为是O(n),而不是O(logn),但是如果转化为孩子兄弟树来操作,那么时间复杂度可以降为O(logn)。
心得体会:
这个代码是我写的时间最长的代码,花了一个星期,一点一点的实现了所有的功能,我这里的数据结构比较奇怪,是用多叉树写的,没有用孩子兄弟树(其实也可以),我感触最深的是输出关系那里,我一开始感觉要输出好几代人之间的关系实在是太难了,因为需要逐个判断过去,但是和老师交流后,感觉可以递归的输出,就是输出A的XXX是B的YYY的什么关系,那么这样就可以大幅度减少代码的长度了。

你可能感兴趣的:(C语言,课程设计)