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

合集下载

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

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

宁波大红鹰学院信息工程学院课程设计报告项目名称:家谱查询系统项目组长:白钰琦项目成员:徐程凯、徐海域、项鸿伟班级名称:10计科1班专业名称:计算机科学与技术完成时间: 2012年12月1日信息工程学院制目录一、案例描述.................................................... - 3 -1、总体描述................................................. - 3 -2、模块描述................................................. - 3 -二、设计思路.................................................... - 3 -三、程序设计.................................................... - 4 -1、数据结构描述............................................. - 4 -2、主函数及其流程图......................................... - 4 -3、源程序................................................... - 5 -四、调试与分析.................................................. - 5 -1、主菜单.................................................. - 10 -2、显示家谱信息............................................ - 11 -3、显示家谱中第n代人所有信息.............................. - 11 -4、按姓名查找某人并相应输出................................ - 11 -5、按出生日期查找家谱成员信息................... 错误!未定义书签。

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

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

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

排答疑和辅导。

完整代码:#include<stdio.h>#include<stdlib.h>#include<string.h>intMATEFLAG=0;//是否入赘或嫁入这家的,1表示为是,0表示否typedefstructTreeNode//树节点定义{intNum;//保存此人儿女个数charName[20];//保存此人姓名charKind;//保存此人性别,男M,女FstructTreeNode*NextNode[20];〃保存此人的儿女,NextNode[0]里存放配偶的地址structTreeNode*Parent;//保存此节点的父节点}TreeNode;voidCreatTree(TreeNode*Tree);//创建树voidOutPutAll(TreeNode*升66);//输出树TreeNode*SearchTree(TreeNode*Tree,charname[],intlength); voidMainMenu(TreeNode*Tree);voidSubMenue1(TreeNode*Tree);voidSubMenue2(TreeNode*Tree);voidChange(TreeNode*Tree);voidAddNew(TreeNode*Tree);voidOutPutMessage(TreeNode*Tree,charname[],intlength);//主函数voidmain(){TreeNode*Tree;//产生根节点Tree=(TreeNode*)malloc(sizeof(TreeNode));Tree->Parent=NULL;strcpy(Tree->Name,"0");MainMenu(Tree);//显示主菜单}//添加新的成员voidAddNew(TreeNode*Tree){SubMenue2(Tree);//添加新成员界面}//显示添加家庭信息的界面voidSubMenue2(TreeNode*Tree){charc;intnum;charname[20];TreeNode*NewNode;getchar();while(1){system("cls");printf("请选择你的操作%");printf("A:添加某个人的子女的信息\n");printf("B:添加某个人配偶的信息\n");printf("C:退出\n");printf("请选择相应功能:\n");c=getchar();switch(c){case'A'://添加子女信息printf("请输入那个人的名字:3");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->Name!=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("请输入那个人的名字:3");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键继续操作3");getchar();getchar();}}//修改某个人的信息voidChange(TreeNode*Tree){charname[20];TreeNode*NewNode;printf("请输入你要修改的人的信息:\n");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);return;}else{SubMenue1(NewNode);}}//输出副菜单voidSubMenue1(TreeNode*Tree){charc;intflag,i;charname[20];charParent[2][20];TreeNode*NewNode;getchar();while(1){system("cls");printf("请选择你的操作%");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';elseTree->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';elseNewNode->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';elseTree->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键继续操作3");getchar();getchar();}}//输出主菜单voidMainMenu(TreeNode*Tree){charc;//用于接受用户输入的选项charname[20];while(1){5丫5{6巾("03");//清屏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键继续操作3");getchar();break;case'2':if(strcmp(Tree->Name,"0")=0){printf("家谱图还未建立请先建立%");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("家谱图还未建立请先建立㈠");getchar();break;}AddNew(Tree);getchar();break;case'4':if(strcmp(Tr ee->Name,"0")==0){printf("家谱图还未建立请先建立\n");getchar();break;}printf("整个家谱的主要信息如下:\n");OutPutAll(Tree);getchar();break;case'5':if(strcmp(Tree->Name,"0")==0){printf("家谱图还未建立请先建立%");getchar();break;}Change(Tree);getchar();break;case'6':printf("本程序结束,欢迎下次使用。

数据结构家谱管理系统

数据结构家谱管理系统

数据结构家谱管理系统该系统采用数据结构的概念和原理,以树形结构来描述家族关系。

每一个结点代表一个家族成员,包括姓名、性别、出生日期、死亡日期等基本信息,并且能够记录配偶和子女的信息。

通过构建家族树,用户可以清晰地了解家族人员之间的血缘关系和世代关系。

系统的主要功能包括:1.成员管理:用户可以添加、删除和修改家族成员的信息。

系统提供友好的界面,以便用户能够直观地操作。

用户可以输入成员的基本信息,如姓名、性别、出生日期等,并且可以添加配偶和子女的信息。

2.成员查找:用户可以根据姓名、出生日期等条件,对成员进行查询操作。

系统将根据用户输入的条件,快速找到符合条件的成员,并将其信息展示给用户。

用户可以通过查找功能,方便地找到特定成员的详细信息。

3.家族树展示:通过家族树展示功能,用户可以直观地了解家族的基本结构和成员关系。

系统将家族成员按照世代排列,通过树状图展示。

用户可以通过点击树中的结点,进一步查看该成员的详细信息。

4.信息统计:系统可以根据用户需要,进行一些基本的统计分析。

比如,系统可以统计家族的总人数、男女比例、平均寿命等信息,以便用户了解家族的整体情况。

5. 数据导出:为了方便用户保存和共享家族信息,系统提供数据导出功能。

用户可以将家族信息导出为Excel、CSV等格式的文件,以便在其他应用程序中使用。

总之,数据结构家谱管理系统通过数据结构的概念和原理,提供了一种直观、高效的方式来管理家族的信息。

它可以帮助用户了解家族结构、查找成员、进行统计分析,并方便地将数据导出保存。

希望这个系统能够帮助用户更好地管理和维护家族的信息,传承家族的文化和价值观。

数据结构-家谱管理系统

数据结构-家谱管理系统

数据结构-家谱管理系统数据结构家谱管理系统在当今数字化的时代,信息管理变得越来越重要,而家谱作为家族历史和传承的重要记录,也需要一种有效的管理方式。

一个高效的家谱管理系统能够帮助我们更好地保存、查询和分析家族信息,增强家族成员之间的联系和认同感。

接下来,让我们深入探讨一下家谱管理系统所涉及的数据结构和功能。

首先,我们来了解一下什么是数据结构。

简单来说,数据结构是指数据元素之间的关系和组织方式。

在家谱管理系统中,我们需要选择合适的数据结构来存储和操作家族成员的信息。

一种常见的数据结构选择是树形结构。

家谱本身就具有天然的层次关系,从祖先开始,逐渐分支到子孙后代。

我们可以将每个家族成员看作一个节点,通过父子关系将节点连接起来,形成一棵家族树。

这种树形结构能够清晰地展示家族的分支和传承关系。

为了实现树形结构,我们可以使用链表或者数组来存储节点信息。

链表的优点是插入和删除节点比较方便,适合家族成员信息的动态变化。

而数组则可以更高效地随机访问节点,但在插入和删除操作时可能需要移动大量元素。

在家谱管理系统中,每个家族成员的节点应该包含哪些信息呢?至少要包括姓名、性别、出生日期、婚姻状况等基本信息。

此外,还可以添加照片、个人简介、联系方式等扩展信息,以丰富家族成员的资料。

除了存储家族成员的信息,家谱管理系统还需要提供强大的查询功能。

用户可能想要查找特定姓名的家族成员,或者查找某个时间段出生的成员,甚至是查找具有特定亲属关系的成员。

为了实现这些查询功能,我们可以在数据结构中建立索引,例如按照姓名建立哈希索引,按照出生日期建立排序索引等。

这样可以大大提高查询的效率。

另外,家族关系的计算也是家谱管理系统的一个重要功能。

比如,计算两个家族成员之间的亲属关系远近,判断是否存在共同的祖先等。

这需要我们在树形结构的基础上进行深度优先搜索或者广度优先搜索等算法的应用。

在数据存储方面,我们可以选择将家谱数据存储在本地文件中,如XML 或者 JSON 格式,也可以选择将数据存储在数据库中,如关系型数据库 MySQL 或者非关系型数据库 MongoDB。

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

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

家谱管理系统——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("本程序结束,欢迎下次使用。

数据结构_家谱管理系统

数据结构_家谱管理系统

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

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

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

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

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

三、系统设计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)摘要随着计算机科学技术、计算机产业的迅速发展,计算机的应用普及也在以惊人的速度发展,计算机应用已经深入到人类社会的各个领域。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

而现实生活中,更多的是非数值计算问题,如手机中的通讯录,人们对它的操作主要是查找、增加、删除或者修改记录。

再如,人们经常在互联网上查阅各种新闻,或查阅电子地图,人们可以在某城区地图上查找自己所需的街道或店铺,其操作主要是搜索和查询。

下面再来分析几个典型实例,它们的主要特点是:不同实例的数据元素之间存在不同的关系;对数据信息的处理主要有插入、删除、排序、检索等。

关键词:网络化;计算机;对策;二叉树引言课程设计的目的:通过本项课程设计,培养学生独立思考、综合运用所学有关相应知识的能力,使学生巩固《数据结构》课程学习的容,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关;为了培养学生综合运用所学知识、独立分析和解决实际问题的能力,培养创意识和创新能力,使学生获得科学研究的基础训练。

为后续各门计算机课程的学习和毕业设计打下坚实基础。

同时,可以利用这次机会来检验自己的c/c++/数据结构水平,提高自己的写作水平,锻炼自己的动手能力。

而此次课程设计的意义在于:增强自己的动手能力,熟悉和掌握二叉树各种遍历的算法,以及递归在遍历二叉树中的应用,增强自己的调试程序和测试程序的能力。

1 需求分析1.1任务与分析1.建立输入文件以存放最刜家谱中各成员的信息。

2.成员的信息中均应包含以下容:、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加其它信息、但不是必需的。

3.能对修改后的家谱存盘以备以后使用。

4.能从文件中读出已有的家谱,形成树状关系。

5.家谱建立好之后,以图形方式显示出来。

6.显示第n 代所有人的信息。

7.按照查询,输出成员信息(包括其本人、父亲、孩子的信息)。

8.按照出生日期查询成员。

9.输入两人,确定其关系。

10.给某人添加孩子。

11.删除某人(若其还有后代,则一并删除)。

12.修改某人信息。

13.用括号法输出家谱成员信息1.2测试数据1 徐朝嬴 m 1938-1-20 1 代芳 0 此人相当的热心 02345 100002 徐廷文 m 1964-8-3 2 太群 1 此人相当有责任心 0 6 7 100003 徐素华 w 1966-4-6 2 奉光 1 此人很好0 100004 徐军华 m 1969-7-8 2 曲舞 1 此人很有正义感 0 100005 徐廷国 m 1972-9-2 2 木玛 1 此人心的很善良 0 100006 徐光勇 m 1989-1-27 3 Nomarry 2 此人很牛逼0 100007 徐光超 m 1992-9-5 3 Nomarry 2 此人亦很牛逼 0 100002 概要设计2.1 ADT描述1.ADT Person{数据对象:D={Pj | Pj={、出生日期、婚否、地址、健在否(如过世,还应有其死亡日期)},j=0,1,2,…… n,其中n>=0}数据关系:R={} 基本操作:无。

}ADT Person2.ADT FamilytreeFile{数据对象:D={Aj | Aj 属于 Person,j=1,2,3,……,n 其中n>=1}数据关系:D 中每个对象用换行符隔开, R={ | Aj 属于D,j=1,2,3,……,n 其中n>=1,String 属于字符串类型,为 Aj 父亲(若String=-1,Aj 无父亲,若String=Aj 的,表示家谱文件结束)}基本操作: 1.打开家谱类型文件,并建立兄弟、孩子二叉树。

2.从存中读取兄弟、孩子二叉树,并建立家谱类型文件。

}ADT FamilytreeFlie3.ADT Familytree{数据对象:D={Aj | Aj 属于Person,j=1,2,3,……,n 其中n>=0}数据关系:V={ | Aj-1,Aj 属于D,j=2,3,……,n 其中n>=2,且Aj-1 与Aj 为祖先与后代关系(parent)、后代与祖先关系(child)、兄弟之间关系(sibling)}基本操作: 1.显示某人信息。

2.修改某人信息。

3.增加某人孩子。

4.删除某人。

5.通过某人查找其双亲、孩子、兄弟。

}ADT Familytree2.2程序模块结构2.2.1 结构体定义struct People //定义结构体People{int num;char name[20];char sex;char borndate[15];int generation;char matename[20];int parent;char infor[100];LinkList child;};struct Node //定义结构体Node {int a;struct Node * next;};struct LinkList //定义链表{NodePoint La;};struct Tree //定义树PeoplePoint Tr; int Length;int TREE_INIT_SIZE; };2.3 各功能模块void InitTree(Tree &TR);//在树已定义的情况下,初始化树TRLinkList InitLinkList(void);//在什么都没有的情况下,初始化一个带头结点的链表并返回链表Lvoid AddLinkList(LinkList p);//对带头结点的链表pl,添加一个节点为m的节点在表头void CreatFamilyTree(Tree &TR);//在什么都没有的情况下,创建一个家谱TR。

并返回TRvoid PrintPeople(PeoplePoint p);// 已知某节点的指针p,输出people p 的相关信息void PrintLinkList(LinkList p);//已知链表p,输出链表p中的信息int CompareNum(PeoplePoint p,int num);//已知某节点的指针p和一个编号num,比较p的num和num,如果相等返回1,否则返回0int CompareName(PeoplePoint p,char a[]);//已知某节点的指针p和一个a,比较p的name,如果两者相等返回1,否则返回0void TraveTreePrint(Tree TR);//已知树TR,按规定输出节点信息,根据编号、、孩子输出void AddPeople(Tree &TR);//已知树TR,当有人出生时,添加一个节点void MarryChange(Tree TR,char name[20]);//已知树TR和一个人的name,因为结婚需要改变节点中的配偶一栏void Open(Tree &TR);//打开保存家谱信息的文件void Save(Tree TR);//保存家谱信息到指定文件void PrintTree(Tree TR);//输出家谱中所有成员的信息3 详细设计3.1结构体定义struct People //定义结构体People{int num;char name[20];char sex;char borndate[15];int generation;char matename[20];int parent;char infor[100];LinkList child;};struct Node //定义结构体Node{int a;struct Node * next;};struct LinkList //定义链表{NodePoint La;};struct Tree //定义树{PeoplePoint Tr;int Length;int TREE_INIT_SIZE;};3.2 初始化void InitTree(Tree &TR) //在树已定义的情况下,初始化树TR {People peop[INIT_SIZE];TR.Tr=peop;TR.Length=0;TR.TREE_INIT_SIZE=INIT_SIZE;}LinkList InitLinkList(void)//在什么都没有的情况下,初始化一个带头结点的链表并返回链表L{LinkList L;NodePoint Head;Head=(NodePoint)malloc(sizeof(Node));Head->a=0;Head->next=NULL;=Head;return (L);}void CreatFamilyTree(Tree &TR) //在什么都没有的情况下,创建一个家谱TR。

并返回TR{LinkList lp;TR.Tr=peop;TR.Length=0;TR.TREE_INIT_SIZE=INIT_SIZE;int i=0,n,j,k,c;cout<<"请输入家谱中一共有多少人\n";cin>>n;TR.Length=n;for(i=0;i<n;i++){(peop[i].num)=i+1;cout<<"请输入该人的:\n";cin>>peop[i].name;cout<<"请输入该人的性别:\n";cin>>peop[i].sex;cout<<"请输入该人的出生日期:\n";cin>>peop[i].borndate;cout<<"请输入该人是第几代人:\n";cin>>peop[i].generation;cout<<"请输入其配偶的,如无则输入Nomarry\n"; cin>>peop[i].matename;cout<<"请输入其双亲的编号:\n";cin>>peop[i].parent;cout<<"请输入该人相关的备注信息:\n";cin>>peop[i].infor;LinkList L;NodePoint Head;Head=(NodePoint)malloc(sizeof(Node));Head->a=0;Head->next=NULL;=Head;peop[i].child=L;lp=peop[i].child;cout<<"请输入其孩子的个数:\n"; cin>>k;for(j=0;j<k;j++){cout<<"请输入孩子的编号:\n"; cin>>c;AddLinkList(lp,c);}}}3.3 插入操作void AddPeople(Tree &TR)//已知树TR ,当有人出生时,添加一个节点 {int k,c,j,m; LinkList L,L1,L2; NodePoint Head; PeoplePoint p1,p2,p3;if(TR.Length>=TR.TREE_INIT_SIZE){TR.Tr=(PeoplePoint)realloc(TR.Tr,(TR.TREE_INIT_SIZE+TREEINCREMENT)*L EN);if(!TR.Tr) exit(OVERFLOW);}p1=peop;p2=p1+(TR.Length);p2->num=TR.Length+1;cout<<"请输入该人的:\n";gets(p2->name);cout<<"请输入该人的性别:\n";cin>>p2->sex;cout<<"请输入该人的出生日期:\n";cin>>p2->borndate;cout<<"请输入该人是第几代人:\n";cin>>p2->generation;cout<<"请输入其配偶的,如无则输入Nomarry\n"; gets(p2->matename);cout<<"请输入其双亲的编号:\n";cin>>p2->parent;cout<<"请输入该人相关的备注信息:\n";gets(p2->infor);gets(p2->infor);Head=(NodePoint)malloc(sizeof(Node));Head->a=0;Head->next=NULL;=Head;p2->child=L;L1=p2->child;cout<<"请输入其孩子的个数:\n"; cin>>k;for(j=0;j<k;j++){cout<<"请输入孩子的编号:\n"; cin>>c;AddLinkList(L1,c);}m=p2->parent-1;p3=p1+m;L2=p3->child;AddLinkList(L2,p2->num);TR.Length=TR.Length+1;cout<<"添加成功\n";}3.4 查询操作void TraveTreePrint(Tree TR)//已知树TR,按规定输出节点信息,根据编号、、孩子输出{PeoplePoint p;int i,j,k,Flag;char name1[15],name2[15];p=TR.Tr;printf("根据编号查找请输入1,根据查找请输入2,根据孩子查找请输入3:\n");scanf("%d",&i);if(i==1){printf("请输入该节点的编号:\n");scanf("%d",&k);for(j=0;j<TR.Length;j++){Flag=CompareNum((p+j),k);if(Flag)PrintPeople((p+j));}}if(i==2){printf("请输入该人的:\n"); gets(name1);gets(name1);for(j=0;j<TR.Length;j++){Flag=CompareName((p+j),name1); if(Flag)PrintPeople((p+j));}}if(i==3){printf("请输入其孩子的:\n"); gets(name2);gets(name2);for(j=0;j<TR.Length;j++){if(strcmp(peop[j].name,name2)==0)PrintPeople((p+(peop[j].parent-1)));}}}4 调试分析在调试时,遇到的几个问题如下:1)建立树时,由于新申请结点的孩子指针、兄弟指针、及双亲指针均未赋空值。

相关文档
最新文档