//要求:家谱用于记录某家族历代家族成员的情况与关系。现编制一个家谱资料管理软件,
//实现对一个家族所有的资料进行收集整理。支持对家谱的增加,删除,更新,统计等。
/////////////////////////////////////////////////////////////////////////////// #include 几个儿女 名 char Kind; //标示节点的种类char Name[20]; //记录这个人的姓 有女G男B struct TreeNode * NextNode[20]; //记录这个人的儿 女 struct TreeNode * Parent; //记录这个节点的父 节点 }TreeNode; void CreatTree(TreeNode *Tree); void OutPutAll(TreeNode *Tree); TreeNode * SearchTree(TreeNode *Tree,char name[],int length); void MainMenue(TreeNode *Tree); void SubMenue1(TreeNode * Tree); void SubMenue2(TreeNode *Tree); void Change(TreeNode * Tree); void AddNew(TreeNode * Tree); void OutPutMessage(TreeNode * Tree,char name[],int length); //主函数 void main() { TreeNode *Tree; Tree=(TreeNode *)malloc(sizeof(TreeNode)); Tree—〉Parent =NULL; strcpy(Tree—〉Name,\"0\"); MainMenue(Tree); } //添加新的成员 void AddNew(TreeNode * Tree) { } //输出副菜单 void SubMenue2(TreeNode *Tree) { char c; int num; char name[20]; TreeNode * NewNode; getchar(); while(1) { system(\"cls\"); printf(\"\\"); SubMenue2(Tree); printf(”\\n\\n\ —--*****—--请选择你 的操作—--****——- ”); printf(\"\\n\——-*——-*—--*———A:添加某个 人的子女的信息——-*——-*—--*-——*-——- ”); printf(”\\n\———*——-*———*---B:添加某 个人配偶的信息—*—-—*———*—-—*———*———— \"); printf(\"\\n\———*———*———*--—C:退出— *---*——-*———*———*——-*--—*-—-*———*————\\n\”); c=getchar(); switch(c) { case ’A': printf(”\\n\\n\请输入那个人的名字:\\n\\"); scanf(\"%s\",name); Tree=SearchTree(Tree,name,20); if(Tree==NULL) { printf(\"\\n\\n\****该家谱图中没有%s这个 人的信息请确认是否输入错误*****\\n”,name); } if(Tree—〉Parent==NULL&&Tree—〉NextNodebreak; [0]==NULL||Tree—〉Parent!=NULL&&Tree-〉 Name!=Tree—〉Parent—〉NextNode[0]—〉Name) { printf(”\\n\\n\%s至今还没有配偶请先添加配 偶\",Tree—〉Name); } if(Tree-〉Parent==NULL&&(Tree-〉Num>20||Tree-〉break; Num<0)) Tree->Num=0; if(MATEFLAG==1) Tree=Tree-〉Parent; NewNode=(TreeNode *)malloc(sizeof(TreeNode)); printf(”\\n\\n\请输入添加人员姓名:\\n\\"); scanf(”%s”,NewNode-〉Name); printf(”\\n\\n\请输入添加人员性别女G男B: \\n\”); scanf(”%1s\&NewNode->Kind); num=Tree-〉Num; NewNode—>NextNode[0]=(TreeNode *)malloc (sizeof(TreeNode)); NewNode->NextNode[0]=NULL; NewNode-〉Num=0; NewNode—>Parent=Tree; Tree—>NextNode[num+1]=NewNode; Tree—〉Num=Tree—〉Num+1; printf(”\\n\\n\——-———————--—子女的 信息添加成功—--—————---——--—”); break; case ’B': printf(”\\n\\n\请输入那个人的名字:\\n\”); scanf(\"%s”,name); Tree=SearchTree(Tree,name,20); if(Tree->Parent!=NULL&&strcmp(Tree—〉Name, Tree—>Parent-〉NextNode[0]-〉Name)==0||Tree—〉NextNode[0]!=NULL) { } if(Tree==NULL) { printf(”\\n\\n\****该家谱图中没有%s这个printf(”\\n\\n\已经有了配偶”); break; 人的信息请确认是否输入错误*****\\n\",name); break; } NewNode=(TreeNode *)malloc(sizeof (TreeNode)); printf(\"\\n\\n\请输入添加人员姓名:\\n\”); scanf(\"%s”,NewNode—>Name); printf(”\\n\\n\请输入添加人员性别女G男B: \\n\”); scanf(”%1s\",&NewNode—>Kind); NewNode—〉Parent=Tree; Tree-〉NextNode[0]=NewNode; break; case 'C’: printf(\"\\n\\n\—————-————---—-—本项服 务到此结束-————--——————-———”); break; case ’\\n’: break; default: printf(\"\\n\\n\—-———-——对不起!你的选择不在 服务范围之内!—-——---—— ”); printf(\"\\n\——-—-——————请您再次选择所 需的服务项!-———-——-——--— ”); printf(\"\\n\-———--——————————-—谢 谢合作!---———————--——-----———\\n\”); } if (c==’C’||c==’c') //?? break; break; printf(”\\n\\n\——------—-——--请按Enter键继续 操作——-—-——---—--—\"); } //修改某个人的信息 void Change(TreeNode * Tree) { char name[20]; TreeNode * NewNode; printf(\"\\n\请输入你要修改的人的信息:\\n\”); } getchar(); getchar(); scanf(”%s\",name); NewNode=SearchTree(Tree,name,20); if(NewNode==NULL) { printf(”\\n\\n\****该家谱图中没有%s这个人的信 息请确认是否输入错误*****\\n”,name); } //输出副菜单 void SubMenue1(TreeNode * Tree) { char c; int flag,i; char name[20]; char Parent[2][20]; TreeNode * NewNode; getchar(); while(1) { system(”cls\"); printf(”\”); } else { } SubMenue1(NewNode); return; printf(”\\n\\n\ --—*****—-—请选择 你的操作—-—****--- \"); printf(\"\\n\-—-*—-—*-——*——-A:修改个人的信 息-—-*--—*-—-*———*—-—*——-*———— ”); printf(”\\n\-—-*—--*—--*---B:修改父母的信息— --*—-—*—-—*——-*———*—-—*——-- \"); printf(”\\n\-—-*—-—*---*—--C:修改兄弟姐妹的 信息——-*-—-*——-*-——*———*—-—- ”); printf(\"\\n\—--*—-—*—-—*—-—D:修改子女的 信息-——*———*——-*-——*-—-*——-*———— \"); printf(”\\n\——-*-—-*———*---E:修改配偶的信 息-——*-——*-—-*—--*-——*--—*—--— ”); printf(”\\n\———*——-*-—-*———F:退出— *--—*-—-*-—-*-—-*-——*-—-*———*———*—---\\n\”); c=getchar(); switch(c) { case ’A’: printf(\"\\n\\n\请输入修改的姓名:如果不需要修 改就输入‘0’然后按Enter键继续\\n\”); scanf(”%s”,name); if(strcmp(name,”0”)!=0) strcpy(Tree-〉Name,name); printf(”\\n\\n\是否要修改性别:如果需要就输入’1’ 不需要修改就输入’0'然后按Enter键继续\\n\”); scanf(”%d”,&flag); if (flag==1) { } printf(”\\n\\n\个人信息修改成功”); break; if(Tree—〉Kind==’G’||Tree-〉Kind==’g’) Tree—〉Kind='B'; else Tree->Kind=’G’; case 'B’: if(Tree—〉Parent==NULL) //判断是不是头节点 { printf(”\\n\是这个家谱图里最顶端的人没有父 母信息!”,name); break; } if (MATEFLAG==1) //判断是不是入赘或加入此间的 { if(Tree-〉Kind==’G'||Tree—〉Kind==’g’) { printf(\"\\n\\n\她是嫁入此间的所以父母信息 不在家谱内包括\"); } else { printf(”\\n\\n\他是入赘此间的所以父母信息 不在家谱内包括\"); } if ( Tree-〉 Parent-〉 Kind=='G’ | } break; |Tree—>Parent—>Kind==’g') { } else strcpy(Parent[0],”母亲”); strcpy(Parent[1],”父亲\"); { } printf(”\\n\\n\请输入%s要修改的姓名:如果不strcpy(Parent[0],”父亲”); strcpy(Parent[1],\"母亲\"); 需要修改就输入‘0’然后按Enter键继续\\n\”,Parent[0]); scanf(”%s”,name); if(strcmp(name,”0\")!=0) strcpy(Tree—〉Parent—>Name,name); printf(\"\\n\\n\请输入%s要修改的姓名:如果不需要 修改就输入‘0’然后按Enter键继续\\n\”,Parent[1]); scanf(”%s\",name); if(strcmp(name,”0”)!=0) strcpy(Tree—〉Parent—〉NextNode[0]-〉Name, name); printf(\"\\n\\n\——-—-——————-—父母的信 息修改成功——————-———--——-—\"); break; case ’C’: NewNode=Tree-〉Parent; if(NewNode==NULL) //判断是不是头节点 { printf(”\\n\是这个家谱图里最顶端的人没有兄 弟姐妹信息!\); break; } if (MATEFLAG==1) //判断是不是入赘或加入此间的 { if(Tree—〉Kind=='G’||Tree-〉Kind==’g') { printf(”\\n\\n\她是嫁入此间的所以兄弟姐妹 信息不在家谱内包括\"); } else { printf(”\\n\\n\他是入赘此间的所以兄弟姐 妹信息不在家谱内包括\"); } if(NewNode-〉Num==1) { } break; } printf(”\\n\\n\没有兄弟姐妹\"); break; else { for(i=1;i<=NewNode->Num;i++) { if(NewNode—〉NextNode[i]—〉Name! =Tree->Name) { printf(\"\\n\\n\请输入%s修改的姓名:如 果不需要修改就输入‘0’然后按Enter键继续\\n\”,NewNode—>NextNode[i]—〉Name); scanf(”%s”,name); if(strcmp(name,\"0\")!=0) strcpy(NewNode—〉NextNode [i]—>Name,name); printf(\"\\n\\n\是否要修改性别:如果需要 就输入’1’不需要修改就输入’0'然后按Enter键继续\\n\”); scanf(\"%d”,&flag); if (flag==1) { if(NewNode—>NextNode[i] ->Kind==’G'||NewNode->NextNode[i]—〉Kind=='g') NewNode—〉NextNode[i] —>Kind=’B’; else NewNode-〉 NextNode[i]—>Kind='G’; } } } } printf(”\\n\\n\—-——--——-—--兄弟姐妹的信息 修改成功—-————-—————-”); break; case ’D': if(Tree->Num==0) { } if (Tree->Parent !=NULL) if (strcmp(Tree->Name,Tree—〉Parentprintf(”\\n\\n\至今还没有子女”); break; —>NextNode[0]—〉Name)==0) //如果他是入赘或 者是嫁入的就需用配偶节点完成修改 { } Tree=Tree—〉Parent; for(i=1;i〈=Tree—〉Num;i++) { printf(”\\n\\n\请输入%s修改的姓名:如果不 需要修改就输入‘0'然后按Enter键继续\\n\”,Tree—>NextNode[i]—〉Name); scanf(\"%s”,name); if(strcmp(name,”0”)!=0) strcpy(Tree-〉NextNode[i]—〉Name,name); printf(”\\n\\n\是否要修改性别:如果需要就输 入'1’不需要修改就输入’0’然后按Enter键继续\\n\”); scanf(\"%d”,&flag); if (flag==1) { if(Tree—〉NextNode[i]-〉Kind==’G’|| Tree->NextNode[i]—〉Kind=='g’) } Tree->NextNode[i]-〉Kind='B’; else Tree—〉NextNode[i]—〉Kind=’G’; } printf(”\\n\\n\——-———-—-————-—子女的 信息修改成功----—-——---——--—”); break; case 'E’: if(Tree—>Parent!=NULL) { if (Tree—〉NextNode[0]==NULL&& strcmp(Tree->Name,Tree—〉Parent-〉NextNode[0]—〉Name)!=0) { } if (strcmp(Tree—〉Name,Tree—〉Parent-〉printf(”\\n\\n\至今还没有配偶”); break; NextNode[0]—〉Name)==0) { printf(\"\\n\\n\请输入%s修改的姓名:如果 不需要修改就输入‘0’然后按Enter键继续\\n\\",Tree-〉Parent—〉Name); scanf(\"%s”,name); if(strcmp(name,\"0”)!=0) strcpy(Tree->Parent—〉Name,name); } else { printf(”\\n\\n\请输入%s修改的姓名:如果 不需要修改就输入‘0’然后按Enter键继续\\n\”,Tree—>NextNode[0]—>Name); } else { if(Tree-〉NextNode[0]==NULL) printf(”\\n\\n\至今还没有配偶\"); } scanf(”%s\ if(strcmp(name,\"0”)!=0) strcpy(Tree-〉NextNode[0]-〉Name,name); else { printf(”\\n\\n\请输入%s修改的姓名:如果 不需要修改就输入‘0’然后按Enter键继续\\n\\",Tree—〉NextNode[0]—〉Name); scanf(\"%s”,name); if(strcmp(name,”0”)!=0) strcpy(Tree->NextNode[0]->Name, name); } } printf(”\\n\\n\————--—-———-———配偶的 信息修改成功--—-——---—-—————”); break; case 'F’: printf(”\\n\\n\———-———-—-—-—--—本项服 务到此结束----——--———-—————”); break; case ’\\n': break; default: printf(”\\n\\n\——---———对不起!你的选择不 在服务范围之内!-——----—-”); printf(\"\\n\-—-———-————请您再次选择所需 的服务项!—————-—-—-—-—”); printf(”\\n\-——-—--——----———-—谢谢合作! ————-—----—---————--——\\n\”); } break; if (c=='F’||c==’f’) break; printf(\"\\n\\n\—-——------—-——请按Enter键继续 操作———-—--————---”); } //输出主菜单 void MainMenue(TreeNode *Tree) { char c; char name[20]; while(1) { system(”cls\"); printf(”\”); } getchar(); getchar(); printf(\"\\n\\n\ —-—*****——-请选择你 的操作———****-——”); printf(”\\n\———-—————-—---A:输入家谱信息 建立多叉树—-————————-—--———-———-\"); printf(”\\n\-—-————-——————B:在家族中 查找某人并输出他或(她)的相应信息——-—”); printf(\"\\n\—-—-——-———---—C:添加新的成员-— ———--—--—--——-—————————-———-—-”); printf(”\\n\—-———-——————-—D:输出整个 家谱信息——-—-—----————-—---——--——--—”); printf(\"\\n\—————————-—---E:修改某个人 的信息-——--——--—---——---—---—---——”); printf(”\\n\-————--——————-F:退出整个程 序-———-—---——-—--———-—---——-——————\\n\\"); c=getchar(); switch(c) { case 'A’: TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode)); printf(”\\n\请输入姓名:\\n\”); scanf(”%s”,Tree-〉Name); printf(\"\\n\请输入性别女G男B:\\n\\"); getchar(); scanf(”%c”,&(Tree->Kind)); Tree—>Parent=NewNode; Tree->Parent=NULL; CreatTree(Tree); printf(”\\n\———--——-—-—-—-家谱图已经建 立成功-—-—--——-——--——\\n\\n”); printf(\"\\n\\n\—----——-—-————请按Enter键 继续操作—-————--————-—\"); getchar(); break; case 'B': if(strcmp(Tree—〉Name,”0\")==0) { printf(”\\n\家谱图的多叉树尚未建立请先建立 树\\n\"); } printf(”\\n\请输入你要查找的人的姓名:\\n\\"); scanf(\"%s”,name); OutPutMessage(SearchTree(Tree,name,20),name,getchar(); break; 20); printf(”\\n\\n\-—-—-*---—*—-——* * -——-*———-* ——--*——-— * -—-—*———- ————*-———\\n\”); getchar(); break; case 'C': if(strcmp(Tree->Name,”0\")==0) { printf(”\\n\家谱图的多叉树尚未建立请先建立 树\\n”); } AddNew(Tree); getchar(); break; getchar(); break; case ’D’: if(strcmp(Tree—>Name,”0”)==0) { printf(”\\n\家谱图的多叉树尚未建立请先建 立树\\n\"); getchar(); } break; printf(”\\n\\n\整个家谱的主要信息如下:”); OutPutAll(Tree); getchar(); break; case ’E’: if(strcmp(Tree-〉Name,\"0\")==0) { printf(”\\n\家谱图的多叉树尚未建立请先建 立树\\n”); } Change(Tree); getchar(); break; getchar(); break; case ’F’: printf(”\\n\\n\-—----—-—--—-—--—本次服务到此结 束—-———--———-——-—--—\"); printf(\"\\n\——-——-—————-————--欢迎 下次使用—--—-—————-—-———-——--\"); printf(\"\\n\———--—————————-——-— --—谢谢-———--——-—-—-—————-——————\\n\\n”); break; case '\\n': break; default: printf(\"\\n\\n\--————-—对不起!你的选择不在 服务范围之内!————--—-—--\"); printf(”\\n\—-—---—--—-请您再次选择所需的服 务项!---———————--—--\"); printf(”\\n\-——-—--—-—-—----—-谢谢合作!— ---—-——-—--—---—-————-—\\n\”); } //创建树 } } if (c==’F'||c==’f’) break; getchar(); break; getchar(); void CreatTree(TreeNode *Node) { int i; TreeNode *NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode)); Node-〉NextNode[0]=NewNode; Node-〉NextNode[0]=NULL; //Node->Parent =NULL; printf(\"\\n\请输入%s的子女的数目:\\n\”,Node-〉 Name); scanf(”%d\&(Node—〉Num)); printf(”\\n\请输入%s的配偶的姓名:\\n\”, Node->Name); scanf(\"%s”,NewNode->Name); if((Node—>Num)==0&&strcmp(NewNode—>Name, \"0\")==0) return ; if (Node—>Kind==’G'||Node—>Kind==’g’) NewNode-〉Kind=’B’; else NewNode->Kind=’G’; NewNode—>Num=0; NewNode—>NextNode[0]=NULL; Node—〉NextNode[0]=NewNode; Node—〉NextNode[0]—>Parent=Node; for(i=1;i<=Node—〉Num;i++) { NewNode=(TreeNode *)malloc(sizeof(TreeNode)); printf(”\\n\请输入%s的第%d子女的名字\\n\\",Node —〉Name,i); scanf(\"%s”,NewNode-〉Name); printf(”\\n\请输入%s的第%d子女的性别女G男B: \\n\\",Node—>Name,i); } //遍历并输出树中的内容 void OutPutAll(TreeNode *Tree) { } getchar(); scanf(\"%c”,&NewNode->Kind); NewNode-〉Num=0; NewNode->Parent=Node; Node-〉NextNode[i]=NewNode; CreatTree(Node->NextNode[i]); int i, flag=0; printf(”\\n\———****-—-***———***———*** -—-***-——***——-***-——***-——***——-”); printf(”\\n\姓名:%s 性别:”,Tree—>Name); if (Tree-〉Kind==’G'||Tree->Kind==’g’) { } else printf(\"男”); flag=1; printf(”女”); if (!(Tree—〉NextNode[0])) { } printf(”\\n\至今没有配偶和子女\\n”); return; if(flag==1) printf(”\\n\丈夫 姓名:%s\",Tree-〉NextNode[0] —〉Name); else printf(”\\n\妻子 姓名:%s\",Tree-〉NextNode[0] —>Name); for(i=1;i〈=Tree—>Num;i++) { printf(”\\n\第%d个子女的姓名:%s 性别:”,i,Tree —〉NextNode[i]-〉Name,Tree—〉NextNode[i]-〉Kind); if (Tree—〉NextNode[i]—〉Kind==’G’||Tree-〉 NextNode[i]—〉Kind==’g’) } //在树中经过遍历查找某个人 TreeNode * SearchTree(TreeNode *Tree,char name[],int length) { int i; } printf(”\\n\”); for(i=1;i〈=Tree-〉Num;i++) { } OutPutAll(Tree->NextNode[i]); printf(\"女\"); else printf(\"男”); TreeNode *NewNode; if(strcmp(Tree-〉Name,name)==0) { if(length==0) MATEFLAG=1; } if(Tree—〉NextNode[0]==NULL) return NULL; else MATEFLAG=0; return Tree; for(i=0;i<=Tree-〉Num;i++) { if (i==0) NewNode=SearchTree(Tree—>NextNode[i],name, 0); else NewNode=SearchTree(Tree—>NextNode[i],name, 20); if (NewNode!=NULL) return NewNode; } } return NULL; //输出已经查找到的人的信息 void OutPutMessage(TreeNode * Tree,char name[],int length) { int flag=0,i; TreeNode *NewNode; * —---*——-— ** printf(\"\\n\\n\———-— * -———*--—-*—-———--—*--—-\"); if(Tree==NULL) { ———-*—-——*—-—— printf(”\\n\\n\****该家谱图中没有%s这个人的 信息请确认是否输入错误*****\\n”,name); return; } printf(”\\n\\n\您所要找的人已经找到信息如下所 示:”); printf(”\\n\\n\姓名:%s\性别:”,name); if (Tree-〉Kind=='G'||Tree-〉Kind==’g’) { flag=1; //标记他(她)的性别 } else printf(”男”); printf(”女”); NewNode=Tree—〉Parent; if (MATEFLAG==1) { if(flag==1) { printf(”\\n\\n\她是嫁入此间的所以父母信息不 在家谱内包括\"); printf(”\\n\丈夫 姓名:%s”,NewNode—〉 Name); } else { printf(”\\n\\n\他是入赘此间的所以父母信息不 在家谱内包括”); printf(\"\\n\妻子 姓名:%s”,NewNode —>Name); } if ( ( NewNode — >Num)>0) //判断他(她)是否有孩子 { printf(”\\n\的孩子的信息如下:”); //输出他(她)的孩子的信息 for(i=1;i〈=NewNode—〉Num;i++) { printf(\"\\n\ 姓 名 : % s 性 别:”,NewNode->NextNode[i]—>Name); if (NewNode-〉NextNode[i]—〉Kind=='G’| |NewNode—〉Kind=='g') } if(NewNode==NULL) //判断 } return; } printf(”女”); else printf(\"男\"); 它是不是根节点如果是的话就没有父母兄弟信息 printf(\"\\n\是这个家谱图里最顶端的人没有父母和 兄弟姐妹信息!”,name); else { if (NewNode—>Kind=='G’||NewNode-〉Kind==’ g’) //判断父亲节点是父亲还是母亲 { //输出他(她) 的父母亲的信息 printf(”\\n\母亲 姓名:%s\ —>Name); printf(\"\\n\父亲 姓名:%s\",NewNode —>NextNode[0]—>Name); } else { printf(”\\n\母亲 姓名:%s”,NewNode-〉 NextNode[0]—〉Name); } if ( NewNode — 〉 Num 〉 1 printf(\"\\n\父亲 姓名:%s”,NewNode-〉Name); ) //判断他(她)是否有兄弟姐妹 { //输出他(她) 的兄弟姐妹的信息 printf(”\\n\%s的兄弟姐妹信息如下:\); for(i=1;i〈=NewNode-〉Num;i++) { if(NewNode—>NextNode[i]) printf(\"\\n\%s姓名:%s 性别:\", NewNode—〉NextNode[i]—〉Name,NewNode->NextNode[i]—〉Name); if ( NewNode->NextNode[i ] ->Kind==’G’||Tree—〉Kind==’g') } if(Tree->NextNode[0]!=NULL) } else printf(\"\\n\%s没有兄弟姐妹!”,Tree—>Name); } printf(\"女”); else printf(\"男”); //判断他(她)是否有配偶 { //输出他(她)的配偶的信息 if(flag==1) printf(”\\n\丈夫 姓名:%s”,Tree-〉NextNode[0] —〉Name); else printf(”\\n\妻子 姓名:%s\",Tree->NextNode [0]—〉Name); if ( Tree — 〉 Num>0 ) //判断他(她)是否有孩子 { printf(\"\\n\的孩子的信息如下:”); // 输出他(她)的孩子的信息 for(i=1;i〈=Tree—>Num;i++) { printf(”\\n\姓名:%s 性别:”,Tree —>NextNode[i]->Name); if (Tree—〉NextNode[i]-〉Kind==’G’|| Tree—>Kind==’g’) } printf(\"女\"); else printf(”男”); } } else printf(”\\n\%s至今还没有孩子\ else printf(”\\n\%s至今还没有配偶和孩子\\n”, Tree->Name); } 因篇幅问题不能全部显示,请点此查看更多更全内容