任务简述

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

算法描述

用了树的数据结构,每个结点是家族中的一员以及他的配偶等信息,不考虑族内通婚的情况(不然关系不好判断)。若有数据异常则创建失败。成员若死亡,则除姓名外所有信息皆为0,这样方便操作。大部分函数用递归实现。用了图形以及非常精致的文字形式输出,效果很好。查找时家族成员与配偶分开查找,分别用SearchPedTree函数和SearchPedTree2函数进行,查找方法类似dfs,避免结点的重复查找或遗漏。查找关系时分两人是族内的和配偶共4种情况进行,是配偶时可考虑其配偶与另一人的关系。若两人相差4辈以上,则统称一人为另一人的祖先。删除时递归调用delbtall函数,考虑此人是族内的或者配偶两种情况,删除该点及其后代。界面十分合理,每一步都有非常清晰的提示。输出时用了opencv的函数以及自己写的函数(opencv无法输出中文),效果不错。
大部分操作都是在所有成员中查找,因此时间复杂度是O(n)
源代码

putText.h:
#ifndef PUTTEXT_H_
#define PUTTEXT_H_#include <windows.h>
#include <string>
#include <opencv2/opencv.hpp>using namespace cv;void GetStringSize(HDC hDC, const char* str, int* w, int* h);
void putTextZH(Mat &dst, const char* str, Point org, Scalar color, int fontSize,const char *fn = "Arial", bool italic = false, bool underline = false);#endif // PUTTEXT_H_
//共14行
putText.cpp:
#include "putText.h"void GetStringSize(HDC hDC, const char* str, int* w, int* h)
{SIZE size;GetTextExtentPoint32A(hDC, str, strlen(str), &size);if (w != 0) *w = size.cx;if (h != 0) *h = size.cy;
}void putTextZH(Mat &dst, const char* str, Point org, Scalar color, int fontSize, const char* fn, bool italic, bool underline)
{CV_Assert(dst.data != 0 && (dst.channels() == 1 || dst.channels() == 3));int x, y, r, b;if (org.x > dst.cols || org.y > dst.rows) return;x = org.x < 0 ? -org.x : 0;y = org.y < 0 ? -org.y : 0;LOGFONTA lf;lf.lfHeight = -fontSize;lf.lfWidth = 0;lf.lfEscapement = 0;lf.lfOrientation = 0;lf.lfWeight = 5;lf.lfItalic = italic;   //斜¡À体¬?lf.lfUnderline = underline; //下?划?线?lf.lfStrikeOut = 0;lf.lfCharSet = DEFAULT_CHARSET;lf.lfOutPrecision = 0;lf.lfClipPrecision = 0;lf.lfQuality = PROOF_QUALITY;lf.lfPitchAndFamily = 0;strcpy_s(lf.lfFaceName, fn);HFONT hf = CreateFontIndirectA(&lf);HDC hDC = CreateCompatibleDC(0);HFONT hOldFont = (HFONT)SelectObject(hDC, hf);int strBaseW = 0, strBaseH = 0;int singleRow = 0;char buf[1 << 12];strcpy_s(buf, str);char *bufT[1 << 12];  // 这a个?用®?于®¨²分¤?隔?字Á?符¤?串ä?后¨®剩º¡ê余®¨¤的Ì?字Á?符¤?,ê?可¨¦能¨¹会¨¢超?出?。¡ê//处ä|理¤¨ª多¨¤行D{int nnh = 0;int cw, ch;const char* ln = strtok_s(buf, "\n",bufT);while (ln != 0){GetStringSize(hDC, ln, &cw, &ch);strBaseW = max(strBaseW, cw);strBaseH = max(strBaseH, ch);ln = strtok_s(0, "\n",bufT);nnh++;}singleRow = strBaseH;strBaseH *= nnh;}if (org.x + strBaseW < 0 || org.y + strBaseH < 0){SelectObject(hDC, hOldFont);DeleteObject(hf);DeleteObject(hDC);return;}r = org.x + strBaseW > dst.cols ? dst.cols - org.x - 1 : strBaseW - 1;b = org.y + strBaseH > dst.rows ? dst.rows - org.y - 1 : strBaseH - 1;org.x = org.x < 0 ? 0 : org.x;org.y = org.y < 0 ? 0 : org.y;BITMAPINFO bmp = { 0 };BITMAPINFOHEADER& bih = bmp.bmiHeader;int strDrawLineStep = strBaseW * 3 % 4 == 0 ? strBaseW * 3 : (strBaseW * 3 + 4 - ((strBaseW * 3) % 4));bih.biSize = sizeof(BITMAPINFOHEADER);bih.biWidth = strBaseW;bih.biHeight = strBaseH;bih.biPlanes = 1;bih.biBitCount = 24;bih.biCompression = BI_RGB;bih.biSizeImage = strBaseH * strDrawLineStep;bih.biClrUsed = 0;bih.biClrImportant = 0;void* pDibData = 0;HBITMAP hBmp = CreateDIBSection(hDC, &bmp, DIB_RGB_COLORS, &pDibData, 0, 0);CV_Assert(pDibData != 0);HBITMAP hOldBmp = (HBITMAP)SelectObject(hDC, hBmp);//color.val[2], color.val[1], color.val[0]SetTextColor(hDC, RGB(255, 255, 255));SetBkColor(hDC, 0);//SetStretchBltMode(hDC, COLORONCOLOR);strcpy_s(buf, str);const char* ln = strtok_s(buf, "\n",bufT);int outTextY = 0;while (ln != 0){TextOutA(hDC, 0, outTextY, ln, strlen(ln));outTextY += singleRow;ln = strtok_s(0, "\n",bufT);}uchar* dstData = (uchar*)dst.data;int dstStep = dst.step / sizeof(dstData[0]);unsigned char* pImg = (unsigned char*)dst.data + org.x * dst.channels() + org.y * dstStep;unsigned char* pStr = (unsigned char*)pDibData + x * 3;for (int tty = y; tty <= b; ++tty){unsigned char* subImg = pImg + (tty - y) * dstStep;unsigned char* subStr = pStr + (strBaseH - tty - 1) * strDrawLineStep;for (int ttx = x; ttx <= r; ++ttx){for (int n = 0; n < dst.channels(); ++n){double vtxt = subStr[n] / 255.0;int cvv = vtxt * color.val[n] + (1 - vtxt) * subImg[n];subImg[n] = cvv > 255 ? 255 : (cvv < 0 ? 0 : cvv);}subStr += 3;subImg += dst.channels();}}SelectObject(hDC, hOldBmp);SelectObject(hDC, hOldFont);DeleteObject(hf);DeleteObject(hBmp);DeleteDC(hDC);
}//共137行主程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<conio.h>
#include "putText.h"
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
#define DAI 3   //记录该宗族的最新一代
#define Maxx 30typedef 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;  //第几代
}ddataType;typedef struct TNode{ ddataType 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);//输出整个家谱信息
int SearchPedTree(PedTree Tree,char Name[],PedTree* DrawTree);//在树中查找
int 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);//添加配偶信息
void 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的成员
void delbtall(PedTree Tree);//删除树
void showchild(PedTree TempTree);//输出有关孩子的信息
void show(PedTree T);//利用opencv的函数非递归遍历树并画图输出
void DrawLine(Mat img, Point start, Point end);//利用opencv的函数画线
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,aa;system("color 2f");//背景色调为我最喜欢的绿色 PedTNode TreeNode; PedTree Tree=&TreeNode; int flag=0;//判断是否已经创建家谱 fp=fopen("家谱.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=1; } 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){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 '0':return 0; } } return 0;
}void OutMenu()
{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*          0:退出整个程序                  *\n"); printf("\t\t*                                           *\n"); printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n");
}void CreatePedTree(PedTree Tree,int k){//创建Pedigree树 int i;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(i=0;i<Tree->data.num;i++){ printf("\n"); PedTree ChildTree=(PedTree)malloc(sizeof(PedTNode)); if(!ChildTree){ printf("内存不足!\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){//创建孩子,递归调用 int i;for(i=0;i<Tree->data.num;i++){ printf("\n"); PedTree ChildTree=(PedTree)malloc(sizeof(PedTNode)); if(!ChildTree){ printf("\t\t内存不足!\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 DrawLine(Mat img, Point start, Point end){int thickness = 1;int lineType = 8;line(img,start,//起点坐标end,//终点坐标Scalar(0, 255, 255),//黑色thickness,lineType);
}void show(PedTree T){//利用opencv的函数非递归遍历树并画图输出 if(T){int thickness = 1,font_face = cv::FONT_HERSHEY_COMPLEX,i=0,x[100],y[100],z[100],top=0,windowwidth=600,j,k,m=0;Mat image=Mat::zeros(3*windowwidth,3*windowwidth,CV_8UC3);double font_scale =0.8;char ch[30];PedTree p;PedTree t[100],dd[100];dd[0]=T;t[0]=T;x[0]=4*windowwidth/5;y[0]=windowwidth/20;z[0]=1;while(top>=0){//只要栈非空p=t[top];top--;//弹栈for(j=0;j<i;j++){if(p==dd[j]){break;}}putTextZH(image, p->data.name, Point(x[j],y[j]), Scalar(0, 255, 255), 10, "华文行楷");if(strcmp(p->data.spouse,"0")!=0){putTextZH(image, p->data.spouse, Point(x[j],y[j]+windowwidth/60),Scalar(0, 255,255), 10, "华文行楷");}for(k=p->data.num-1;k>=0;k--){if(p->nextstr[k]){m++;i++;dd[i]=p->nextstr[k];z[i]=z[j]+1;y[i]=y[j]+windowwidth/20;x[i]=x[j]+4*(k*windowwidth-p->data.num*windowwidth/3)/pow(4.0,z[i]);DrawLine(image,Point(x[j]+windowwidth/40,y[j]+windowwidth/25),Point(x[i]+windowwidth/30,y[i]));top++;//t[top]=p->nextstr[k];//压栈}}m=0;}imshow("展示图",image);waitKey(0);}
}void OutAllPedTree(PedTree Tree){//输出整个家谱信息 int i,j;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(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(j=0;j<Tree->data.num;j++){OutOneInfor(Tree->nextstr[j]);}fflush(stdin);//清除键盘缓冲区 printf("\n\t\t按任意键继续:"); show(Tree); getch();
}void OutOneInfor(PedTree Tree){//递归调用实现输出整个家谱树 int i,j;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(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(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\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){//输出孩子信息 showchild(TempTree);}}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){//输出孩子信息 showchild(TempTree);}}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();
}void showchild(PedTree TempTree){//输出有关孩子的信息 int j;printf("\t\t孩子信息:\n");for(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");
} 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;}
}void delbtall(PedTree Tree){int i;if(Tree){for(i=0;i<Tree->data.num;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");}
}int SearchPedTree(PedTree Tree,char Name[],PedTree* DrawTree){//在树中查找int i;if(strcmp(Tree->data.name,Name)==0){ *DrawTree=Tree;return 1; } else{ for(i=0;i<Tree->data.num;i++){ if(SearchPedTree(Tree->nextstr[i],Name,DrawTree)){return 1; } } return 0;}
}int SearchPedTree2(PedTree Tree,char Name[],PedTree* DrawTree){//在树中查找配偶是否匹配 int i;if(strcmp(Tree->data.spouse,Name)==0){ *DrawTree=Tree;return 1; } else{ for(i=0;i<Tree->data.num;i++){if(SearchPedTree2(Tree->nextstr[i],Name,DrawTree)){return 1; }} return 0; }
}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==TempTree2->parent){//父母一样的情况 if(!strcmp(TempTree1->data.ldata,TempTree2->data.ldata)){printf("\n\t\t%s和%s是双胞胎",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的哥哥,%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的哥哥,%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的姐姐,%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的姐姐,%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&&TempTree2->parent->data.sex==1){//堂的 if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<=0){ 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)printf("\n\t\t%s是%s的堂哥",TempTree2->data.name,TempTree1->data.name);else if(TempTree1->data.sex==-1)printf("\n\t\t%s是%s的堂姐",TempTree2->data.name,TempTree1->data.name);}}else{//表的if(strcmp(TempTree1->data.ldata,TempTree2->data.ldata)<=0){if(TempTree1->data.sex==1)printf("\n\t\t%s是%s的表哥",TempTree1->data.name,TempTree2->data.name);elseprintf("\n\t\t%s是%s的表姐",TempTree1->data.name,TempTree2->data.name);}else{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的表姐",TempTree2->data.name,TempTree1->data.name);}}} }else if(temp1-temp2==-1){//差一辈 if(TempTree1==TempTree2->parent){//直系关系 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(TempTree2->parent->data.sex==1){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) 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==TempTree1->parent){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(TempTree1->parent->data.sex==1){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);}if(TempTree1->parent->data.sex==-1){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);elseprintf("\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);elseprintf("\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);elseprintf("\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);elseprintf("\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(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);elseprintf("\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);elseprintf("\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(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);elseprintf("\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);elseprintf("\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){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(SearchPedTree2(Tree,name1,&TempTree1)&&SearchPedTree2(Tree,name2,&TempTree2)){//都在配偶中查找到 temp1=TempTree1->data.dai;temp2=TempTree2->data.dai;if(temp1==temp2){//同辈 if(TempTree1->parent==TempTree2->parent){//两人配偶的父母一样 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==TempTree2->parent){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==TempTree1->parent){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==TempTree2->parent->parent){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==TempTree1->parent->parent){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==TempTree2->parent->parent->parent){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==TempTree1->parent->parent->parent){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){if(TempTree1->data.sex==1){if(TempTree2->data.sex==1) printf("\n\t\t%s的丈夫是%s的丈夫的祖先",name1,name2);elseprintf("\n\t\t%s的丈夫是%s的妻子的祖先",name1,name2);}else{if(TempTree2->data.sex==1) printf("\n\t\t%s的妻子是%s的丈夫的祖先",name1,name2);elseprintf("\n\t\t%s的妻子是%s的妻子的祖先",name1,name2);} }else{if(TempTree2->data.sex==1){if(TempTree1->data.sex==1) printf("\n\t\t%s的丈夫是%s的丈夫的祖先",name2,name1);elseprintf("\n\t\t%s的丈夫是%s的妻子的祖先",name2,name1);}else{if(TempTree1->data.sex==1) printf("\n\t\t%s的妻子是%s的丈夫的祖先",name2,name1);elseprintf("\n\t\t%s的妻子是%s的妻子的祖先",name2,name1);}}}}else if(SearchPedTree(Tree,name1,&TempTree1)&&SearchPedTree2(Tree,name2,&TempTree2)){//一个在树中查找到,一个在配偶中查找到if(TempTree2==TempTree1)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==TempTree2)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代成员 int i;if(Tree->data.dai==aa){if(strcmp(Tree->data.name,"0")){printf("\n\t\t姓名:%s\n",Tree->data.name);}if(Tree->data.sex==1){printf("\t\t姓别:男\n");}else if(Tree->data.sex==-1){printf("\t\t姓名:女\n");}if((!strcmp(Tree->data.spouse,"0"))&&strcmp(Tree->data.name,"0")){printf("\t\t婚姻状况:未婚\n");}else if(strcmp(Tree->data.spouse,"0")){printf("\t\t婚姻状况:和%s已结婚\n",Tree->data.spouse);}if(strcmp(Tree->data.adress,"0")){printf("\t\t住址:%s\n",Tree->data.adress);}if(Tree->data.alive==1){printf("\t\t健康在世\n");}else if(Tree->data.alive==-1){printf("\t\t去世时间:%s\n",Tree->data.pass); }}else{for(i=0;i<Tree->data.num;i++){Seach_all_n(Tree->nextstr[i],aa);}}
} void Seach_all_ldata(PedTree Tree,char *aa){int i;if((strcmp(Tree->data.ldata,aa)==0)||strcmp(Tree->data.ldata1,aa)==0){Flag++;      //判断有没有生日是aa的人 if(!strcmp(Tree->data.ldata,aa)){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")){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)){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);}}}for(i=0;i<Tree->data.num;i++){Seach_all_ldata(Tree->nextstr[i],aa);}
}int AddNewInfor(PedTree Tree){//添加新的家谱信息 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(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\t内存不足!\n"); exit(1); } ChildTree->parent=TempTree;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 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]; int flag=0; PedTree TempTree=NULL; printf("\n\t\t请输入要添加人的配偶的名字:"); scanf("%s",Name); if(!SearchPedTree(Tree,Name,&TempTree)){//在树中查找 printf("\n\n\t\t不存在该人!\n"); flag=1; } 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=1; } } 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");
}void ChangeInfor(PedTree Tree){//修改家谱信息 fflush(stdin);//清除键盘缓冲区 system("cls"); char Name[20]; char choice;int tempch,i; 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")){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")){strcpy(TempTree->data.ldata,TempData); }printf("\n\t\t请输入要修改人是否死亡(-1:死亡,1:活着,不需要修改则输入0)\n\t\t");  scanf("%d",&n); if(n){TempTree->data.alive=n;}printf("\n\t\t请输入要修改人的死亡日期:(不需要修改则输入0)\n\t\t");  scanf("%s",TempData); if(strcmp(TempData,"0")){strcpy(TempTree->data.pass,TempData);}fflush(stdin);//清除键盘缓冲区    printf("\n\t\t请输入要修改人的住址:(不需要修改则输入0)\n\t\t");  scanf("%s",TempData); if(strcmp(TempData,"0")){strcpy(TempTree->data.adress,TempData);}printf("\n\t\t----****---***---信息修改成功---***----****-----"); fflush(stdin);//清除键盘缓冲区 printf("\n\t\t按任意键继续:"); getch();  break; case '2': if(!TempTree->parent){printf("\n\t\t这是家族的第一个人,不存在父母的信息!\n"); }else{ printf("\n\t\t请输入该人与宗族有直接血缘关系的父母的姓名:(不需要修改则输入0)\n\t\t");scanf("%s",TempName); if(strcmp(TempName,"0")){strcpy(TempParent->data.name,TempName);}fflush(stdin);//清除键盘缓冲区printf("\n\t\t请输入该人与宗族有直接血缘关系的父母的配偶的姓名:(不需要修改则输入0)\n\t\t");scanf("%s",TempName); if(strcmp(TempName,"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")){strcpy(TempParent->data.ldata,TempData);}fflush(stdin);//清除键盘缓冲区printf("\n\t\t请输入该人与宗族有直接血缘关系的父母的配偶的出生日期:(不需要修改则输入0)\n\t\t");scanf("%s",TempData); if(strcmp(TempData,"0")){strcpy(TempParent->data.ldata1,TempData);}printf("\n\t\t请输入该人与宗族有直接血缘关系的父母是否死亡(-1:死亡,1:活着,不需要修改则输入0)\n\t\t");  scanf("%d",&n); if(n){TempParent->data.alive=n;}printf("\n\t\t请输入该人与宗族有直接血缘关系的父母的配偶是否死亡(-1:死亡,1:活着,不需要修改则输入0)\n\t\t");  scanf("%d",&n); if(n){TempParent->data.alive1=n;}printf("\n\t\t请输入要该人与宗族有直接血缘关系的父母的死亡日期:(不需要修改则输入0)\n\t\t");  scanf("%s",TempData); if(strcmp(TempData,"0")){strcpy(TempParent->data.pass,TempData);}fflush(stdin);//清除键盘缓冲区printf("\n\t\t请输入要该人与宗族有直接血缘关系的父母的配偶的死亡日期:(不需要修改则输入0)\n\t\t");  scanf("%s",TempData); if(strcmp(TempData,"0")){strcpy(TempParent->data.pass1,TempData);}fflush(stdin);//清除键盘缓冲区    printf("\n\t\t请输入该人的父母的住址:(不需要修改则输入0)\n\t\t");  scanf("%s",TempData); if(strcmp(TempData,"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(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")){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")){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){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")){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")){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(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")){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){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")){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")){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")){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){TempTree->data.alive1=n;}printf("\n\t\t请输入要修改人的死亡日期:(不需要修改则输入0)\n\t\t");  scanf("%s",TempData); if(strcmp(TempData,"0")){strcpy(TempTree->data.pass1,TempData);}fflush(stdin);//清除键盘缓冲区 printf("\n\t\t请输入要修改人的住址:(不需要修改则输入0)\n\t\t");  scanf("%s",TempData); if(strcmp(TempData,"0")){strcpy(TempTree->data.adress,TempData);}} printf("\n\t   ----****---***---信息修改成功---***----****-----"); fflush(stdin);//清除键盘缓冲区 printf("\n\t\t按任意键继续:"); getch(); break; case '6': return ; } }   }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");
}//共1646行

运行结果


总结

这题主要是比较繁琐,需要考虑的情况很多,其实难度不大。树的很多操作都可以递归实现,用递归可以简单很多。由于查找是在所有成员中查找,时间复杂度为O(n),可以给每个成员进行标号之类的操作,将查找的时间复杂度降为O(logn)。头一次自己写头文件来解决问题,感觉自己变厉害了很多。

数据结构实战(十)——家谱管理系统相关推荐

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

    1.任务简述: 实现具有下列功能的家谱管理系统. 要求: (1)输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名.出生日期.婚否.地址.健在否.死亡日期(若其已死亡),也可附加 ...

  2. c语言二叉树族谱管理系统,数据结构课程设计报告(用二叉树实现家谱管理系统).doc...

    数据结构课程设计 题目:用二叉树实现家谱管理系统 姓名:郭志超 学号:031010151554042 完成日期:2005.7.3 一.需求分析 ??建立输入文件以存放最初家谱中各成员的信息. ??成员 ...

  3. 用c语言如何以图形方式显示家谱,数据结构_家谱管理系统

    C语言 家谱管理系统 /*7.家谱管理系统 (4) 任务:实现具有下列功能的家谱管理系统 功能要求: 1). 输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容: 姓名.出生日期.婚否 ...

  4. 数据结构——家谱管理系统

    一.功能要求 (1)用缩进表示法输出家谱二叉树 (2)查找某人所有的儿子 (3)查找某人所有的祖先 二.功能模块图 三.测试分析 系统界面 建立家谱 查询家谱树 查询儿子 查询祖先 退出页面 不合理数 ...

  5. 数据结构课程设计代码-家谱管理系统

    头文件(head.h) /*********************************************************** *版权所有(C)2017,于子淇,黄潇慧 张昕 * * ...

  6. 数据结构课设之家谱管理系统

    Copyright© 2017,烟台大学计算机与控制工程学院 All rights reserved. 文件名称:text.cpp 作者:黄某某 完成日期:2017年12月21日 版本:vc6.0 问 ...

  7. 家谱宗族网站源码_家谱管理系统(源代码)

    家谱管理系统 -- C 语言(数据结构) 目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间 的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结 构的知识:使学 ...

  8. 家族查询系统c语言源程序,家谱管理系统(含源代码).docx

    家谱管理系统(含源代码) 家谱管理系统--C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结 ...

  9. 家谱管理系统c++实现

    1.背景 家谱:又称族谱.宗谱等.是一种以表谱形式,记载一个家族的世系繁衍及重要人物事迹的书.皇帝的家谱称玉牒,如新朝玉牒.皇宋玉牒.它以记载父系家族世系.人物为中心,由正史中的帝王本纪及王侯列传.年 ...

最新文章

  1. java 使用正则表达式过滤HTML中标签
  2. 皮一皮:感受下什么叫瑟瑟发抖的寒冬...
  3. 我参与阿里巴巴 ASoC-Seata 的一些感悟
  4. Smart Form不弹出假脱机设置界面直接打印预览
  5. 26句话让你的人际关系更上一层楼!
  6. yum安装nginx php mysql_yum安装nginx+mysql+php
  7. 解决Java compiler level does not match the version of the installed Java project facet.问题
  8. 电脑版微信发消息转圈圈
  9. 罗技无法使用计算机上的配置文件,Win10专业版罗技无线鼠标无法使用咋办?
  10. 快捷键: Windows下利用微信快速截图
  11. eth0 eth0:1 eth0.1 的区别
  12. 400多个JavaScript特效大全
  13. 化繁从简,别让思维打了结
  14. java中的gc是什么意思的缩写_gc是什么意思(gc是什么意思的缩写)
  15. Mc1.16forge官混教程/教补-#3 物品材质覆盖注意要点[分支1]
  16. NOIP2012 提高组 Day 2
  17. Redis基础与高可用集群架构进阶详解
  18. CSP漫画工作室clipstudiopaint最新版本2022功能介绍
  19. Linux cat命令学习
  20. 安装 arm nginx aarch64

热门文章

  1. Unix/Linux编程:getcontext、setcontext
  2. JSP及MVC三层架构
  3. Adobe XMP SDK项目应用(续2)
  4. linux系统下的程序开发报告册,linux系统及其应用(应用开发)实验报告册.doc
  5. lstrcpyn和strncpy
  6. 卷积神经网络( CNN)与全卷积神经网络(FCN)
  7. 浙大PTA数据结构与算法题目集(中文)题解集复习用
  8. Coin-row problem
  9. html遍历map,forEach()方法遍历map()方法数组遍历
  10. 【Spring Web教程】SpringBoot 实现一应用多端口