数据结构课程设计(八)

您所在的位置:网站首页 算法与数据结构课程设计实验报告题目 数据结构课程设计(八)

数据结构课程设计(八)

2023-12-05 04:44| 来源: 网络整理| 查看: 265

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3