C语言二叉树家谱管理系统

合集下载

家谱管理系统c语言课程设计

家谱管理系统c语言课程设计

家谱管理系统c语言课程设计一、教学目标本课程旨在通过家谱管理系统课程设计,让学生掌握C语言的基本语法、数据结构、算法以及程序设计的基本方法。

在知识目标方面,学生需要理解C语言的编程概念,掌握家谱数据结构的设计与实现,以及熟悉家谱管理系统的开发流程。

在技能目标方面,学生应具备C语言编程能力,能够独立设计并实现一个简单家谱管理系统。

在情感态度价值观目标方面,学生应培养对计算机科学的兴趣,增强问题解决能力和团队合作意识。

二、教学内容本课程的教学内容主要包括C语言基础知识、家谱数据结构设计与实现、家谱管理系统设计与实现三部分。

C语言基础知识涵盖数据类型、运算符、控制结构、函数等基本概念。

家谱数据结构设计与实现部分包括家族树、家族成员信息表等数据结构的设计,以及相关算法的实现。

家谱管理系统设计与实现部分则涵盖系统需求分析、系统设计、系统实现与测试等环节。

三、教学方法为提高学生学习兴趣和主动性,本课程将采用讲授法、讨论法、案例分析法和实验法等多种教学方法。

讲授法用于传授C语言基本概念和编程技巧;讨论法用于引导学生探讨家谱管理系统的设计与实现问题;案例分析法用于分析实际编程过程中可能遇到的问题;实验法则让学生通过动手实践,加深对知识的理解和技能的掌握。

四、教学资源本课程所需教学资源包括教材、参考书、多媒体资料和实验设备。

教材选用《C程序设计语言》作为主教材,参考书包括《C Primer Plus》等。

多媒体资料包括课件、教学视频等,用于辅助课堂教学。

实验设备包括计算机、网络等,用于开展实验教学。

此外,还将提供在线编程平台,让学生在线编写代码、调试程序,提高编程能力。

五、教学评估本课程的教学评估将采取多元化方式,以全面、公正地评价学生的学习成果。

评估内容包括平时表现、作业、实验和期末考试四个方面。

平时表现主要评估学生的课堂参与度、提问与回答问题的情况;作业则主要评估学生对C语言基础知识和编程技巧的掌握;实验评估学生的动手实践能力,要求学生独立完成家谱管理系统的设计与实现;期末考试则全面测试学生的知识掌握和编程能力。

家谱的设计与实现(二叉树)

家谱的设计与实现(二叉树)

家谱的设计与实现(树,查找)家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。

可。

基本功能如下:(1)家谱中每个成员的信息包括:姓名、性别。

(2)家谱祖先数据的录入(树的根结点)。

(3)家庭成员的添加:即添加某人的儿女(包括姓名和性别),儿女的数目由控制台端给出,然后输入相应的儿女姓名和性别(此处所有儿女的姓名不能重名)。

(4)家庭成员的修改:可以修改某一成员的姓名。

(5)家庭成员的查询:查询某一成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。

(6)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后代成员。

#include <stdio.h>#include <malloc.h>#include <string>#include <stdlib.h>#define MAX 10typedef struct node{ //定义data存储结构char name[MAX]; //姓名char sex; //性别int generation;//代目}node;typedef struct ft{ //创建结构体struct node l; //家谱中直系家属struct ft *brother;//用来指向兄弟struct ft *child;//用来指向孩子}ft;ft *root; //root是结构体ft的指针ft *search(ft *p,char ch[]) // 搜索指针函数{ft *q;if(p==NULL)return NULL;//没有家谱,头指针下为空if(strcmpi(p->,ch)==0)return p;//家谱不为空,头指针下有这个人if(p->brother){q=search(p->brother,ch);//在兄弟中找if(q)return q;//找到}if(p->child){q=search(p->child,ch);//在孩子中找if(q!=NULL)return q;}return NULL;//没有找到}ft *parent(ft *p,ft *q,int *flag) //通过parent函数得到双亲结点。

家谱管理系统(含源代码)

家谱管理系统(含源代码)

家谱管理系统——C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。

排答疑和辅导。

完整代码:#include <stdio.h>#include <stdlib.h>#include <string.h>int MATEFLAG=0; //是否入赘或嫁入这家的,1表示为是,0表示否typedef struct TreeNode//树节点定义{int Num; //保存此人儿女个数char Name[20]; //保存此人姓名char Kind; //保存此人性别,男M,女Fstruct TreeNode * NextNode[20]; //保存此人的儿女,NextNode[0]里存放配偶的地址struct TreeNode * Parent; //保存此节点的父节点}TreeNode;void CreatTree(TreeNode *Tree);//创建树void OutPutAll(TreeNode *Tree);//输出树TreeNode * SearchTree(TreeNode *Tree,char name[],int length);void MainMenu(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");MainMenu(Tree);//显示主菜单}//添加新的成员void AddNew(TreeNode * Tree){SubMenue2(Tree);//添加新成员界面}//显示添加家庭信息的界面void SubMenue2(TreeNode *Tree){char c;int num;char name[20];TreeNode * NewNode;getchar();while(1){system("cls");printf("请选择你的操作\n");printf("A:添加某个人的子女的信息\n");printf("B:添加某个人配偶的信息\n");printf("C:退出\n");printf("请选择相应功能:\n");c=getchar();switch(c){case 'A': //添加子女信息printf("请输入那个人的名字:\n");scanf("%s",name);Tree=SearchTree(Tree,name,20);//在家谱里查找这个人if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);break;}if(Tree->Parent==NULL&&Tree->NextNode[0]==NULL||Tree->Parent!=NULL&&Tree->N ame!=Tree->Parent->NextNode[0]->Name){printf("至今还没有配偶请先添加配偶\n",Tree->Name);break;}if(Tree->Parent==NULL&&(Tree->Num>20||Tree->Num<0))Tree->Num=0;if(MATEFLAG==1)Tree=Tree->Parent;NewNode=(TreeNode *)malloc(sizeof(TreeNode));printf("请输入添加人员姓名:\n");scanf("%s",NewNode->Name);printf("请输入添加人员性别女F男M:\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");break;case 'B':printf("请输入那个人的名字:\n");scanf("%s",name);Tree=SearchTree(Tree,name,20);if(Tree->Parent!=NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0||T ree->NextNode[0]!=NULL){printf("已经有了配偶\n");break;}if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认\n",name);break;}NewNode=(TreeNode *)malloc(sizeof(TreeNode));printf("请输入添加人员姓名:\n");scanf("%s",NewNode->Name);printf("请输入添加人员性别女F男M:\n");scanf("%1s",&NewNode->Kind);NewNode->Parent=Tree;Tree->NextNode[0]=NewNode;break;case 'C':printf("本项服务到此结束\n");break;case '\n':break;default:printf("对不起!你的选择错误\n");break;}if (c=='C'||c=='c')break;printf("请按Enter键继续操作\n");getchar();getchar();}}//修改某个人的信息void Change(TreeNode * Tree){char name[20];TreeNode * NewNode;printf("请输入你要修改的人的信息:\n");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name); return;}else{SubMenue1(NewNode);}}//输出副菜单void SubMenue1(TreeNode * Tree){char c;int flag,i;char name[20];char Parent[2][20];TreeNode * NewNode;getchar();while(1){system("cls");printf("请选择你的操作\n");printf("A:修改个人的信息\n");printf("B:修改父母的信息\n");printf("C:修改兄弟姐妹的信息\n");printf("D:修改子女的信息\n");printf("E:修改配偶的信息\n");printf("F:退出\n");c=getchar();switch(c){case 'A':printf("请输入修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n");scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(Tree->Kind=='F'||Tree->Kind=='f')Tree->Kind='M';else Tree->Kind='F';}printf("个人信息修改成功\n");break;case 'B':if(Tree->Parent==NULL) //判断是不是头节点{printf("是这个家谱图里最顶端的人没有父母信息!\n",name);break;}if (MATEFLAG==1) //判断是不是入赘或加入此间的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以父母信息不在家谱内包括\n");}else{printf("他是入赘此间的所以父母信息不在家谱内包括\n");}break;}if(Tree->Parent->Kind=='F'||Tree->Parent->Kind=='f'){strcpy(Parent[0],"母亲");strcpy(Parent[1],"父亲");}else{strcpy(Parent[0],"父亲");strcpy(Parent[1],"母亲");}printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[0]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[1]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->NextNode[0]->Name,name);printf("父母的信息修改成功\n");break;case 'C':NewNode=Tree->Parent;if(NewNode==NULL) //判断是不是头节点{printf("是这个家谱图里最顶端的人没有兄弟姐妹信息!\n",name);break;}if (MATEFLAG==1) //判断是不是入赘或嫁入这家的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以兄弟姐妹信息不在家谱内包括\n");}else{printf("他是入赘此间的所以兄弟姐妹信息不在家谱内包括\n");}break;}if(NewNode->Num==1){printf("没有兄弟姐妹\n");break;}else{for(i=1;i<=NewNode->Num;i++){if(NewNode->NextNode[i]->Name!=Tree->Name){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",NewNode->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(NewNode->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入'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");break;case 'D':if(Tree->Num==0){printf("至今还没有子女\n");break;}if (Tree->Parent !=NULL)if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0) //如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Parent;}for(i=1;i<=Tree->Num;i++){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Tree->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(Tree->NextNode[i]->Kind=='F'||Tree->NextNode[i]->Kind=='f')Tree->NextNode[i]->Kind='M';else Tree->NextNode[i]->Kind='F';}}printf("子女的信息修改成功\n");break;case 'E':if(Tree->Parent!=NULL){if(Tree->NextNode[0]==NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)!=0) {printf("至今还没有配偶\n");break;}if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->Parent->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);}else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}else{if(Tree->NextNode[0]==NULL)printf("至今还没有配偶\n");else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}printf("配偶的信息修改成功\n");break;case 'F':printf("本项服务到此结束\n");break;case '\n':break;default:printf("对不起!你的选择错误\n");break;}if (c=='F'||c=='f')break;printf("请按Enter键继续操作\n");getchar();getchar();}}//输出主菜单void MainMenu(TreeNode *Tree){char c;//用于接受用户输入的选项char name[20];while(1){system("cls");//清屏printf("★★★★★★★★★★★★★欢迎进入家谱管理系统★★★★★★★★★★★\n\n\n");printf(" ◆◆菜单◆◆ \n\n");printf(" ●输入家谱信息---------------------1\n");printf(" ●查找家族成员---------------------2\n");printf(" ●添加家族成员---------------------3\n");printf(" ●输出家谱信息---------------------4\n");printf(" ●修改成员信息---------------------5\n");printf(" ●退出-----------------------------6\n");printf("\n\n★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf("请选择相应的功能:\n");c=getchar();switch(c){case '1': TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode));//建立新节点printf("请输入姓名:"); scanf("%s",Tree->Name);//给节点姓名赋值printf("请输入性别(女F,男M):"); getchar();//给性别赋值scanf("%c",&(Tree->Kind)); // Tree->Parent=NewNode; Tree->Parent=NULL; CreatTree(Tree); printf("家谱图已经建立成功\n"); printf("请按Enter键继续操作\n"); getchar(); break; case '2': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; } printf("请输入你要查找的人的姓名:\n"); scanf("%s",name); OutPutMessage(SearchTree(Tree,name,20),name,20); getchar(); break; case '3': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; } AddNew(Tree); getchar(); break; case '4': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; }printf("整个家谱的主要信息如下:\n");OutPutAll(Tree);getchar();break;case '5':if(strcmp(Tree->Name,"0")==0){printf("家谱图还未建立请先建立\n");getchar();break;}Change(Tree);getchar();break;case '6':printf("本程序结束,欢迎下次使用。

家谱管理系统(含源代码)

家谱管理系统(含源代码)

家谱管理系统——C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。

排答疑和辅导。

完整代码:#include <stdio.h>#include <stdlib.h>#include <string.h>int MATEFLAG=0; //是否入赘或嫁入这家的,1表示为是,0表示否typedef struct TreeNode//树节点定义{int Num; //保存此人儿女个数char Name[20]; //保存此人姓名char Kind; //保存此人性别,男M,女Fstruct TreeNode * NextNode[20]; //保存此人的儿女,NextNode[0]里存放配偶的地址struct TreeNode * Parent; //保存此节点的父节点}TreeNode;void CreatTree(TreeNode *Tree);//创建树void OutPutAll(TreeNode *Tree);//输出树TreeNode * SearchTree(TreeNode *Tree,char name[],int length);void MainMenu(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");MainMenu(Tree);//显示主菜单}//添加新的成员void AddNew(TreeNode * Tree){SubMenue2(Tree);//添加新成员界面}//显示添加家庭信息的界面void SubMenue2(TreeNode *Tree){char c;int num;char name[20];TreeNode * NewNode;getchar();while(1){system("cls");printf("请选择你的操作\n");printf("A:添加某个人的子女的信息\n");printf("B:添加某个人配偶的信息\n");printf("C:退出\n");printf("请选择相应功能:\n");c=getchar();switch(c){case 'A': //添加子女信息printf("请输入那个人的名字:\n");scanf("%s",name);Tree=SearchTree(Tree,name,20);//在家谱里查找这个人if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);break;}if(Tree->Parent==NULL&&Tree->NextNode[0]==NULL||Tree->Parent!=NULL&&Tree->N ame!=Tree->Parent->NextNode[0]->Name){printf("至今还没有配偶请先添加配偶\n",Tree->Name);break;}if(Tree->Parent==NULL&&(Tree->Num>20||Tree->Num<0))Tree->Num=0;if(MATEFLAG==1)Tree=Tree->Parent;NewNode=(TreeNode *)malloc(sizeof(TreeNode));printf("请输入添加人员姓名:\n");scanf("%s",NewNode->Name);printf("请输入添加人员性别女F男M:\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");break;case 'B':printf("请输入那个人的名字:\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){printf("已经有了配偶\n");break;}if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认\n",name);break;}NewNode=(TreeNode *)malloc(sizeof(TreeNode));printf("请输入添加人员姓名:\n");scanf("%s",NewNode->Name);printf("请输入添加人员性别女F男M:\n");scanf("%1s",&NewNode->Kind);NewNode->Parent=Tree;Tree->NextNode[0]=NewNode;break;case 'C':printf("本项服务到此结束\n");break;case '\n':break;default:printf("对不起!你的选择错误\n");break;}if (c=='C'||c=='c')break;printf("请按Enter键继续操作\n");getchar();}}//修改某个人的信息void Change(TreeNode * Tree){char name[20];TreeNode * NewNode;printf("请输入你要修改的人的信息:\n");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);return;}else{SubMenue1(NewNode);}}//输出副菜单void SubMenue1(TreeNode * Tree){char c;int flag,i;char name[20];char Parent[2][20];TreeNode * NewNode;getchar();while(1){system("cls");printf("请选择你的操作\n");printf("A:修改个人的信息\n");printf("B:修改父母的信息\n");printf("C:修改兄弟姐妹的信息\n");printf("D:修改子女的信息\n");printf("E:修改配偶的信息\n");printf("F:退出\n");c=getchar();switch(c){printf("请输入修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n"); scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(Tree->Kind=='F'||Tree->Kind=='f')Tree->Kind='M';else Tree->Kind='F';}printf("个人信息修改成功\n");break;case 'B':if(Tree->Parent==NULL) //判断是不是头节点{printf("是这个家谱图里最顶端的人没有父母信息!\n",name);break;}if (MATEFLAG==1) //判断是不是入赘或加入此间的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以父母信息不在家谱内包括\n");}else{printf("他是入赘此间的所以父母信息不在家谱内包括\n");}break;}if(Tree->Parent->Kind=='F'||Tree->Parent->Kind=='f'){strcpy(Parent[0],"母亲");strcpy(Parent[1],"父亲");}else{strcpy(Parent[0],"父亲");strcpy(Parent[1],"母亲");}printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[0]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[1]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->NextNode[0]->Name,name);printf("父母的信息修改成功\n");break;case 'C':NewNode=Tree->Parent;if(NewNode==NULL) //判断是不是头节点{printf("是这个家谱图里最顶端的人没有兄弟姐妹信息!\n",name);break;}if (MATEFLAG==1) //判断是不是入赘或嫁入这家的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以兄弟姐妹信息不在家谱内包括\n");}else{printf("他是入赘此间的所以兄弟姐妹信息不在家谱内包括\n");}break;}if(NewNode->Num==1){printf("没有兄弟姐妹\n");break;}else{for(i=1;i<=NewNode->Num;i++){if(NewNode->NextNode[i]->Name!=Tree->Name){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",NewNode->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(NewNode->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入'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");break;case 'D':if(Tree->Num==0){printf("至今还没有子女\n");break;}if (Tree->Parent !=NULL)if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0) //如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Parent;}for(i=1;i<=Tree->Num;i++){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Tree->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(Tree->NextNode[i]->Kind=='F'||Tree->NextNode[i]->Kind=='f')Tree->NextNode[i]->Kind='M';else Tree->NextNode[i]->Kind='F';}}printf("子女的信息修改成功\n");break;case 'E':if(Tree->Parent!=NULL){if(Tree->NextNode[0]==NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)!=0){printf("至今还没有配偶\n");break;}if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->Parent->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);}else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}else{if(Tree->NextNode[0]==NULL)printf("至今还没有配偶\n");else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}printf("配偶的信息修改成功\n");break;case 'F':printf("本项服务到此结束\n");break;case '\n':break;default:printf("对不起!你的选择错误\n");break;}if (c=='F'||c=='f')break;printf("请按Enter键继续操作\n");getchar();getchar();}}//输出主菜单void MainMenu(TreeNode *Tree){char c;//用于接受用户输入的选项char name[20];while(1){system("cls");//清屏printf("★★★★★★★★★★★★★欢迎进入家谱管理系统★★★★★★★★★★★\n\n\n");printf(" ◆◆菜单◆◆ \n\n");printf(" ●输入家谱信息---------------------1\n");printf(" ●查找家族成员---------------------2\n");printf(" ●添加家族成员---------------------3\n");printf(" ●输出家谱信息---------------------4\n");printf(" ●修改成员信息---------------------5\n");printf(" ●退出-----------------------------6\n");printf("\n\n★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf("请选择相应的功能:\n");c=getchar();switch(c){case '1': TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode));//建立新节点printf("请输入姓名:"); scanf("%s",Tree->Name);//给节点姓名赋值printf("请输入性别(女F,男M):"); getchar();//给性别赋值scanf("%c",&(Tree->Kind)); // Tree->Parent=NewNode; Tree->Parent=NULL; CreatTree(Tree); printf("家谱图已经建立成功\n"); printf("请按Enter键继续操作\n"); getchar(); break; case '2': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; } printf("请输入你要查找的人的姓名:\n"); scanf("%s",name); OutPutMessage(SearchTree(Tree,name,20),name,20); getchar(); break; case '3': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; } AddNew(Tree); getchar(); break; case '4': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; }printf("整个家谱的主要信息如下:\n");OutPutAll(Tree);getchar();break;case '5':if(strcmp(Tree->Name,"0")==0){printf("家谱图还未建立请先建立\n");getchar();break;}Change(Tree);getchar();break;case '6':printf("本程序结束,欢迎下次使用。

C语言二叉树家谱管理系统

C语言二叉树家谱管理系统

摘要本文设计了一个对数据输入,输出,储存,查找的多功能软件,本文需要保存家族的基本信息,包括姓名及它们的关系,但是由于家族信息很巨大而且关系很复杂所以采用二叉树来表示它们的关系。

并且具有保存文件的功能,以便下次直接使用先前存入的信息。

家谱的功能是查询家族每个人的信息,并且输出它们的信息,还要具有查询输出功能。

本文采用二叉树来存取家族的基本信息,头结点作为父亲节点,他的左孩子为他的妻子,妻子结点的右孩子为他的孩子,依次存储每个家庭的信息。

可以查找每个父亲的孩子和每个人的所有祖先。

关键词:二叉树家谱结点目录1 系统功能概述 (1)1.1 系统功能 (1)图2 成员二叉树功能模块图 (4)1.2 总体功能模块 (4)2 系统各功能模块的详细设计 (5)2.1功能选择 (5)2.2信息输入 (7)2.3信息输出 (7)2.4信息存盘 (7)2.5信息清盘 (8)2.6信息查询 (9)2.7源程序 (11)3设计结果与分析 (22)3.1菜单函数功能测试 (22)4.2输入功能函数测试 (23)3.3输出功能函数测试 (23)3.4清盘功能函数测试 (23)3.5存盘功能函数测试 (24)3.6查询功能函数测试 (24)总结 (26)参考文献 (27)1 系统功能概述1.1 系统功能实现的法是先定义一个二叉树,该二叉树上的每个结点由三个元素组成:姓名、指向它左孩子的指针、以及指向它右孩子的指针构成。

该家谱管理系统将信息用文件的法进行存储管理,再从文件中将成员信息以递归的法创建二叉树。

该输入成员信息的法是将父亲结点存上父亲的信息,然后父亲结点的左孩子存上母亲的信息,母亲结点的右孩子存上孩子的信息。

(1)定义结构体结构体为表示一个对象的不同属性提供了连贯一致的法,结构体类型的说明从关键词struct开始,成员可以由各种数据类型混合构成,成员甚至还可以是数组或者其他类型的结构,但是,结构体中不能包含自身定义类型的成员。

二叉树家谱

二叉树家谱

《数据结构》课程实训报告题目:家谱树完成人:专业班级:学号:指导教师:年月日1.题目与要求1.1问题提出本人计划编写一个家谱管理系统,主要用来管理家族成员的基本信息。

1.2本系统涉及的知识点结构体,数组,循环,函数,分支,指针1.3功能要求1、确定整个程序的功能模块。

实现程序的主界面,要对主界面的功能选择输入进行容错处理。

2、实现单个结点信息的录入。

3、对录入日期信息进行合法性检验。

4、采用改变字体颜色的方式突出显示主界面的功能项。

5、计算从出生日期到死亡日期的实际天数6、若家谱树为空,则新建家谱树。

实现成员节点的添加。

基本功能中可以强制要求所有成员不同名,即不考虑同名情况(符合小家族的实际情况)。

7、添加成员节点时,可以选择将新添加的节点作为整个家谱的上一代祖先,或者将新添加的节点作为某个现有成员的孩子。

8、作为某个现有成员的孩子,根据给出的父节点的姓名将该结点添加到相应位置,注意,针对某一父节点,添加第一个孩子和其它孩子的区别。

9、要求在孩子兄弟二叉树中按各个孩子的年龄进行排序。

10、将家谱树保存到二进制文件。

注意,不能保存空白节点。

11、从文件读入家谱信息,重建孩子兄弟二叉树形式的家谱。

12.从文件中读出所有节点信息到一个数组中,然后按一年中生日的先后进行快速排序。

13、按姓名查询家谱成员并显示该成员的各项信息。

14、给出某一成员的姓名,删除该成员和该成员的所有子孙。

15、成员信息的修改。

信息修改时要给出选择界面让用户选择需要修改的信息项。

基本功能中可以限定不容许修改父亲姓名和本人姓名。

对日期信息进行修改时要进行检验。

16、实现层次递进的方式显示整个家谱,显示结果应该体现家谱树的结构。

17、按各种关键字进行查询,要求给出关键字选择界面,并显示符合查询条件的节点信息。

18、信息统计基本要求包括:平均身高,平均寿命,男女成员各多少,平均家庭人口数目(假定每个成员构成一个家庭,该家庭的家庭成员是指成员本人和他的孩子,即家庭人口数=孩子数+1)。

数据结构_家谱管理系统

数据结构_家谱管理系统

数据结构_家谱管理系统【数据结构_家谱管理系统】一、引言家谱是记录家族成员关系的重要文献,传统的家谱管理方式已经无法满足现代社会的需求。

为了更好地管理家族信息,提高家族成员之间的联系和交流,我们设计并开发了一款家谱管理系统。

本文将详细介绍该系统的设计和实现。

二、系统概述家谱管理系统是一个基于数据结构的软件应用,旨在帮助用户管理家族成员的信息,包括姓名、性别、出生日期、配偶、子女等。

系统提供了多种功能,包括添加、删除、修改、查询、统计等操作,方便用户对家谱信息进行维护和管理。

三、系统设计1. 数据结构选择在家谱管理系统中,我们选择了树这种数据结构来表示家族关系。

每个节点代表一个家庭成员,节点之间通过指针连接,形成家族的层级结构。

2. 数据模型设计家族成员的信息可以通过一个结构体来表示,包括姓名、性别、出生日期等字段。

每个节点除了包含成员信息外,还包含指向配偶的指针和指向子女的指针。

3. 系统功能设计家谱管理系统提供了以下功能:(1) 添加成员:用户可以输入成员信息,系统根据用户输入创建一个新的节点,并将其插入到适当的位置。

(2) 删除成员:用户可以指定要删除的成员,系统会删除该成员及其所有子孙节点。

(3) 修改成员信息:用户可以选择要修改的成员,然后输入新的信息进行更新。

(4) 查询成员信息:用户可以通过姓名、出生日期等条件查询成员信息。

(5) 统计家族人数:系统可以统计家族的总人数、男性人数、女性人数等信息。

四、系统实现1. 数据结构实现我们使用C语言来实现家谱管理系统。

通过定义一个节点结构体,使用指针来连接各个节点,实现家族关系的表示和管理。

2. 功能实现(1) 添加成员:根据用户输入的信息,创建一个新节点,并将其插入到适当的位置。

插入操作需要遍历树来找到合适的位置。

(2) 删除成员:根据用户指定的成员,删除该节点及其所有子孙节点。

删除操作需要递归地遍历树。

(3) 修改成员信息:根据用户选择的成员,更新其信息。

家谱管理系统(含源代码)x

家谱管理系统(含源代码)x

家谱管理系统——C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。

排答疑和辅导。

完整代码:#in clude<stdio.h>#in clude<stdlib.h>#in clude<stri ng.h>intMATEFLAG=O;〃是否入赘或嫁入这家的,1表示为是,0表示否tRpedefstructTreeNode// 树节点定义{intNum;//保存此人儿女个数charName[20];〃保存此人姓名charKind;//保存此人性别,男 M,女FstructTreeNodeRNeRtNode[20];〃保存此人的儿女,NeRtNode[0]里存放配偶的地址structTreeNodeRParent;〃保存此节点的父节点}TreeNode;voidCreatTree(TreeNodeRTree);// 创建树 voidOutPutAII(TreeNodeRTree);// 输出树TreeNodeRSearchTree(TreeNodeRTree,charname[],i ntle ngth);voidMai nMenu (TreeNodeRTree);voidSubMe nue1(TreeNodeRTree);voidSubMe nue2(TreeNodeRTree);voidCha nge(TreeNodeRTree);voidAddNew(TreeNodeRTree); voidOutPutMessage(TreeNodeRTree,charname[],i ntle ngth);//主函数voidmai n(){TreeNodeRTree;// 产生根节点Tree=(TreeNodeR)malloc(sizeof(TreeNode));Tree->Pare nt=NULL;strcpR(Tree->Name,"0");MainMenu(Tree);// 显示主菜单}//添加新的成员voidAddNew(TreeNodeRTree){SubMenue2(Tree);〃添加新成员界面}//显示添加家庭信息的界面voidSubMe nue2(TreeNodeRTree){charc;intnum;char name[20];TreeNodeRNewNode;getchar();while(1)sRstem("cls");printf(”请选择你的操作\n”);printf("A:添加某个人的子女的信息\n");printf("B:添加某个人配偶的信息\n");printf("C:退出 \n”);printf(”请选择相应功能:\n");c=getchar();switch(c){case'A'://添加子女信息printf(”请输入那个人的名字:\n");sca nf("%s", name);Tree=SearchTree(Tree ,n ame,20);〃在家谱里查找这个人if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);break;}if(Tree->Pare nt==NULL&&Tree->NeRtNode[0]==NULL||Tree->Pare nt!=NULL&& Tree->N ame!=Tree->Pare nt->NeRtNode[0]->Name){printf(”至今还没有配偶请先添加配偶\n",Tree->Name);break;}if(Tree->Pare nt==NULL&&(Tree->Num>20||Tree->Num<0))Tree->Num=0;if(MATEFLAG==1)Tree=Tree->Pare nt;NewNode=(TreeNodeR)malloc(sizeof(TreeNode));printf(”请输入添加人员姓名:\n");sca nf("%s",NewNode->Name);printf(”请输入添加人员性别女F男M:\n");sca nf("%1s",&NewNode->Ki nd);num=Tree->Num;NewNode->NeRtNode[0]=(TreeNodeR)malloc(sizeof(TreeNode));NewNode->NeRtNode[0]=NULL;NewNode->Num=0;NewNode->Pare nt=Tree;Tree->NeRtNode[ num+1]=NewNode;Tree->Num=Tree->Num+1;printf(”子女的信息添加成功\n");break;case'B':printf(”请输入那个人的名字:\n");sca nf("%s", name);Tree=SearchTree(Tree ,n ame,20);if(Tree->Pare nt!=NULL&&strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)==0||T ree->NeRtNode[0]!=NULL)printf(”已经有了配偶\n”);break;}if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认\n",name); break;}NewNode=(TreeNodeR)malloc(sizeof(TreeNode));printf(”请输入添加人员姓名:\n");sca nf("%s",NewNode->Name);printf(”请输入添加人员性别女F男M:\n");sca nf("%1s",&NewNode->Ki nd);NewNode->Pare nt=Tree;Tree->NeRtNode[0]=NewNode;break;case'C':printf(”本项服务到此结束\n");break;case'\n':break;default:printf("对不起!你的选择错误\n");break;}if(c==C||c=='c')break;printf(”请按Enter键继续操作\n");getchar();getchar();}}//修改某个人的信息voidCha nge(TreeNodeRTree){char name[20];TreeNodeRNewNode;printf(”请输入你要修改的人的信息:\n");sca nf("%s", name);NewNode=SearchTree(Tree ,n ame,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误 return;\n ”, name); }else{SubMe nu e1(NewNode);}}//输出副菜单voidSubMe nue1(TreeNodeRTree){charc;in tflag,i;char name[20];charPare nt[2][20];TreeNodeRNewNode;getchar();while(1){sRstem("cls");printf(”请选择你的操作\n”);printf("A:修改个人的信息\n");printf("B:修改父母的信息\n”);printf("C:修改兄弟姐妹的信息\n");printf("D:修改子女的信息\n");printf("E:修改配偶的信息\n”);printf("F:退出 \n");c=getchar();switch(c){case'A':printf(”请输入修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n"); sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->Name, name);printf(”是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");sca nf("%d", &flag);if(flag==1){if(Tree->K in d=='F'||Tree->Ki nd=='f)Tree->Ki nd='M';elseTree->K in d='F';}printf(”个人信息修改成功\n");break;case'B':if(Tree->Pare nt==NULL)〃判断是不是头节点{printf(”是这个家谱图里最顶端的人没有父母信息!\n",name);break;}if(MATEFLAG==1)〃判断是不是入赘或加入此间的{if(Tree->K in d=='F'||Tree->Ki nd=='f)printf(”她是嫁入此间的所以父母信息不在家谱内包括\n");}else{printf(”他是入赘此间的所以父母信息不在家谱内包括\n");}break;}if(Tree->Pare nt->K in d=='F'||Tree->Pare nt->K in d=='f){strcpR(Parent[O],"母亲");strcpR(Parent[1],"父亲");}else{strcpR(Parent[O],"父亲");strcpR(Parent[1],"母亲");}printf(”请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Pare nt[O]);sca nf("%s", name);if(strcmp( name,"O")!=O)strcpR(Tree->Pare nt->Name, name);printf(”请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Pare nt[1]);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->Pare nt->NeRtNode[0]->Name, name);printf(”父母的信息修改成功\n");break;case'C':NewNode=Tree->Pare nt;if(NewNode==NULL)〃判断是不是头节点{printf(”是这个家谱图里最顶端的人没有兄弟姐妹信息!\n",name);break;}if(MATEFLAG==1)〃判断是不是入赘或嫁入这家的{if(Tree->K in d=='F'||Tree->Ki nd=='f){printf(”她是嫁入此间的所以兄弟姐妹信息不在家谱内包括\n");}else{printf(”他是入赘此间的所以兄弟姐妹信息不在家谱内包括\n");break;}if(NewNode->Num==1){printf(”没有兄弟姐妹\n”);break;}else{for(i=1;i<=NewNode->Num;i++){if(NewNode->NeRtNode[i]->Name!=Tree->Name){printf(”请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n”,NewNode->NeRtNode[i]->Name);sea nf("%s", name);if(strcmp( name,"O")!=O) strcpR(NewNode->NeRtNode[i]->Name, name); printf(”是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");sca nf("%d", &flag);if(flag==1){if(NewNode->NeRtNode[i]->K in d=='G'||NewNode->NeRtNode[i]->Ki nd=='g') NewNode->NeRtNode[i]->Ki nd='B: elseNewNode->NeRtNode[i]->Ki nd='G'; }}}}printf(”兄弟姐妹的信息修改成功\n");break;case'D':if(Tree->Num==O){printf(”至今还没有子女\n");break;}if(Tree->Pare nt!=NULL)if(strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)==0)〃如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Pare nt;}for(i=1;i<=Tree_>Num;i++){printf(”请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Tree->NeRtNode[i]->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)printf(”是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter 键继续 \n");sca nf("%d", &flag);if(flag==1){if(Tree->NeRtNode[i]->Ki nd=='F'||Tree->NeRtNode[i]->Ki nd=='f)Tree->NeRtNode[i]->Ki nd='M';elseTree->NeRtNode[i]->Kin d='F';}}printf(”子女的信息修改成功\n");break;case'E':if(Tree->Pare nt!=NULL){if(Tree->NeRtNode[0]==NULL&&strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)!=0) {printf(”至今还没有配偶\n”);break;}if(strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)==0){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n\t",Tree->Parent->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->Pare nt->Name, name);}else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n\t",Tree->NeRtNode[0]->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->NeRtNode[0]->Name, name);}}else{if(Tree->NeRtNode[0]==NULL)printf("至今还没有配偶\n”);else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n\t",Tree->NeRtNode[0]->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)}}printf(”配偶的信息修改成功\n");break;case'F':printf(”本项服务到此结束\n");break;case'\n':break;default:printf("对不起!你的选择错误\n");break;}if(c=='F'||c=='f)break;printf(”请按Enter键继续操作\n");getchar();getchar();}}//输出主菜单voidMai nMen u(TreeNodeRTree){chare;//用于接受用户输入的选项char name[20];while(1){sRstem("cls");〃清屏printf(” ★★★★★★★★★★★★★欢迎进入家谱管理系统★★★★★★★★★★★ \n\n\n");printf(” ♦♦菜单・・ \n\n”);printf(”输入家谱信息 ----------- 1\n");printf(”查找家族成员 ----------- 2\n");printf(”添加家族成员 ----------- 3\n");printf("输出家谱信息 ------------ 4\n");printf("修改成员信息 ------------ 5\n");printf(” 退出 ---------------- 6\n");printf("\n\n ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n");printf(”请选择相应的功能:\n");c=getchar();switch(c){case'1':TreeNodeRNewNode;NewNode=(TreeNodeR)malloc(sizeof(TreeNode));〃建立新节点printf("请输入姓名:");scanf("%s",Tree->Name);〃给节点姓名赋值printf(”请输入性别(女F男M):");getchar();// 给性另U 赋值scanf("%c",&(Tree->Kind));//Tree->Parent=NewNode;Tree- >Parent=NULL;CreatTree(Tree);printf("家谱图已经建立成功 \n”);printf(” 请按 Enter 键继续操作 \n");getchar();break;case'2':if(strcmp(Tree->Name,"0")==0){pri ntf("家谱图还未建立请先建立\n");getchar();break;}pri ntf(" 请输入你要查找的人的姓名:\n");scanf("%s",name);OutPutMessage(SearchTree(Tree,name,20),name,20);getchar();break;c ase'3':if(strcmp(Tree->Name,"0")==0){pri ntf(" 家谱图还未建立请先建立\n");getchar();break;}AddNew(Tree);getchar();break;case'4':if(strcmp(Tree- >Name,"0")==0) {printf("家谱图还未建立请先建立 \n");getchar();break;}printf(”整个家谱的主要信息如下:\n");OutPutAll(Tree);getchar();break; case'5': if(strcmp(Tree->Name,"0")==0){printf(”家谱图还未建立请先建立 \n");getchar();break;}Chan ge(Tree);getchar(); break; case'6': printf(”本程序结束,欢迎下次使用。

数据结构(二叉树)家谱管理系统教学内容

数据结构(二叉树)家谱管理系统教学内容

数据结构(二叉树)家谱管理系统数学与计算机学院课程设计说明书课程名称: 数据结构与算法课程设计课程代码:题目: 二叉树生成家谱年级/专业/班:学生姓名:学号:开始时间: 2015 年 12 月 09 日完成时间: 2015 年 12 月 29 日课程设计成绩:指导教师签名:年月日目录(小三黑体,居中)1 需求分析 (6)1.1任务与分析 (6)1.2测试数据 (6)2 概要设计 (7)2.1 ADT描述 (7)2.2程序模块结构 (8)2.3各功能模块 (9)3 详细设计 (11)3.1结构体定义 (11)3.2 初始化 (12)3.3 插入操作 (14)3.4 查询操作 (17)4 调试分析 (19)5 用户使用说明 (20)6 测试结果 (20)结论 (25)附录 (26)参考文献 (27)摘要随着计算机科学技术、计算机产业的迅速发展,计算机的应用普及也在以惊人的速度发展,计算机应用已经深入到人类社会的各个领域。

计算机的应用早已不限于科学计算,而更多地应用在信息处理方面。

计算机可以存储的数据对象不再是纯粹的数值,而扩展到了字符、声音、图像、表格等各种各样的信息。

对于信息的处理也不再是单纯的计算,而是一些如信息存储、信息检索等非数值的计算。

那么,现实世界的各种数据信息怎样才能够存储到计算机的内存之中,对存入计算机的数据信息怎样进行科学处理,这涉及计算机科学的信息表示和算法设计问题。

为解决现实世界中某个复杂问题,总是希望设计一个高效适用的程序。

这就需要解决怎样合理地组织数据、建立合适的数据结构,怎样设计适用的算法,以提高程序执行的时间效率和空间效率。

“数据结构”就是在此背景下逐步形成、发展起来的。

在各种高级语言程序设计的基本训练中,解决某一实际问题的步骤一般是:分析实际问题;确定数学模型;编写程序;反复调试程序直至得到正确结果。

所谓数学模型一般指具体的数学公式、方程式等,如牛顿迭代法解方程,各种级数的计算等。

课题_数据结构(二叉树)家谱管理系统

课题_数据结构(二叉树)家谱管理系统

数学与计算机学院课程设计说明书课程名称: 数据结构与算法课程设计课程代码:题目: 二叉树生成家谱年级/专业/班:学生姓名:学号:开始时间: 2015 年 12 月 09 日完成时间: 2015 年 12 月 29 日课程设计成绩:指导教师签名:年月日目录(小三黑体,居中)1 需求分析 (6)1.1任务与分析 (6)1.2测试数据 (6)2 概要设计 (7)2.1 ADT描述 (7)2.2程序模块结构 (8)2.3各功能模块 (9)3 详细设计 (10)3.1结构体定义 (10)3.2 初始化 (11)3.3 插入操作 (13)3.4 查询操作 (15)4 调试分析 (18)5 用户使用说明 (18)6 测试结果 (18)结论 (23)附录 (24)参考文献 (25)随着计算机科学技术、计算机产业的迅速发展,计算机的应用普及也在以惊人的速度发展,计算机应用已经深入到人类社会的各个领域。

计算机的应用早已不限于科学计算,而更多地应用在信息处理方面。

计算机可以存储的数据对象不再是纯粹的数值,而扩展到了字符、声音、图像、表格等各种各样的信息。

对于信息的处理也不再是单纯的计算,而是一些如信息存储、信息检索等非数值的计算。

那么,现实世界的各种数据信息怎样才能够存储到计算机的内存之中,对存入计算机的数据信息怎样进行科学处理,这涉及计算机科学的信息表示和算法设计问题。

为解决现实世界中某个复杂问题,总是希望设计一个高效适用的程序。

这就需要解决怎样合理地组织数据、建立合适的数据结构,怎样设计适用的算法,以提高程序执行的时间效率和空间效率。

“数据结构”就是在此背景下逐步形成、发展起来的。

在各种高级语言程序设计的基本训练中,解决某一实际问题的步骤一般是:分析实际问题;确定数学模型;编写程序;反复调试程序直至得到正确结果。

所谓数学模型一般指具体的数学公式、方程式等,如牛顿迭代法解方程,各种级数的计算等。

这属于数值计算的一类问题。

数据结构家谱管理系统(二叉链表)

数据结构家谱管理系统(二叉链表)
8
char life; //是否健在 };
3、 二叉树结点结构体 struct Node { Information data; //个人信息 Node* child; //第一个孩子 Node* brother; //兄弟 };
4、 家谱类(二叉树结构、左孩子,右兄弟) class FamilyTree { private:
2、 更新模块 (1) 创建家谱、增加成员、删除成员、成员改名 (2) 主要函数: Node* Creat( ); //构造函数调用 void AddNewPeople(Node *root,string FatherName,string NAme); // 增加新的家族成员 int DeletePeople(Node *root,string FatherName,string Deletepeople); //删除家族成员
7
数据结构实现: 1、 生日结构体
struct BirthDay { int year; int month; int day; friend istream& operator>>(istream &is,BirthDay &b); friend ostream& operator<<(ostream &os,const BirthDay &b); };
2、 信息结构体(家族成员的基本信息) struct Information { string name; //姓名 string birthPlace; //出生地 BirthDay birthDay; //生日 string sex; //性别 string education; //学历 string job; //工作 string father; //父亲 string spouse; //配偶

数据结构课设-家谱管理系统

数据结构课设-家谱管理系统

数据结构课程设计——家谱管理系统一、问题描述问题名称:电子家谱问题内容:用树形的形式表示某家族的家谱,每个树结点表示一个家族成员,成员基本信息如下,具体属性自行确定。

1、姓名2、性别3、出生地4、配偶5、电话6、家庭住址7、职业8、简历9、其他系统实现功能:1、家谱信息1.1、输入1.2、修改1.3、删除2、查询2.1、某家谱成员的所有子孙的集合2.2、某家谱成员的所有祖先的集合2.3、某家谱成员的所有同辈成员的集合2.4、求某家谱成员的所有上一辈成员的集合2.5、给出两个家谱成员,确定他们的关系2.6、其他查询3、统计功能3.1、统计家谱成员的总人数3.2、统计从事某种职业的人数3.3、综合统计其他功能要求:1、用文件保存家谱信息2、图形方式显示家谱2二、系统总体设计(模块结构图)建立家谱读取文件保存家谱添加结点修改结点删除结点程序入口输出家谱统计基本查询关系查询祖先列表两人关系三、算法和数据结构设计数据结构的设计:使用兄弟孩子父亲表示法数据结构由如下的结构体组成1.1、日期的结构struct Date{int year; //年int month; //月int day; //日};1.2、成员信息的结构struct Info{char name[max_char_num];//姓名char birthplace[max_char_num];//出生地点Date birthdate;//结构date定义的出生日期Date deathdate;//结构date定义的死亡日期char sex[max_char_num];//性别char wife_or_husband[max_char_num];//配偶char phone[max_array_num];//电话char address[max_char_num];//家庭住址char resume[max_char_num];//简历//其他信息如下int height;//高度char occupation[max_char_num];//职业3char education[max_char_num];//受教育程度char top_headship[max_char_num];//最高职位char parentname[max_char_num];//父亲姓名,用于添加节点时用int Depth;//二叉树深度,输出二叉树时用};1.3、结点的结构typedef struct CSNode{Info data; //个人信息类型结构CSNode *firstchild,*nextsibling,*parent; //csnode的第一个孩子节点,下一个兄弟节点,双亲节点}*person;数据结构设计体会:使用树的按层遍历的方法找出某人的祖先的集合,但在从文件重建家谱的部分又碰到了困难,如何保存文件可是既节省空间又节省重建家谱的时间。

家族族谱系统

家族族谱系统

宁波大红鹰学院信息工程学院课程设计报告项目名称:家族族谱系统项目组长:王佩珂项目成员:王陈健马溯滨童炳班级名称:10计科1专业名称:计算机科学与技术完成时间:2012.12.19信息工程学院制目录一、案例描述...................................................................................................................... - 1 -1、总体描述................................................................................................................ - 1 -2、模块描述................................................................................................................ - 1 -二、设计思路...................................................................................................................... - 1 -三、程序设计...................................................................................................................... - 1 -1、数据结构描述........................................................................................................ - 1 -2、主函数及其流程图................................................................................................ - 1 -3、源程序.................................................................................................................... - 2 -四、调试与分析.................................................................................................................. - 4 -1开始运行程序......................................................................................................... - 10 -2 增加信息................................................................................................................ - 10 -五、设计总结.................................................................................................................... - 12 -1、完成情况.............................................................................................................. - 12 -2、心得体会.............................................................................................................. - 12 -一、案例描述1、总体描述输入家族成员情况,建立树结构,统计家族成员人数,能查询家族成员辈份情况。

基于二叉树的族谱生成系统的设计与实现

基于二叉树的族谱生成系统的设计与实现

基于二叉树的族谱生成系统的设计与实现族谱是家族世系传承的记录,是一个家族的历史和文化的宝库。

然而,传统的手工写作方式存在着繁琐工作量、易于出错、维护不方便等问题。

为了更好地管理和维护族谱,我们可以借助计算机科学的思想和技术实现一款族谱生成系统。

本系统基于二叉树作为数据结构,实现了一个族谱生成系统,可以支持多人同时使用。

具体实现步骤如下:1.确定数据结构。

我们选择二叉树作为数据结构,因为二叉树可以很好地描述一个家族的族谱结构。

每个节点代表一个人,它包含了人的姓名、性别、出生日期、死亡日期等信息。

每个节点最多有两个子节点,分别代表先祖和后代关系。

2. 实现数据录入模块。

用户可以通过输入框分别输入每个节点的信息,或者通过导入E某cel文件的方式批量录入信息。

3. 实现数据导出模块。

用户可以将族谱导出为E某cel或PDF格式,方便共享和传播。

4.实现族谱查询模块。

用户可以通过姓名、出生日期、亲戚关系等关键词进行查询,并可快速定位到对应的节点。

6.实现权限管理模块。

由于家族信息涉及个人隐私,系统应该具备一定的权限管理功能,例如管理员可以对数据进行修改,普通用户只能进行查询。

7.实现系统设置模块。

系统设置功能包括主题色调、字体大小、默认导出格式、默认排序方式等,可以让用户根据个人喜好进行个性化设置。

总体而言,基于二叉树的族谱生成系统可以有效地解决传统手工写作方式存在的问题,并可以大大提高家族管理的效率和便捷程度。

同时,系统应该不断完善和升级,加强安全性和易用性,请使用者谨慎保管数据和密码。

数据结构(二叉树)家谱管理系统

数据结构(二叉树)家谱管理系统

.数学与计算机学院课程设计说明书课程名称: 数据结构与算法课程设计课程代码:题目: 二叉树生成家谱年级/专业/班:学生姓名:学号:开始时间:2015 年12 月09 日完成时间:2015 年12 月29 日课程设计成绩:指导教师签名:年月日目录(小三黑体,居中)1 需求分析 (7)1.1任务与分析 (7)1.2测试数据 (8)2 概要设计 (9)2.1 ADT描述 (9)2.2程序模块结构 (10)2.3 各功能模块 (2)3 详细设计 (13)3.1结构体定义 (13)3.2 初始化 (15)3.3 插入操作 (2)3.4 查询操作 (21)4 调试分析 (24)5 用户使用说明 (24)6 测试结果 (25)结论 (29)附录 (30)参考文献 (31)摘要随着计算机科学技术、计算机产业的迅速发展,计算机的应用普及也在以惊人的速度发展,计算机应用已经深入到人类社会的各个领域。

计算机的应用早已不限于科学计算,而更多地应用在信息处理方面。

计算机可以存储的数据对象不再是纯粹的数值,而扩展到了字符、声音、图像、表格等各种各样的信息。

对于信息的处理也不再是单纯的计算,而是一些如信息存储、信息检索等非数值的计算。

那么,现实世界的各种数据信息怎样才能够存储到计算机的存之中,对存入计算机的数据信息怎样进行科学处理,这涉及计算机科学的信息表示和算法设计问题。

为解决现实世界中某个复杂问题,总是希望设计一个高效适用的程序。

这就需要解决怎样合理地组织数据、建立合适的数据结构,怎样设计适用的算法,以提高程序执行的时间效率和空间效率。

“数据结构”就是在此背景下逐步形成、发展起来的。

在各种高级语言程序设计的基本训练中,解决某一实际问题的步骤一般是:分析实际问题;确定数学模型;编写程序;反复调试程序直至得到正确结果。

所谓数学模型一般指具体的数学公式、方程式等,如牛顿迭代法解方程,各种级数的计算等。

这属于数值计算的一类问题。

家谱管理系统 -数据结构大作业

家谱管理系统 -数据结构大作业

家谱管理系统 -数据结构大作业家谱管理系统数据结构大作业在当今数字化的时代,信息管理系统在各个领域都发挥着重要作用。

家谱作为家族历史和传承的重要记录,也需要一个高效、便捷的管理系统来保存、整理和查询相关信息。

本次数据结构大作业,我将深入探讨家谱管理系统的设计与实现。

一、需求分析家谱管理系统的主要用户包括家族成员和对家族历史感兴趣的研究者。

系统需要满足以下基本需求:1、能够存储家族成员的详细信息,如姓名、出生日期、逝世日期、籍贯、职业等。

2、支持家族关系的建立和维护,如父子、母子、夫妻等关系。

3、提供便捷的查询功能,用户可以根据姓名、出生日期、关系等条件快速找到所需的家族成员信息。

4、支持家谱的可视化展示,以清晰呈现家族成员之间的关系结构。

5、具备数据的添加、删除和修改功能,以保证家谱信息的及时更新。

二、数据结构选择为了有效地存储和管理家谱数据,我们需要选择合适的数据结构。

考虑到家谱中家族成员之间的层次关系,树结构是一个理想的选择。

在这里,我们可以使用二叉树来表示家族关系。

每个节点代表一个家族成员,节点中存储成员的相关信息。

父节点与左子节点表示父子关系,父节点与右子节点表示父女关系。

另外,为了提高查询效率,我们还可以结合哈希表来存储家族成员的信息。

通过哈希函数将成员的关键信息(如姓名)映射到哈希表中的特定位置,从而实现快速的查找和访问。

三、系统功能模块设计1、数据录入模块提供友好的用户界面,方便用户输入家族成员的信息。

对输入的数据进行合法性检查,确保信息的准确性和完整性。

2、数据存储模块利用选择的数据结构(二叉树和哈希表)将家族成员的信息进行存储。

确保数据的安全存储,防止数据丢失或损坏。

3、查询模块支持多种查询条件,如按姓名、出生日期、关系等进行查询。

快速返回查询结果,并以清晰的方式展示给用户。

4、关系维护模块允许用户添加新的家族成员,并建立其与其他成员的关系。

支持修改和删除家族成员的信息及关系。

家谱管理系统c语言课程设计

家谱管理系统c语言课程设计

家谱管理系统c语言课程设计一、课程目标知识目标:1. 学生能理解家谱管理系统的基础知识,掌握C语言中结构体、文件操作、指针等在本项目中的应用。

2. 学生能运用C语言实现家谱的添加、删除、修改、查询等基本功能,并理解其背后的算法逻辑。

3. 学生能掌握简单的数据结构设计,如链表,以及其在管理大量数据时的优势。

技能目标:1. 学生通过课程学习,能够独立设计并编写一个简单的家谱管理系统,展示基本的编程能力。

2. 学生能够运用所学知识,解决家谱管理中的实际问题,如数据存储、读取和操作。

3. 学生能够进行基本的程序调试,优化程序性能,提高代码的可读性和维护性。

情感态度价值观目标:1. 培养学生对计算机编程的兴趣,激发其探究精神和创新意识。

2. 学生能够通过团队协作,体验合作学习的重要性,培养沟通和协作的能力。

3. 学生通过实际项目的开发,增强自信心,认识到学习C语言的实际意义和价值。

课程性质分析:本课程为实践性较强的课程设计,旨在通过实际项目的开发,让学生将所学的C语言知识应用到实际问题中,提高学生的编程能力和问题解决能力。

学生特点分析:考虑到学生已经具备C语言基础知识,但实际应用能力有待提高,课程设计将注重理论与实践的结合,逐步引导学生从理解到应用。

教学要求:1. 教学过程中应注重启发式教学,引导学生主动探究问题,培养学生的独立思考能力。

2. 教师应关注学生的学习进度,提供及时反馈,帮助学生解决编程过程中遇到的问题。

3. 课程结束后,组织学生进行项目展示和评价,鼓励学生相互学习,共同提高。

二、教学内容1. 家谱管理系统需求分析:讲解家谱管理系统的基本功能需求,分析项目所需的C语言知识点。

- 课本关联章节:C语言基础知识、结构体、文件操作。

2. 数据结构设计:介绍链表等数据结构在家谱管理系统中的应用。

- 课本关联章节:数据结构、指针。

3. 功能模块设计:- 添加功能:实现添加家庭成员信息的功能。

- 删除功能:实现删除家庭成员信息的功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要本文设计了一个对数据输入,输出,储存,查找的多功能软件,本文需要保存家族的基本信息,包括姓名及它们的关系,但是由于家族信息很巨大而且关系很复杂所以采用二叉树来表示它们的关系。

并且具有保存文件的功能,以便下次直接使用先前存入的信息。

家谱的功能是查询家族每个人的信息,并且输出它们的信息,还要具有查询输出功能。

本文采用二叉树来存取家族的基本信息,头结点作为父亲节点,他的左孩子为他的妻子,妻子结点的右孩子为他的孩子,依次存储每个家庭的信息。

可以查找每个父亲的孩子和每个人的所有祖先。

关键词:二叉树家谱结点目录1 系统功能概述 (1)1.1 系统功能 (1)图2 成员二叉树功能模块图 (4)1.2 总体功能模块 (4)2 系统各功能模块的详细设计 (4)2.1功能选择 (4)2.2信息输入 (6)2.3信息输出 (7)2.4信息存盘 (7)2.5信息清盘 (8)2.6信息查询 (8)2.7源程序 (10)3设计结果与分析 (16)3.1菜单函数功能测试 (16)4.2输入功能函数测试 (16)3.3输出功能函数测试 (17)3.4清盘功能函数测试 (17)3.5存盘功能函数测试 (17)3.6查询功能函数测试 (18)总结 (19)参考文献 (20)1 系统功能概述1.1 系统功能实现的方法是先定义一个二叉树,该二叉树上的每个结点由三个元素组成:姓名、指向它左孩子的指针、以及指向它右孩子的指针构成。

该家谱管理系统将信息用文件的方法进行存储管理,再从文件中将成员信息以递归的方法创建二叉树。

该输入成员信息的方法是将父亲结点存上父亲的信息,然后父亲结点的左孩子存上母亲的信息,母亲结点的右孩子存上孩子的信息。

(1)定义结构体结构体为表示一个对象的不同属性提供了连贯一致的方法,结构体类型的说明从关键词struct开始,成员可以由各种数据类型混合构成,成员甚至还可以是数组或者其他类型的结构,但是,结构体中不能包含自身定义类型的成员。

本文定义了两个结构体,分别是家族成员和二叉树结点的结构体。

代码如下:typedef struct fnode{ char father[NAMEWIDTH];char wife[NAMEWIDTH];char son[NAMEWIDTH];}FamType;typedef struct tnode{char name[NAMEWIDTH];struct tnode *lchild,*rchild;}BTree;(2) 二叉树的建立二叉树的结点有三个域,数据域和两个指针域,数据域用来存放数据,两个指针域分别存放指向该结点左右孩子的指针。

并且还有个root结点,称二叉树的根节点。

代码如下:BTree *CreatBTree(char *root,FamType fam[],int n){int i=0,j;BTree *bt,*p;bt=(BTree *)malloc(sizeof(BTree));strcpy(bt->name,root);bt->lchild=bt->rchild=NULL;while(i<n && strcmp(fam[i].father,root)!=0)i++;if(i<n){p=(BTree *)malloc(sizeof(BTree));p->lchild=p->rchild=NULL;strcpy(p->name,fam[i].wife);bt->lchild=p;for(j=0;j<n;j++)if(strcmp(fam[j].father,root)==0){p->rchild=CreatBTree(fam[j].son,fam,n);p=p->rchild;}}return(bt);}(3)家族成员信息的输入依次输入一个家庭的父亲、母亲和孩子的姓名。

并将它们保存在相应的文件里。

(4)家族成员信息的输出依次输出每个家庭的父亲、母亲和孩子的姓名。

(5)查找某人的儿子首先输入父亲的姓名,在二叉树中查找是否有此人,如果没有就输出不存在这样的父亲。

如果有就先查看它的左孩子是否存在,不存在就输出这个父亲没有妻子,如果存在就查找左孩子的右孩子,没有右孩子就输出这个父亲没有孩子,存在就输出右孩子的姓名,即为查找到的儿子。

(6)查找某人的祖先采用后序非递归遍历方法输入从根结点到*s结点的路径,首先输入一个成员的姓名,用一个栈存入查找的路径,当找到时栈中的元素即为它的所有祖先。

该家谱管理系统将各个家庭的信息以文件的形式存储,具体步骤如下图:文件输入输入父亲、母亲和儿子的姓名保存图1 文件存储功能模块图该家谱管理系统还将各个成员的信息以及成员之间的关系存储在二叉树上,具体存储方式如下图:父亲母亲儿子1儿子2图2 成员二叉树功能模块图1.2 总体功能模块图3 总体功能模块图2 系统各功能模块的详细设计2.1功能选择功能选择模块函数,主要提供1:文件 2:家谱两个功能模块让用户选择。

输入数字1的时候,出现界面1:输入 2:输出 9:清盘 0:存盘返回。

返回后输入数字2,出现界面1:找某人的所有儿子 2:找某人所有祖先。

用户根据自己的需求选择void main(){BTree *bt;FamType fam[MaxSize];int n,sel,sell;ReadFile(fam,n);do{printf("1.文件操作2.家谱操作0.退出请选择:");scanf("%d",&sel);switch(sel){case 1:do{printf("1:输入2:输出9:全清0:存盘返回请选择:");scanf("%d",&sell);switch(sell){case 9:DelAll(fam,n);break;case 1:InputFam(fam,n);break;case 2:OutputFile(fam,n);break;case 0:SaveFile(fam,n);break;}}while (sell!=0);break;case 2:bt=CreatBTree("f1",fam,n);do{printf("1.找某人所有儿子2.找某人所有祖先0:返回请选择:");scanf("%d",&sell);switch(sell){case 1:FindSon(bt);break;case 2:printf(" >>");Ancestor(bt);break;}}while(sell!=0);break;}}while(sel!=0);}2.2信息输入信息输入模块函数,出现界面请输入父亲、母亲和儿子的姓名让用户输入信息。

代码如下:void InputFam(FamType fam[],int &n){printf(" >>输入父亲、母亲和儿子姓名:");scanf("%s%s%s",fam[n].father,fam[n].wife,fam[n].son);n++;}2.3信息输出信息输出模块函数,自动输出数据的信息及它们之间的家谱关系。

按顺序输出父亲,母亲,儿子。

代码如下:void OutputFile(FamType fam[],int n){int i;if(n<0){printf(" >>没有任何记录\n");return;}for(i=0;i<n;i++)printf(" >>%10s%10s%10s\n",fam[i].father,fam[i].wife,fam[i].son);}2.4信息存盘信息存盘模块函数,将用户输入的信息存盘,下次要用时自动调用。

代码如下:void SaveFile(FamType fam[],int n){int i;FILE *fp;if((fp=fopen("fam.dat","wb"))==NULL){printf(" >>数据家谱文件不能打开\n");return;}for(i=0;i<n;i++)fwrite(&fam[i],sizeof(FamType),1,fp);fclose(fp);}2.5信息清盘信息清盘模块函数,将用户输入的信息全部清盘。

代码如下:void DelAll(FamType fam[],int &n){FILE *fp;if((fp=fopen("fam.dat","wb"))==NULL){printf(" >>不能打开家谱文件\n");return;}n=0;fclose(fp);}2.6信息查询信息查询模块函数,查询用户输入数据的信息及家谱关系。

具有的功能是1:找某人所有儿子2:找某人所有祖先。

用户根据需要操作。

找某人所有儿子的代码:void FindSon(BTree *bt){char xm[NAMEWIDTH];BTree *p;printf(" >>父亲姓名:");scanf("%s",xm);p=FindNode(bt,xm);if(p==NULL)printf(" >>不存在%s的父亲!\n",xm);else{p=p->lchild;if(p==NULL)printf(" >>%s没有妻子\n",xm);else{p=p->rchild;if(p==NULL)printf(" >>%没有儿子!\n",xm);else{printf(" >>%s的儿子:",xm);while(p!=NULL){printf("%10s",p->name);p=p->rchild;}printf("\n");}}}}找某人所有祖先的代码:void Ancestor(BTree *bt){BTree *p;char xm[NAMEWIDTH];printf(" >>输入姓名:");scanf("%s",xm);p=FindNode(bt,xm);if(p!=NULL)Path(bt,p);elseprintf(" >>不存在%s\n",xm);}void DelAll(FamType fam[],int &n){FILE *fp;if((fp=fopen("fam.dat","wb"))==NULL){printf(" >>不能打开家谱文件\n");return;}n=0;fclose(fp);}2.7源程序#include <stdio.h>#include <string.h>#include <stdlib.h>#define MaxWidth 40#define MaxSize 30#define NAMEWIDTH 10typedef struct fnode{ char father[NAMEWIDTH];char wife[NAMEWIDTH];char son[NAMEWIDTH];}FamType;typedef struct tnode{char name[NAMEWIDTH];struct tnode *lchild,*rchild;}BTree;BTree *CreatBTree(char *root,FamType fam[],int n) {int i=0,j;BTree *bt,*p;bt=(BTree *)malloc(sizeof(BTree));strcpy(bt->name,root);bt->lchild=bt->rchild=NULL;while(i<n && strcmp(fam[i].father,root)!=0)i++;if(i<n){p=(BTree *)malloc(sizeof(BTree));p->lchild=p->rchild=NULL;strcpy(p->name,fam[i].wife);bt->lchild=p;for(j=0;j<n;j++)if(strcmp(fam[j].father,root)==0){p->rchild=CreatBTree(fam[j].son,fam,n);p=p->rchild;}}return(bt);}BTree *FindNode(BTree *bt,char xm[]){BTree *p=bt;if(p==NULL)return(NULL);else{if(strcmp(p->name,xm)==0)return(p);else{bt=FindNode(p->lchild,xm);if(bt!=NULL)return(bt);elsereturn(FindNode(p->rchild,xm));}}}void FindSon(BTree *bt){char xm[NAMEWIDTH];BTree *p;printf(" >>父亲姓名:");scanf("%s",xm);p=FindNode(bt,xm);if(p==NULL)printf(" >>不存在%s的父亲!\n",xm);else{p=p->lchild;if(p==NULL)printf(" >>%s没有妻子\n",xm);else{p=p->rchild;if(p==NULL)printf(" >>%没有儿子!\n",xm);else{printf(" >>%s的儿子:",xm);while(p!=NULL){printf("%10s",p->name);p=p->rchild;}printf("\n");}}}}int Path(BTree *bt,BTree *s){BTree *St[MaxSize];BTree *p;int i,flag,top= -1;do{while(bt){top++;St[top]=bt;bt=bt->lchild;}p=NULL;flag=1;while(top!=-1 && flag){bt=St[top];if(bt->rchild==p){if(bt==s){printf(" >>所有祖先:");for(i=0;i<top;i++)printf(" %s ",St[i]->name);printf("\n");return 1;}else{top--;p=bt;}}else{bt=bt->rchild;flag=0;}}}while(top!=-1);return 0;}void Ancestor(BTree *bt){BTree *p;char xm[NAMEWIDTH];printf(" >>输入姓名:");scanf("%s",xm);p=FindNode(bt,xm);if(p!=NULL)Path(bt,p);elseprintf(" >>不存在%s\n",xm);}void DelAll(FamType fam[],int &n){FILE *fp;if((fp=fopen("fam.dat","wb"))==NULL){printf(" >>不能打开家谱文件\n");return;}n=0;fclose(fp);}void ReadFile(FamType fam[],int &n){FILE *fp;long length;int i;if((fp=fopen("fam.dat","rb"))==NULL){n=0;return;}fseek(fp,0,2);length=ftell(fp);rewind(fp);n=length/sizeof(FamType);for(i=0;i<n;i++)fread(&fam[i],sizeof(FamType),1,fp);fclose(fp);}void SaveFile(FamType fam[],int n){int i;FILE *fp;if((fp=fopen("fam.dat","wb"))==NULL){printf(" >>数据家谱文件不能打开\n");return;}for(i=0;i<n;i++)fwrite(&fam[i],sizeof(FamType),1,fp);fclose(fp);}void InputFam(FamType fam[],int &n){printf(" >>输入父亲、母亲和儿子姓名:");scanf("%s%s%s",fam[n].father,fam[n].wife,fam[n].son);n++;}void OutputFile(FamType fam[],int n){int i;if(n<0){printf(" >>没有任何记录\n");return;}for(i=0;i<n;i++)printf(" >>%10s%10s%10s\n",fam[i].father,fam[i].wife,fam[i].son); }void main(){BTree *bt;FamType fam[MaxSize];int n,sel,sell;ReadFile(fam,n);do{printf("1.文件操作2.家谱操作0.退出请选择:");scanf("%d",&sel);switch(sel){case 1:do{printf("1:输入2:输出9:全清0:存盘返回请选择:");scanf("%d",&sell);switch(sell){case 9:DelAll(fam,n);break;case 1:InputFam(fam,n);break;case 2:OutputFile(fam,n);break;case 0:SaveFile(fam,n);break;}}while (sell!=0);break;case 2:bt=CreatBTree("f1",fam,n);do{printf("1.找某人所有儿子2.找某人所有祖先0:返回请选择:");scanf("%d",&sell);switch(sell){case 1:FindSon(bt);break;case 2:printf(" >>");Ancestor(bt);break;}}while(sell!=0);break;}}while(sel!=0);}3设计结果与分析3.1菜单函数功能测试系统运行后就会自动显示如图3-1的主菜单,选项包括:1、文件,2、家谱,0、退出,。

相关文档
最新文档