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

合集下载

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

家谱管理系统-数据结构大作业
printf("\t 女 "); if(T->live)
printf("\t 健在 \n"); if(!T->live)
printf("\t 去世于 :%s\n",T->livemassage);*/ PrintInfo(T); PreOrderTraverse_recursion(T->lc); PreOrderTraverse_recursion(T->rc); }
T = NULL; fscanf(in,"%c",&ch); } else { T = (BiTree)malloc(sizeof(BiTNode));
//fscanf(in,"%s%s%s%d%d",nametemp,birthdaytemp,addresstemp,&marriagetemp,&livetemp); fscanf(in,"%s",nametemp); strcpy(T->name,nametemp); fscanf(in,"%s",birthdaytemp); strcpy(T->birthday,birthdaytemp); fscanf(in,"%s",addresstemp); strcpy(T->address,addresstemp); fscanf(in,"%d%d%d%d",&marriagetemp,&livetemp,&leveltemp,&sextemp); T->marriage = marriagetemp; T->live = livetemp; T->level = leveltemp; T->sex = sextemp;

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

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

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

排答疑和辅导。

完整代码:#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("本程序结束,欢迎下次使用。

数据结构-家谱管理系统

数据结构-家谱管理系统

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

可。

基本功能如下:(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函数得到双亲结点。

数据结构课程设计(家族关系查询系统)

数据结构课程设计(家族关系查询系统)

数据结构课程设计(家族关系查询系统)1 课程设计介绍1.1课程设计项目简介家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书载体。

家谱是中国特有的文化遗产,是中华民族的三大文献之一,属珍贵的人文资料,对于历史学,民俗学,人口学,社会学和经济学的深入研究,均有不可替代的重要功能。

本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息、插入家族成员等功能。

1.2课设题目分析本程序的实质是完成对家谱成员信息的建立、查找、插入等功能。

可以首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。

本程序包含以下几个模块(1)建立家族关系树。

此模块将构建一个家族关系,对数据初始化,构造关系树并录入数据一遍后续程序使用。

(2)添加新成员。

此模块将添加一个新成员,实现对家族关系的修改。

(3)家族关系的查询。

此模块将实现对家族不同关系的查询(4)主程序模块。

此模块实现整个程序的进入和进出,以及各种初始化处理。

(5)1.3课程题目原理与数据结构因为家族的成员之间存在一个对多个的层次结构关系,所以不能用线性表来表示和实现。

家谱从形状上看像一颗倒长的树,所以用树结构来表示比较合适。

树形结构是一类非常重要的非线性数据结构,直观看来树是以分支关系定义的层次结构。

因此本课程设计可以采用的数据结构有树状结构和队列。

树状结构采用三叉链表来实现,队列采用链式队列实现。

21.4功能分析说明图34struct Node *rear; /* 尾指针*/}LinkQueue;DataType fname[MAXNUM],family[50][MAXNUM];/* 全局变量*/2.1.2 链队的基本操作LinkQueue *LQueueCreateEmpty( )/* 建立一个空队列*/{LinkQueue *plqu=(LinkQueue*)malloc(sizeof(LinkQueue));if (plqu!=NULL)plqu->front=plqu->rear=NULL;else{printf("内存不足!\n");return NULL;}return plqu;}int LQueueIsEmpty(LinkQueue *plqu)/* 判断链接表示队列是否为空队列*/{return(plqu->front==NULL);}void LQueueEnQueue(LinkQueue *plqu,TriTree *x)/* 进队列*/ {Node *p=(Node *)malloc(sizeof(Node));if(p==NULL)printf("内存分配失败!\n");else{p->info=x;p->next=NULL;if(plqu->front==NULL)/* 原来为空队*/plqu->front=p;elseplqu->rear->next=p;5plqu->rear=p;}}int LQueueDeQueue(LinkQueue *plqu,TriTree *x)/* 出队列*/ {Node *p;if(plqu->front==NULL){printf("队列空!\n");return ERROR;}else{p=plqu->front;x=p->info;plqu->front=plqu->front->next;free(p);return OK;}}TriTree *LQueueGetFront(LinkQueue *plqu)/* 在非空队列中求队头元素*/{return(plqu->front->info);}2.2建立家族关系2.2.1建立家族关系并存入文件基本思想:首先输入家族关系的名称,以此名称为文件名,建立文本文件接下来按层次输入结点信息,输入一个在文件中写入一行同时将输入的信息保存到二位字符数组family中。

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

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

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

数据结构 家族管理系统

数据结构 家族管理系统

数据结构家族管理系统数据结构家族管理系统1.引言介绍家族管理系统的背景及目的。

说明数据结构在该系统中的重要性。

2.需求分析2.1 功能需求2.1.1 用户管理:包括添加、编辑、删除用户信息,以及权限管理。

2.1.2 家族信息管理:包括添加、编辑、删除家族成员的信息,以及家族树的展示。

2.1.3 事件管理:记录家族发生的重要事件,如生日、婚礼等,方便用户查看。

2.1.4 搜索功能:支持根据关键字搜索家族成员信息。

2.1.5 数据统计:提供各种统计报表,如家族成员数量、年龄分布等信息。

2.1.6 系统设置:包括用户权限设置、界面主题设置等。

2.2 性能需求2.2.1 数据存储:支持大量数据的快速存储和检索。

2.2.2 响应时间:用户操作的响应时间应在秒级范围内。

2.2.3 并发访问:支持多个用户同时对系统进行操作。

3.概要设计3.1 系统结构3.1.1 前端界面:负责与用户的交互,采用响应式设计,支持不同终端的访问。

3.1.2 后端服务:处理用户请求,调用数据存储层进行数据操作。

3.1.3 数据存储层:负责数据的存储和检索。

3.2 数据结构设计3.2.1 用户信息数据结构:包括用户ID、用户名、密码、权限等字段。

3.2.2 家族成员信息数据结构:包括成员ID、姓名、性别、生日、家族关系等字段。

3.2.3 事件信息数据结构:包括事件ID、事件名称、发生时间、相关成员等字段。

4.详细设计4.1 用户管理模块设计4.1.1 用户登录:用户输入用户名和密码进行登录验证。

4.1.2 用户权限管理:根据用户权限控制对系统功能的访问。

4.1.3 用户信息管理:提供添加、编辑、删除用户信息的功能。

4.2 家族信息管理模块设计4.2.1 家族成员信息管理:提供添加、编辑、删除家族成员信息的功能。

4.2.2 家族树展示:使用树形结构展示家族成员的关系。

4.2.3 家族成员搜索:根据关键字搜索家族成员的信息。

4.3 事件管理模块设计4.3.1 事件记录:用户可添加、编辑、删除家族发生的重要事件。

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

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

数据结构(二叉树)家谱管理系统数学与计算机学院课程设计说明书课程名称: 数据结构与算法课程设计课程代码:题目: 二叉树生成家谱年级/专业/班:学生姓名:学号:开始时间: 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)摘要随着计算机科学技术、计算机产业的迅速发展,计算机的应用普及也在以惊人的速度发展,计算机应用已经深入到人类社会的各个领域。

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

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

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

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

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

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

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

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

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

家谱管理系统数据结构(两篇)2024

家谱管理系统数据结构(两篇)2024

引言概述:家谱管理系统是一种用于管理和记录家族历史数据的工具。

它通过组织和存储家族成员的信息,包括个人资料、家庭关系和血统关系等数据,帮助家族成员更好地了解和维护其家族传统。

数据结构在家谱管理系统中起着重要的作用,它决定了系统的性能和效率。

在上一篇《家谱管理系统数据结构(一)》中我们介绍了家谱管理系统的基本数据结构,包括树和图。

在本文中,我们将深入研究家谱管理系统的数据结构,包括链表、数组、堆和哈希表,以及它们在家谱管理系统中的应用。

正文内容:一、链表1.链表的定义和基本操作,如插入、删除和查找节点等。

2.单向链表、双向链表以及循环链表的特点及适用场景。

3.在家谱管理系统中,链表可以用来存储家族成员的个人资料和家庭关系,形成一个有序的数据结构。

4.链表的优缺点分析,包括插入和删除速度快,但查找的效率低。

二、数组1.数组的定义和基本操作,包括插入、删除和查找元素等。

2.静态数组和动态数组的区别以及在家谱管理系统中的选择。

3.数组的存储方式和访问特点,以及对系统性能的影响。

4.数组的优缺点分析,包括查找速度快,但插入和删除的效率较低。

三、堆1.堆的定义和基本操作,如插入和删除堆顶元素等。

2.最大堆和最小堆的特点及适用场景。

3.在家谱管理系统中,堆可以用来维护家族成员之间的优先级关系,例如根据年龄进行排名。

4.堆的优缺点分析,包括快速找到最大(小)元素,但插入和删除的效率较低。

四、哈希表1.哈希表的定义和基本操作,如插入、删除和查找元素等。

2.哈希函数的设计原则和方法,以及冲突解决的技术。

3.在家谱管理系统中,哈希表可以用来快速查找家族成员的信息,例如根据姓名或者ID进行查找。

4.哈希表的优缺点分析,包括查找速度快,但对存储空间的利用率较低。

五、总结家谱管理系统作为一种用于管理和记录家族历史数据的工具,数据结构在其中起着重要的作用。

本文介绍了家谱管理系统中常用的数据结构,包括链表、数组、堆和哈希表,以及它们在系统中的应用。

数据结构家谱管理系统表[精编版]

数据结构家谱管理系统表[精编版]

数据结构家谱管理系统表[精编版]《项目实训二》项目名称__ 家谱管理系统__ 姓名__ ___________ 班级 __ _______________ 学号__ ________________ 指导教师__ __________ __2018.1模块划分:1、统计模块(1)统计家族总人数、健在人数、几代人(2)主要函数:int Generation(Node *root); //这个家族共有几代人int NumberOfPeople( ); //家族的总人数int LifeNum( ); //健在人数(3)实现方法:静态成员变量(4)实现结果:2、更新模块(1)创建家谱、增加成员、删除成员、成员改名(2)主要函数:Node* Creat( ); //构造函数调用void AddNewPeople(Node *root,string FatherName,string NAme); //增加新的家族成员int DeletePeople(Node *root,string FatherName,string Deletepeople);//删除家族成员int SetNewName(Node *root,string NAme,string NewName); //更改姓名(3)实现方法:创建家谱和成员改名主要通过递归调用;增加成员和3、查询模块(1)查询成员详细信息、查询成员的孩子以及孩子的详细信息(2)主要函数:int Message(Node *root,string Name); //显示该成员的基本信息int FindChild(Node *root,string NAme); //显示孩子信息(3)实现方法:通过递归调用,找到成员,输出相应的信息4、显示模块(1)前序、中序、后序遍历家谱(2)主要函数:void PreOrder(Node *root); //前序递归遍历输出家谱void InOrder(Node *root); //中序递归遍历输出家谱void PostOrder(Node *root); //后序递归遍历输出家谱(3)实现方法:递归遍历(4)实现结果:5、文件模块(1)保存到文件、从文件读取void SaveToFile(Node *root); //保存到文件void FileToFamilyTree( Node *root) ; //从文件中读取(3)实现方法:文件流(4)实现结果:实验结果及分析1、创建家谱2、保存到文件3、读取文件4、增加成员5、基本信息6、查询成员信息7、成员改名8、遍历家谱9、查询孩子信息10、删除成员。

数据结构_家谱管理系统

数据结构_家谱管理系统

数据结构_家谱管理系统家谱是记录一个家族的血缘关系和历史的重要文化遗产。

传统的家谱管理方式通常是以纸质形式存在,随着科技的发展,数字化的家谱管理系统逐渐兴起。

本篇文章将介绍一个基于数据结构的家谱管理系统的设计与实现。

一、需求分析家谱管理系统的主要功能包括:1. 家族成员的添加、删除和修改;2. 家族成员之间的关系建立与维护;3. 家族成员信息的查询与展示;4. 家族历史的记录与维护。

二、系统设计1. 数据结构选择在设计家谱管理系统时,我们可以选择不同的数据结构来存储家族成员的信息和关系。

常见的数据结构有链表、树和图等。

考虑到家族成员之间具有明确的父子关系,我们选择使用树这一数据结构来存储家族成员的信息。

2. 树的设计与实现家谱管理系统中的树可以采用多叉树的结构,每一个节点表示一个家族成员,节点之间的边表示父子关系。

每一个节点包含成员的基本信息,如姓名、性别、出生日期等。

此外,我们可以添加一些额外的字段来记录其他相关信息,如职业、教育背景等。

3. 树的操作家谱管理系统需要实现一些基本的树操作,包括:- 添加成员:根据家族成员的父子关系,在树中添加新的节点。

- 删除成员:删除指定节点及其子节点。

- 修改成员信息:更新指定节点的信息。

- 查询成员信息:根据成员的姓名或者其他关键字,在树中进行遍历查找。

- 显示家族树:以树的结构展示整个家族的成员关系。

三、系统实现家谱管理系统可以使用编程语言来实现,如Java、Python等。

以下是一个简单的Java代码示例:```javaclass FamilyMember {String name;String gender;String birthdate;// 其他成员信息字段List<FamilyMember> children;public FamilyMember(String name, String gender, String birthdate) { = name;this.gender = gender;this.birthdate = birthdate;this.children = new ArrayList<>();}public void addChild(FamilyMember child) {this.children.add(child);}// 其他成员操作方法}class FamilyTree {FamilyMember root;public FamilyTree(FamilyMember root) {this.root = root;}// 其他树操作方法}public class GenealogyManagementSystem {public static void main(String[] args) {// 创建家族成员FamilyMember grandpa = new FamilyMember("Grandpa", "Male", "1950-01-01");FamilyMember father = new FamilyMember("Father", "Male", "1975-01-01");FamilyMember mother = new FamilyMember("Mother", "Female", "1980-01-01");FamilyMember child1 = new FamilyMember("Child1", "Male", "2000-01-01");FamilyMember child2 = new FamilyMember("Child2", "Female", "2005-01-01");// 建立成员关系grandpa.addChild(father);grandpa.addChild(mother);father.addChild(child1);father.addChild(child2);// 创建家族树FamilyTree familyTree = new FamilyTree(grandpa);// 其他操作}}```四、系统扩展与优化1. 数据存储:可以将家族成员的信息存储在数据库中,以便实现更复杂的查询和统计功能。

家谱管理系统数据结构

家谱管理系统数据结构

家谱管理系统数据结构1.引言本章节介绍家谱管理系统的概述,包括背景、目的和范围。

2.功能需求本章节了家谱管理系统的功能需求,包括:2.1 家族成员管理:包括添加、删除、查询、修改家族成员的基本信息。

2.2 家族关系管理:包括建立、编辑、删除成员之间的家族关系。

2.3 家谱展示:提供家谱的可视化展示,方便用户浏览和查看。

2.4 数据统计分析:对家族成员的数据进行统计和分析,提供相关报表和图表。

3.数据结构设计本章节描述了家谱管理系统的数据结构设计,包括:3.1 家族成员的数据结构:包括成员编号、姓名、性别、出生日期、死亡日期等字段。

3.2 家族关系的数据结构:包括与该成员相关的父母、配偶、子女等字段。

3.3 家族树的数据结构:使用树状结构来表示家谱关系,包括树节点和指针等字段。

4.数据库设计本章节描述了家谱管理系统的数据库设计,包括:4.1 数据表设计:包括成员表、关系表、家谱树表等表的设计。

4.2 数据库关系图:展示了各个数据表之间的关系和连接方式。

5.界面设计本章节描述了家谱管理系统的界面设计,包括:5.1 登录界面:提供用户登录和注册功能。

5.2 主页界面:显示家族成员列表和家谱展示。

5.3 成员管理界面:提供添加、删除、查询、修改等功能。

5.4 关系管理界面:提供建立、编辑、删除家族关系的功能。

5.5 统计分析界面:展示家族成员数据的统计和分析结果。

6.系统性能本章节描述了家谱管理系统的性能要求,包括响应时间、并发用户数、数据处理能力等方面。

7.部署与维护本章节描述了家谱管理系统的部署和维护要求,包括硬件环境、软件环境、数据备份等方面。

8.文档本章节包括对本文档的修改记录和说明。

附件:本文档涉及的附件包括数据库设计图、界面原型图等。

法律名词及注释:1.法律名词1:注释说明。

2.法律名词2:注释说明。

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

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

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

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;数据结构设计体会:使用树的按层遍历的方法找出某人的祖先的集合,但在从文件重建家谱的部分又碰到了困难,如何保存文件可是既节省空间又节省重建家谱的时间。

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

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

《项目实训二》项目名称__ 家谱管理系统__ 姓名__ ___________ 班级 __ _______________ 学号__ ________________ 指导教师__ __________ __2023.11、模块划分:2、统计模块(1)统计家族总人数、健在人数、几代人主要函数:int Generation(Node *root); //这个家族共有几代人int NumberOfPeople( ); //家族旳总人数int LifeNum( ); //健在人数(2)实现措施: 静态组员变量实现成果:3、更新模块(1)创建家谱、增长组员、删除组员、组员更名主要函数:Node* Creat( ); //构造函数调用void AddNewPeople(Node *root,string FatherName,string NAme); //增长新旳家族组员int DeletePeople(Node *root,string FatherName,string Deletepeople);//删除家族组员int SetNewName(Node *root,string NAme,string NewName); //更改姓名(2)实现措施: 创建家谱和组员更名主要经过递归调用;增长组员和删除组员主要经过栈旳非递归调用。

实现成果:4、查询模块(1)查询组员详细信息、查询组员旳孩子以及孩子旳详细信息主要函数:int Message(Node *root,string Name); //显示该组员旳基本信息int FindChild(Node *root,string NAme); //显示孩子信息(2)实现措施: 经过递归调用, 找到组员, 输出相应旳信息实现成果:5、显示模块(1)前序、中序、后序遍历家谱主要函数:void PreOrder(Node *root); //前序递归遍历输出家谱void InOrder(Node *root); //中序递归遍历输出家谱void PostOrder(Node *root); //后序递归遍历输出家谱(2)实现措施: 递归遍历实现成果:6、文件模块(1)保存到文件、从文件读取主要函数:void SaveToFile(Node *root); //保存到文件void FileToFamilyTree( Node *root) ; //从文件中读取(2)实现措施: 文件流实现成果:试验成果及分析1、创建家谱2、保存到文件3、读取文件4、增长组员5、基本信息6、查询组员信息7、组员更名8、遍历家谱9、查询孩子信息10、删除组员。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构课程设计总结报告 家族关系查询系统

数据结构课程设计总结报告 家族关系查询系统

郑州轻工业学院课程设计任务书题目家族关系查询系统专业、班级软件外包11-01 学号姓名主要内容、基本要求、主要参考资料等:主要内容:建立家族关系数据库,实现对家族成员关系的相关查询。

基本要求:(1)建立家族关系并能存储到文件中;(2)实现家族成员的添加。

(3)可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息。

课程设计按照教学要求需要一周时间完成,总共要上机调试程序10小时。

对每个题目要有需求分析,在需求分析中,将题目中要求的功能进行叙述分析,并且设计解决此问题的数据存储结构,设计或叙述解决此问题的算法,描述算法建议使用流程图,进行算法分析指明关键语句的时间复杂度。

给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来。

源程序要按照写程序的规则来编写。

要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。

程序能够运行,要有基本的容错功能。

尽量避免出现操作错误时出现死循环;主要参考资料:数据结构(C语言版),在网上查询的相关资料及部分代码完成期限:2013.6.18-2013.6.20指导教师签名:课程负责人签名:2013年 6 月18 日郑州轻工业学院本科数据结构课程设计总结报告设计题目:家族关系查询系统学生姓名:系别:计算机与通信工程专业:软件外包班级:学号:指导教师:2013年6 月20 日一、设计题目(任选其一)家族关系查询系统二、运行环境(软、硬件环境)电脑及Visual C++ 6.0三、算法设计的思想随着社会发展,人们使用纸质的家谱已经非常不方便而且不利于在家谱里进行添加和修改。

而用算法设计一个家族关系查询系统则可以解决这个问题。

数据结构的二叉树刚好满足家谱的基本结构。

首先建立一个文件作为家谱,然后在文件中输入字符串,实现了在文件中按照数据的逻辑关系进进输入便可建立相应的三叉链表。

然后就是进行数据的存储、删除及查找工作。

四、 算法的流程图家谱的创建:修改家谱:成员查询:五、算法设计分析本次设计研究的是建立家族关系,实现对家族成员关系相关查询的问题。

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

数学与计算机学院课程设计说明书课程名称: 数据结构与算法课程设计课程代码:题目: 二叉树生成家谱年级/专业/班:学生姓名:学号:开始时间: 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)随着计算机科学技术、计算机产业的迅速发展,计算机的应用普及也在以惊人的速度发展,计算机应用已经深入到人类社会的各个领域。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

同时,可以利用这次机会来检验自己的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)建立树时,由于新申请结点的孩子指针、兄弟指针、及双亲指针均未赋空值。

相关文档
最新文档