(完整word版)数据结构家谱图代码
家谱管理系统(含源代码)
家谱管理系统一一C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。
排答疑和辅导。
完整代码:#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);〃创建树voidOutPutAII(TreeNode*Tree);//输出树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[],intIength);//主函数voidmain(){TreeNode*Tree;//产生根节点Tree=(TreeNode*)maIIoc(sizeof(TreeNode));Tree->Parent=NULL;MainMenu(Tree);//显示主菜单}//添加新的成员voidAddNew(TreeNode*Tree){SubMenue2(Tree);〃添加新成员界面}//显示添加家庭信息的界面voidSubMenue2(TreeNode*Tree){charc;intnum;charname[20];TreeNode*NewNode;getchar();while(1){请选择你的操作添加某个人的子女的信息添加某个人配偶的信息退出请选择相应功能:c=getchar();switch(c){case'A'://添加子女信息请输入那个人的名字Tree=SearchTree(Tree,name,20);〃在家谱里查找这个人if(Tree==NULL){该家谱图中没有%$这个人的信息请确认是否输入错误break;}if(Tree->Parent==NULL&&Tree->NextNode[0]==NULL||Tree->Parent!=NULL&&Tree->Name!=Tr ee->Parent->NextNode[0]->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));请输入添加人员姓名请输入添加人员性别女F男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;子女的信息添加成功break;case'B':请输入那个人的名字Tree=SearchTree(Tree,name,20);if(Tree->Parent!=NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0||Tree-> NextNode[0]!=NULL){已经有了配偶break;}if(Tree==NULL){该家谱图中没有%$这个人的信息请确认break;}NewNode=(TreeNode*)malloc(sizeof(TreeNode));请输入添加人员姓名请输入添加人员性别女F男NewNode->Parent=Tree;Tree->NextNode[0]=NewNode;break;case'C':本项服务到此结束break;case'':break;default:对不起!你的选择错误break;}if(c=='C'||c=='c')break;请按Enter键继续操作getchar();getchar();}}//修改某个人的信息voidChange(TreeNode*Tree){charname[20];TreeNode*NewNode;请输入你要修改的人的信息NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){该家谱图中没有%$这个人的信息请确认是否输入错误return;}else{SubMenue1(NewNode);}}//输出副菜单voidSubMenue1(TreeNode*Tree){charc;intflag,i;charname[20];charParent[2][20];TreeNode*NewNode;getchar();while(1){请选择你的操作修改个人的信息修改父母的信息修改兄弟姐妹的信息修改子女的信息修改配偶的信息退出c=getchar();switch(c){case'A':请输入修改的姓名:如果不需要修改就输入'0'然后按Enter键继续Tree->NextNode[i]->Kind='M';elseTree->NextNode[i]->Kind='F';}}子女的信息修改成功break;case'E':if(Tree->Parent!=NULL){if(Tree->NextNode[0]==NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)!=0) {至今还没有配偶break;}if(strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0){请输入%$修改的姓名:如果不需要修改就输入'0'然后按Enter键继续strcpy(Tree->Parent->Name,name);}else{请输入%$修改的姓名:如果不需要修改就输入'0'然后按Enter键继续strcpy(Tree->NextNode[0]->Name,name);}}else{if(Tree->NextNode[0]==NULL)至今还没有配偶else{请输入%$修改的姓名:如果不需要修改就输入'0'然后按Enter键继续strcpy(Tree->NextNode[0]->Name,name);}配偶的信息修改成功break;case'F':本项服务到此结束break;case'':break;default:对不起!你的选择错误break;}if(c=='F'||c=='f')break;请按Enter键继续操作getchar();getchar();}}//输出主菜单voidMainMenu(TreeNode*Tree){charc;〃用于接受用户输入的选项charname[20];while(1){清屏★★★★★★★★★★★★★欢迎进入家谱管理系统^★★★★★★★★★★♦♦菜单♦♦输入家谱信息查找家族成员添加家族成员输出家谱信息修改成员信息退出★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★请选择相应的功能:c=getchar();switch(c){caseT:TreeNode*NewNode;NewNode=(TreeNode*)malloc(sizeof(TreeNode));//建立新节点请输入姓名给节点姓名赋值请输入性别(女F,男if(flag==1)//flag=1表示性别为女丈夫的姓名else妻子的姓名for(i=1;i<=Tree->Num;i++){第%4个子女的姓名别if(Tree->NextNode[i]->Kind=='F'||Tree->NextNode[i]->Kind=='f')女else男}for(i=1;i<=Tree->Num;i++){OutPutAll(Tree->NextNode[i]);}}//在树中经过遍历查找某个人TreeNode*SearchTree(TreeNode*Tree,charname[],intlength){inti;TreeNode*NewNode;if(strcmp(Tree->Name,name)==0){if(length==0)MATEFLAG=1;elseMATEFLAG=0;returnTree;}if(Tree->NextNode[0]==NULL)returnNULL;for(i=0;i<=Tree->Num;i++):%s性if(i==0)NewNode=SearchTree(Tree->NextNode[i],name,0);elseNewNode=SearchTree(Tree->NextNode[i],name,20);if(NewNode!=NULL)returnNewNode;}returnNULL;}//输出已经查找到的人的信息voidOutPutMessage(TreeNode*Tree,charname[],intlength){intflag=0,i;//flag标记性别TreeNode*NewNode;if(Tree==NULL){该家谱图中没有%s这个人return;}您找的人信息如下性别if(Tree->Kind=='F'||Tree->Kind=='f'){flag=1;//标记的性别女}else男NewNode=Tree->Parent;〃父母信息放到NewNode里if(MATEFLAG==1)〃此人为这家人的伴侣{if(flag==1)〃性别为女{她是嫁入这家的,所以父母信息不在家谱内包括丈夫的姓名}else//性别为男{他是入赘这家的所以父母信息不在家谱内包括妻子的姓名}if((NewNode->Num)>0)//判断他(她)是否有孩子{孩子的信息如下//输出他(她)的孩子的信息for(i=1;i<=NewNode- >Num;i++){性别女else男}}return;}if(NewNode==NULL)//判断它是不是根节点如果是的话就没有父母兄弟信息是这个家谱图里最顶端的人else{if(NewNode->Kind=='F'||NewNode->Kind=='f')//判断父亲节点是父亲还是母亲{//输出他(她)的父母亲的信息母亲的姓名父亲的姓名}else{母亲的姓名父亲的姓名}if(NewNode->Num>1)//判断他(她)是否有兄弟姐妹{//输出他(她)的兄弟姐妹的信息的兄弟姐妹信息如下for(i=1;i<=NewNode->Num;i++){if(NewNode->NextNode[i])性别if(NewNode->NextNode[i]->Kind=='F'||Tree->Kind=='f')女elseif(Tree->NextNode[i]->Kind=='F'||Tree->Kind=='f')女elseelse至今还没有孩子}else至今还没有配偶和孩子} 男} } else 没有兄弟姐妹} if(Tree->NextNode[0]!=NULL)(她)的配偶的信息if(flag==1)丈夫的姓名else妻子的姓名 if(Tree->Num>0) 孩子的信息如下{性别 //判断他(她)是否有配偶{//判断他(她)是否有孩子{输出他(她)的孩子的信息//输出他 for(i=1;i<=Tree->Num;i++)。
(完整word版)数据结构C语言版期末考试试题(有答案)
“数据结构”期末考试试题一、单选题(每小题2分,共12分)1.在一个单链表HL中,若要向表头插入一个由指针p指向的结点,则执行( )。
A. HL=ps p一>next=HLB. p一>next=HL;HL=p3C. p一>next=Hl;p=HL;D. p一>next=HL一>next;HL一>next=p;2.n个顶点的强连通图中至少含有( )。
A.n—l条有向边B.n条有向边C.n(n—1)/2条有向边D.n(n一1)条有向边3.从一棵二叉搜索树中查找一个元素时,其时间复杂度大致为( )。
A.O(1)B.O(n)C.O(1Ogzn)D.O(n2)4.由权值分别为3,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为( )。
A.24 B.48C. 72 D. 535.当一个作为实际传递的对象占用的存储空间较大并可能需要修改时,应最好把它说明为( )参数,以节省参数值的传输时间和存储参数的空间。
A.整形B.引用型C.指针型D.常值引用型·6.向一个长度为n的顺序表中插人一个新元素的平均时间复杂度为( )。
A.O(n) B.O(1)C.O(n2) D.O(10g2n)二、填空题(每空1分,共28分)1.数据的存储结构被分为——、——、——和——四种。
2.在广义表的存储结构中,单元素结点与表元素结点有一个域对应不同,各自分别为——域和——域。
3.——中缀表达式 3十x*(2.4/5—6)所对应的后缀表达式为————。
4.在一棵高度为h的3叉树中,最多含有——结点。
5.假定一棵二叉树的结点数为18,则它的最小深度为——,最大深度为——· 6.在一棵二叉搜索树中,每个分支结点的左子树上所有结点的值一定——该结点的值,右子树上所有结点的值一定——该结点的值。
7.当向一个小根堆插入一个具有最小值的元素时,该元素需要逐层——调整,直到被调整到——位置为止。
(完整word版)数据结构图书管理系统
数据结构课程设计说明书年月日1设计目的(小标题黑体五号字)设计一个计算机管理系统完成图书管理基本业务(数据可以存储在一个数据文件中,数据结构、具体数据自定)。
2.设计内容和要求具体功能有:1)每种书的登记内容包括书号、书名、著作者、出版单位、现存量和库存量;2)对书号建立索引表(线性表)以提高查找效率;3)采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;4)借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;5)归还:注销对借阅者的登记,改变该书的现存量.3.本设计所采用的数据结构所用数据结构:线性表、查找、排序链表:用一组地址任意的存储单元存放线性表中的数据元素.以元素(数据元素的映象) + 指针(指示后继元素存储位置)= 结点(表示数据元素或数据元素的映象)以“结点的序列”表示线性表称作线性链表(单链表)单链表是一种链式存取的结构,为找第i 个数据元素必须先找到第i—1 个数据元素。
因此,查找第i 个数据元素的基本操作为:移动指针,比较j 和i。
(1)malloc(size)在内存的动态存储区申请一个长度为size字节的连续空间.(2)calloc(n,size)在内存的动态存储区申请n个长度为size字节的连续空间,函数返回值为分配空间的首地址.若此函数未被成功执行,函数返回值为0。
(3)free(p)释放由指针p所指向的存储单元,而存储单元的大小是最近一次调用malloc()或calloc()函数时所申请的存储空间。
运用了单链表的插入、删除、排序、修改等一些操作!4.功能模块详细设计4。
1 详细设计思想(一)基本思想:(二)图书信息录入、图书信息的查询、图书信息的排序、图书信息的修改、图书信息的删除、图书的借阅、图书的归还、退出图书管理系统。
(三)程序中的主要函数有:void main()//主函数int CreateListR(LinkList *L)//尾插法建表void LocateElem(LinkList *L) //查询int Sort(LinkList *L) //递增有序排序(直接插入排序法)void Display(LinkList *L) //输出排序结果ModifyList(LinkList *L)//修改int ListDelete(LinkList *L) //删除void Borrow(LinkList *L)//借阅void Return(LinkList *L)//归还4.2 核心代码#include <stdio。
(完整word版)数据结构哈夫曼编码与译码
《数据结构》课程设计说明书题目哈夫曼编码与译码学号1267159206姓名张燕斌指导教师康懿日期2014.01。
02任务书目录第一章需求分析 (5)第二章总体设计 (6)第三章抽象数据类型定义 (7)3。
1 LinkList抽象数据类型的设计 (7)3.2 HuffmanTree抽象数据的设计 (7)第四章详细设计..。
...。
..。
....。
.....。
.。
.。
..。
.。
....。
.。
..。
..。
.。
.。
.。
.。
..。
....。
....。
.。
..。
...。
...。
7第五章测试 (10)第六章总结 (11)附录:程序代码 (12)第一章需求分析哈夫曼编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。
哈弗曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。
这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。
赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是赫夫曼编码。
哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。
第二章总体设计(1)输入一个字符串用结构体链表存储字符串中出现的不同字符及其出现的次数。
(2)定义赫夫曼数的结点结构体,把不同的字符及其在字符串中出现的次数作为叶子结点的元素及其权值,统计叶子结点的个数n,开辟可以存储2*n个结点的顺序表,来赫夫曼树的各个结点,然后按照一定的规则构造赫夫曼树。
(3)开辟一个可以存储叶子结点元素及指向存储其赫夫曼编码链表的指针的顺序表,然后从叶子结点开始向上访问,是左孩子的把“0”接进链表是右孩子的把“1”接进链表,直到根结点,然后把叶子结点的元素及存储其赫夫曼链表的头指针读入顺序表,直到把所有的叶子结点的元素及指向存储其赫夫曼编码链表的头指针读入顺序表,这样得到的赫夫曼编码是倒序的。
(完整word版)数据结构课程设计(哈夫曼编码)
目录目录 (1)1 课程设计的目的和意义 (3)2 需求分析 (5)3 系统设计 (6)(1)设计思路及方案 (6)(2)模块的设计及介绍 (6)(3)主要模块程序流程图 (9)4 系统实现 (14)(1)主调函数 (14)(2)建立HuffmanTree (14)(3)生成Huffman编码并写入文件 (18)(4)电文译码 (19)5 系统调试 (22)小结 (25)参考文献 (26)附录源程序 (27)1 课程设计的目的和意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。
哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。
树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0"码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1"的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度尽可能最短,即采用最短码。
作为软件工程专业的学生,我们应该很好的掌握这门技术。
在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。
在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。
这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。
在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。
更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见.同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。
清华严蔚敏《数据结构》的全部代码
/*c1、h(程序名) */#include<string、h>#include<ctype、h>#include<malloc、h>/* malloc()等*/#include<limits、h>/*INT_MAX等*/#include<stdio、h>/* EOF(=^Z或F6),NULL */#include<stdlib、h>/* atoi() */#include<io、h>/* eof() */#include<math、h>/* floor(),ceil(),abs() */#include<process、h>/* exit() *//*函数结果状态代码*/#defineTRUE 1#defineFALSE 0#defineOK 1#defineERROR 0#defineINFEASIBLE -1/* #define OVERFLOW -2因为在math、h中已定义OVERFLOW得值为3,故去掉此行*/typedef intStatus;/* Status就是函数得类型,其值就是函数结果状态代码,如OK等*/typedef intBoolean;/* Boolean就是布尔类型,其值就是TRUE或FALSE *//* algo2-1、c 实现算法2、1得程序*/#include"c1、h"typedef intElemType;#include"c2-1、h"/*c2-1、h 线性表得动态分配顺序存储结构*/#defineLIST_INIT_SIZE10/*线性表存储空间得初始分配量*/#defineLISTINCREMENT 2/*线性表存储空间得分配增量*/typedefstruct{ElemType*elem;/*存储空间基址*/intlength;/*当前xx*/intlistsize;/*当前分配得存储容量(以sizeof(ElemType)为单位) */}SqList;#include"bo2-1、c"/* bo2-1、c 顺序表示得线性表(存储结构由c2-1、h定义)得基本操作(12个) */StatusInitList(SqList*L)/*算法2、3 */{/*操作结果:构造一个空得顺序线性表*/(*L)、elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!(*L)、elem)exit(OVERFLOW);/*存储分配失败*/(*L)、length=0;/*空表长度为0 */(*L)、listsize=LIST_INIT_SIZE;/*初始存储容量*/returnOK;}StatusDestroyList(SqList*L){/*初始条件:顺序线性表L已存在。
数据结构课程设计模版—家谱
课程设计名称:数据结构系:学生姓名:班级:学号:成绩:指导教师:开课时间:学年学期一.设计题目家谱的设计与实现(树,查找)二.主要内容家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。
可。
基本功能如下:(1)家谱祖先数据的录入(树的根结点)。
(2)家庭成员的添加:即添加某一人的儿女,儿女的数目由控制台端给出,然后输入相应的儿女姓名(此处儿女的姓名不能重名)。
(3)家庭成员的修改:可以修改某一成员的姓名。
(4)家庭成员的查询:查询某一成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。
(5)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后代成员。
三.课题设计的基本思想,原理和算法描述(包括课题所用数据结构,界面设计、输入/输出设计,功能模块设计,符号说明等)基本思想:四、运行示例及结果分析(截图分析)主函数CreatTree(t)创建树的根结点AddTreeNode(t)添加成员结change(t)修改信息Search(t)结点的查找Deleate(t)删除结点DisplayJP(t)显示家谱exit(0)退出确定上一代,再添加子女Display(q)此人信息Dis_Generation(t,q)此人辈分Dis_Children(q)此人子女Dis_Brother(t,q,Generation(t,q))同辈分成员五、调试和运行程序过程中产生的问题及采取的措施六、总结和展望(400字以上)七、参考资料(格式为:[序号]作者.书名.出版社,出版年份如:[1] 李建学等著.数据结构课程设计案例精编.清华大学出版社,2007[2] 唐宁九等主编.数据结构与算法(C++版)实验和课程设计教程. 清华大学出版社,2008)。
(完整word版)数据结构-家谱管理系统(word文档良心出品)
宁波大红鹰学院信息工程学院课程设计报告项目名称:家谱查询系统项目组长:白钰琦项目成员:徐程凯、徐海域、项鸿伟班级名称: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、按出生日期查找家谱成员信息....................................... 错误!未定义书签。
数据结构_家谱管理系统
数据结构_家谱管理系统家谱是记录一个家族的血缘关系和历史的重要文化遗产。
传统的家谱管理方式通常是以纸质形式存在,随着科技的发展,数字化的家谱管理系统逐渐兴起。
本篇文章将介绍一个基于数据结构的家谱管理系统的设计与实现。
一、需求分析家谱管理系统的主要功能包括: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:注释说明。
数据结构完整代码
(线性表顺序存储)#include"string.h"#include"ctype.h"#include"stdio.h"#include"stdlib.h"#include"io.h"#include"math.h"#include"time.h"#define OK1#define ERROR0#define TRUE1#define FALSE0#define MAXSIZE20/*存储空间初始分配量*/ typedef int Status;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/typedef int ElemType;/*ElemType类型根据实际情况而定,这里假设为int*/Status visit(ElemType c){printf("%d",c);return OK;}typedef struct{ElemType data[MAXSIZE];/*数组,存储数据元素*/int length;/*线性表当前长度*/}SqList;/*初始化顺序线性表*/Status InitList(SqList*L){L->length=0;return OK;}/*初始条件:顺序线性表L已存在。
操作结果:若L为空表,则返回TRUE,否则返回FALSE*/Status ListEmpty(SqList L){if(L.length==0)return TRUE;elsereturn FALSE;}/*初始条件:顺序线性表L已存在。
操作结果:将L重置为空表*/Status ClearList(SqList*L){L->length=0;return OK;}/*初始条件:顺序线性表L已存在。
操作结果:返回L 中数据元素个数*/int ListLength(SqList L){return L.length;}/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/ /*操作结果:用e返回L中第i个数据元素的值,注意i 是指位置,第1个位置的数组是从0开始*/Status GetElem(SqList L,int i,ElemType*e){if(L.length==0||i<1||i>L.length)return ERROR;*e=L.data[i-1];return OK;}/*初始条件:顺序线性表L已存在*//*操作结果:返回L中第1个与e满足关系的数据元素的位序。
家谱管理系统的源代码
#include〈iostream。
h> #include〈string。
h>#include〈fstream.h〉#include〈stdlib。
h〉struct per{int data;char name[20];char brith[20];char marry;char address[20];char live;char dietime[20]; char parent[20];int generation;int child[10];int numberchild;per(){for(int i=0;i〈20;i++)name[i]=’\0';for(i=0;i<20;i++)brith[i]=’\0';for(i=0;i<20;i++)address[i]='\0';for(i=0;i<20;i++)dietime[i]=’\0';for(i=0;i〈10;i++)child[i]=0;for(i=0;i〈20;i++)parent[i]='\0';live='\0’;marry=’\0’;data=—10;generation=0;numberchild=0;}};void setupinfo(per person[]);void display(per person[],int&);void displayhome(per person[],int&);void displayinfo(per person[],int&);void namesearch(per person[],int&);void birtfdaysearch(per person[],int&);void addchild(per person[],int&);void editmember(per person[],int&);void sortbirthday(per person[],int&);void main(){per person[36];int count=0;fstream inputFile(”person。
数据结构代码汇总
数据结构代码汇总数据结构代码汇总一、线性结构1.数组(Array):●定义和初始化数组●插入、删除元素●查找元素●数组的遍历●数组排序算法(如冒泡排序、快速排序)2.链表(Linked List):●单链表的定义和初始化●插入、删除节点●链表的遍历●双向链表的定义和初始化●插入、删除节点●双向链表的遍历●栈的定义和初始化●入栈、出栈操作●获取栈顶元素、判断栈是否为空●栈的应用(如括号匹配、逆波兰表达式求值)4.队列(Queue):●队列的定义和初始化●入队、出队操作●获取队头元素、判断队列是否为空●队列的应用(如循环队列、优先级队列)二、非线性结构1.树(Tree):●二叉树的定义和初始化●二叉树的遍历(前序、中序、后序)●二叉搜索树的实现和应用●平衡二叉树(AVL树)的实现和应用●哈夫曼树的实现和应用●图的存储结构(邻接矩阵、邻接表)●深度优先搜索(DFS)●广度优先搜索(BFS)●最小树算法(如Prim算法、Kruskal算法)●最短路径算法(如Dijkstra算法、Floyd算法)附件:本文档中所涉及的代码示例可以在附件中找到,包括各种数据结构的实现和相关算法。
法律名词及注释:1.数组:计算机科学中的一种数据结构,用于存储一系列相同类型的元素。
2.链表:一种动态数据结构,由一系列节点组成,每个节点包含一个数据元素和指向下一个节点的指针。
3.栈:一种特殊的线性数据结构,遵循先进后出(Last In First Out,LIFO)的原则。
4.队列:一种特殊的线性数据结构,遵循先进先出(First In First Out,FIFO)的原则。
5.二叉树:一种特殊的树形结构,每个节点最多有两个子节点。
6.图:由节点(顶点)和连接节点的边构成的数据结构,用于描述事物之间的关系。
(完整word版)数据结构(C++版)知识点及相应题目
第一章知识点P3 ·数据结构从逻辑上划分为:(1)线性结构(2)非线性结构: 树型结构和图型结构P4 ·从存储结构(物理结构)上划分:(1)顺序结构:所有元素存放在一片连续的存储单元中,逻辑上相邻的元素存放到计算机内存中仍然相邻(2)链式结构:所有元素存放在可以不连续的存储单元中,但元素之间的关系可以通过地址确定,逻辑上相邻的元素存放到计算机内存后不一定是相邻的。
P5 ·算法的五大特性:(1)输入(2)输出(3)有穷性(4)确定性(5)可行性(可执行)P6 ·算法分析的任务/方面:(1)时间复杂度(重点是计算时间复杂度[P9 1-5 P10 1-12)(2)空间复杂度(性):一个算法在执行时所占有的内存开销,称为空间频度课后部分习题解释:1-2简述下列概念:数据、数据元素、数据类型、数据结构、逻辑结构、存储结构、线性结构、非线性结构。
◆ 数据:指能够被计算机识别、存储和加工处理的信息载体。
◆ 数据元素:就是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理◆ 数据类型:是一个值的集合以及在这些值上定义的一组操作的总称。
◆ 数据结构:指的是数据之间的相互关系,即数据的组织形式。
一般包括三个方面的内容:数据的逻辑结构、存储结构和数据的运算。
◆ 逻辑结构:指各数据元素之间的逻辑关系。
◆ 存储结构:就是数据的逻辑结构用计算机语言的实现。
◆ 线性结构:数据逻辑结构中的一类,它的特征是若结构为非空集,则该结构有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。
线性表就是一个典型的线性结构。
◆ 非线性结构:数据逻辑结构中的另一大类,它的逻辑特征是一个结点可能有多个直接前驱和直接后继。
补充习题⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
【解答】数据元素⑶从逻辑关系上讲,数据结构主要分为()、()、()和()。
数据结构家谱管理系统范本
数据结构家谱管理系统范本在当今数字化的时代,管理和保存家族信息变得越来越重要。
一个高效的数据结构家谱管理系统能够帮助我们更好地记录家族成员的关系、个人信息以及家族的历史。
接下来,让我们详细探讨一下这样一个系统的范本。
首先,让我们来明确一下这个系统的主要目标和功能。
其核心目标是提供一个集中、准确且易于维护的平台,用于存储和查询家族信息。
主要功能应包括:家族成员信息的录入与编辑、成员之间关系的定义和展示、家族历史事件的记录、以及强大的查询和搜索功能。
在设计数据结构时,我们需要考虑如何有效地存储家族成员的信息。
可以创建一个“家族成员”表,其中包含诸如姓名、出生日期、出生地、逝世日期(若有)、照片(路径)等基本字段。
为了表示成员之间的关系,我们可以再创建一个“关系”表,记录每个成员与其亲属(如父母、配偶、子女等)的关联。
对于界面设计,应追求简洁明了、易于操作的风格。
首页可以展示家族树的概览,以直观的方式呈现家族成员之间的关系。
用户点击某个成员节点,能够查看该成员的详细信息,并可以进行编辑或添加新的信息。
在录入家族成员信息时,系统应提供友好的输入界面,并进行必要的数据验证,以确保输入信息的准确性和完整性。
例如,出生日期的格式应该符合规范,姓名不能为空等。
为了方便查询,系统应支持多种查询方式。
用户可以通过姓名、出生日期范围、籍贯等条件进行搜索,快速找到所需的家族成员信息。
在家谱管理系统中,数据的安全性和备份也是至关重要的。
用户的登录和操作权限应该得到严格控制,只有授权人员能够进行数据的修改和删除。
同时,定期对数据进行备份,以防止数据丢失。
此外,系统还可以提供一些扩展功能,比如生成家族报告,以图表或文档的形式展示家族的人口分布、年龄结构等信息;或者与社交媒体平台集成,方便与家族成员分享家族历史和最新动态。
在实际开发过程中,选择合适的编程语言和数据库管理系统也非常关键。
常见的编程语言如 Java、Python 等都能够胜任,而数据库可以选择 MySQL、SQL Server 等。
(完整word版)数据结构课程设计哈夫曼编码111
《数据结构与算法》课程设计(2009/2010学年第二学期第20周)指导教师:班级:计算机科学与技术学号:姓名:《数据结构与算法》课程设计目录一、前言1.摘要2.《数据结构与算法》课程设计任务书二、实验目的三、题目--赫夫曼编码/译码器1.问题描述2.基本要求3.测试要求4.实现提示四、需求分析--具体要求五、概要设计六、程序说明七、详细设计八、实验心得与体会前言1.摘要随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。
算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。
算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。
它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。
数据结构有逻辑上的数据结构和物理上的数据结构之分。
逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。
数据结构是数据存在的形式。
《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
2.《数据结构与算法》课程设计任务书《数据结构与算法》是计算机专业重要的核心课程之一,在计算机专业的学习过程中占有非常重要的地位。
(完整word版)家谱树
家谱树这是实训时候完全自己写的,输入出生日期的时候一定按要求去输入(以防出错),下面是老师给我们的要求:建立输入文件以存放最初家谱中各成员的信息。
成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加其它信息、但不是必需的。
能对修改后的家谱存盘以备以后使用。
能从文件中读出已有的家谱,形成树状关系。
家谱建立好之后,以图形方式显示出来。
显示第n代所有人的信息。
按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
按照出生日期查询成员名单。
输入两人姓名,确定其关系。
某人添加孩子。
删除某人(若其还有后代,则一并删除)。
修改某人信息。
按出生日期对家谱中所有人排序.打开一家谱时,若家谱中某人的生日在打开家谱的那一天,应给出提示。
下面是程序代码(用文本过滤一下粘贴到工程中就可用):#include〈stdio。
h〉#include〈stdlib.h>#include<string.h>#include<conio。
h>#define OK 1#define FALSE 0#define ERROR —1typedef int status;typedef struct {int num;//孩子个数char name[20];///姓名char sex;//性别//bool is_spouse;//配偶是否存在char spouse[20];//配偶的姓名,性别取反}DataType;typedef struct TNode{DataType data;//数据域struct TNode* nextstr[10];//指针域,指向孩子struct TNode*parent;//指针域,指向父亲}PedTNode,*PedTree;//家谱树void OutMenu();//输出家谱菜单void CreateNewPedTreeNode(PedTree Tree);//创建孩子,递归调用void CreatePedTree(PedTree Tree);//创建Pedigree树void OutOneInfor(PedTree Tree);//递归调用实现输出整个家谱树void OutAllPedTree(PedTree Tree);//输出整个家谱信息//PedTree SearchPedTree(PedTree Tree,char Name[]);//在树中查找bool SearchPedTree(PedTree Tree,char Name[],PedTree*DrawTree);//在树中查找bool SearchPedTree2(PedTree Tree,char Name[],PedTree*DrawTree);//在树中查找配偶是否匹配void ShowMenu1(PedTree Tree);//显示要查找人的信息//void ShowSelfInfor(PedTree Tree,char Name[],int Length);//显示个人信息void ShowMenu2();//显示添加信息的菜单int AddNewInfor(PedTree Tree);//添加新的家谱信息void AddChildInfor(PedTree Tree);//添加子女的信息void AddPouseInfor(PedTree Tree);//添加配偶信息int ChangeInfor(PedTree Tree);//修改家谱信息void ShowMenu3();//显示修改信息的菜单int main(){char choice;system(”color 1f”);PedTNode TreeNode;PedTree Tree=&TreeNode;bool flag=false;//标志是否执行建立家谱//PedTree Tree=NULL;while(1){fflush(stdin);//清除键盘缓冲区sy stem(”cls”);OutMenu();printf("\n”);printf("\t\t请您选择:");choice=getchar();switch(choice){case '1':if(!flag){CreatePedTree(Tree);//创建Pedigree树flag=true;}else{printf(”\n\t\t家谱不能多次建立\n”);printf(”\n\t\t按任意键继续:”);fflush(stdin);getch();}break;case '2':if(flag)ShowMenu1(Tree);//显示要查找人的信息else{printf("\n\t\t家谱未建立,请您先建立家谱\n”);printf("\n\t\t按任意键继续:”);fflush(stdin);getch();}break;case ’3’:if(flag)AddNewInfor(Tree);//添加新的家谱信息else{printf(”\n\t\t家谱未建立,请您先建立家谱\n”);printf(”\n\t\t按任意键继续:");fflush(stdin);getch();}break;case '4’:if(flag)OutAllPedTree(Tree);//输出整个家谱信息else{printf("\n\t\t家谱未建立,请您先建立家谱\n”);printf("\n\t\t按任意键继续:");fflush(stdin);getch();}break;case '5':if(flag)ChangeInfor(Tree);//修改家谱信息else{printf("\n\t\t家谱未建立,请您先建立家谱\n”);printf("\n\t\t按任意键继续:");fflush(stdin);getch();}break;case '6':return 0;}}//return 0;}void OutMenu(){printf(”\t\t* ****** * * * * * ** ** * * ** * **\n");printf(”\t\t**\n");printf(”\t\t* 家谱信息管理菜单*\n");printf(”\t\t* *\n”);printf(”\t\t* 1:输入家谱信息*\n”);printf(”\t\t*2:查找并输出某人信息*\n”);printf("\t\t* 3:添加新的家庭成员*\n”);printf(”\t\t* 4:输出整个家谱信息*\n”);printf(”\t\t*5:修改某个人的信息*\n");printf("\t\t* 6:退出整个程序*\n");printf("\t\t* *\n");printf("\t\t****** * ** * * ** * * * * *** * **\n");}void CreatePedTree(PedTree Tree)//创建Pedigree树{fflush(stdin);//清除键盘缓冲区system("cls");/*Tree=(PedTree)malloc(sizeof(PedTNode));if(!Tree){printf("Insufficient Memory!\n”);exit(-1);}*/printf(”\t\t请输入姓名:");scanf("%s",Tree->data。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//main.cpp# include <stdio.h># include <string.h># include <stdlib.h># include <conio.h># include <windows.h># include "Head.h"void main(){HANDLE consolehwnd;//字体颜色的改变consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);//字体颜色的改变int chose,i;BinTree T;T=NULL;while(1){SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_RED);//字体颜色的改变printf("***************家谱信息功能表*************\n");SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_BLUE|F OREGROUND_GREEN);printf("1:新建一个根节点\n");printf("2:以添加成员节点构造家谱图\n");printf("3:家谱树的层次显示\n");printf("4家谱树保存到文件!\n");printf("5:家谱树读入文件!\n");printf(":家谱信息的删除\n");printf("6:结束程序\n");SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_RED);//字体颜色的改变printf("************按以上功能表进行操作*************\n");SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_BLUE+F OREGROUND_GREEN+FOREGROUND_RED);for(i=1;i<=100;){printf("请输入你在功能表上的选项:") ;scanf("%d",&chose);if(1<=chose<=11)break;elseprintf("你输入的选项不正确,请重新输入!\n");}switch(chose){case 1:system("cls"); //在控制台程序使用清屏函数InPut(T); //录入个人信息printf("按任意键返回"); //等待程序system("pause");system("cls");break;case 2:system("cls");Addchild(T); //比较兄弟岁数后再添加system("pause");system("cls");break;case 3:system("cls");LevelOutput(T);system("pause");system("cls");break;case 4:system("cls");KCreatTree(T); //将家谱信息保存到文件中system("pause");system("cls");break;case 5:system("cls");LCreateTree(T); //从文件中读出家谱成员的信息system("pause");system("cls");break;case 6:system("cls");exit(0);system("pause");system("cls");break;default:fflush(stdin);printf("你输入的选项不正确!\n");printf("请从新输入菜单的选项!\n");system("pause");system("cls");}}}//Head.h# include <stdio.h># include <string.h># include <stdlib.h># include <conio.h># include <windows.h># define QUEUESIZE 100typedef struct Data //出生日期结构体{int day;int month;int year;}dataly;typedef struct BiTNode //个人资料信息{char live[15]; //建在(T表示活着,F表示过世)char name[20]; //姓名char sex[15]; //性别char marriage[15]; //是否已婚(Y为已婚,N为未婚)char birthadd[20]; //出生地char address[15]; //家庭地址char profession[20]; //职业char fathername[20]; //父亲姓名int generation; //辈分int message; //接点孩子的个数int hight; //升高int age; //年龄dataly birthday; //出生日期dataly dieday; //死亡日期(如果其已经死亡)struct BiTNode *brother; //兄弟struct BiTNode *child; //孩子struct BiTNode *parent; //父母}BiTNode,*BinTree;typedef BinTree QElemType;/*typedef struct{int front;int rear;QElemType elem[QUEUESIZE];}SqQueue;*/typedef struct QNode{QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front,rear;}LinkQueue;int JudgeTime(BinTree);int Comepare(BinTree);void InPut(BinTree &T);BinTree LevelFind(BinTree &T,BinTree a);void CreatfTree(BinTree &T);void Addchild(BinTree &T);void OutPut(BinTree T);void LevelOutput(BinTree T);void PreOrderD(BinTree T);void KCreatTree(BinTree &s);void KeepTTFile(BinTree T,FILE *fp);void PrinfTree(BinTree p,FILE *fp);void LAddchild(BinTree &T,LinkQueue &S,FILE *fp);void LCreateTree(BinTree &T);//function.cpp# include "Head.h"//********************************************************* //********************************************************* void InitQueue(LinkQueue &Q){if(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)))){exit(0);}Q.front->next=NULL;return;}int QueueEmpty(LinkQueue Q){return(Q.front->next==NULL);}int GetHead(LinkQueue Q,QElemType &e){if(Q.front==Q.rear){return 0;}e=Q.front->next->data;return 1;}void EnQueue(LinkQueue &Q,QElemType e){QueuePtr p;if(!(p=(QueuePtr)malloc(sizeof(QNode)))) {exit(0);}p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return;}int DeQueue(LinkQueue &Q,QElemType &e){QueuePtr p;if(Q.front==Q.rear)return 0;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return 1;}void QueueTraverse(LinkQueue Q){QueuePtr p;p=Q.front->next;while(p){printf("%d",p->data);p=p->next;}printf("\n");return;}//**************************************************************************** //**************************************************************************** int JudgeTime(BinTree p) //判断输入的出生日期是否正确{if(p->birthday.year>2013||p->birthday.year<=0){printf("你输入的年份错误,请重新输入!\n");return 0;}if(12<p->birthday.month||p->birthday.month<1){printf("你输入的年份错误,请重新输入!\n");return 0;}if(p->birthday.month==1||p->birthday.month==3||p->birthday.month==5||p->bi rthday.month==7||p->birthday.month==8||p->birthday.month==10||p->birthday.month==12) {if(31<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误,请重新输入!\n");return 0;}}if(p->birthday.month=='4'||p->birthday.month=='6'||p->birthday.month=='11' ){if(30<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误,请重新输入!\n");return 0;}}if(p->birthday.year%400==0||p->birthday.year%4==0&&p->birthday.year%100!=0 ){if(p->birthday.month==2){if(29<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误!\n");return 0;}}}else{if(p->birthday.month==2){if(28<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误!\n");return 0;}}}return 1;}//*************************************************************************** //*************************************************************************** int Comepare(BinTree q) //判断出生日期和死亡日期是否错误{if(q->dieday.year<q->birthday.year){printf("你输入的死亡年份日期错误,请重新输入!\n");return 0;}if(q->dieday.year==q->birthday.year){if(q->dieday.month<q->birthday.month){printf("你输入的月份死亡日期错误,请重新输入!\n");return 0;}}if(q->dieday.year==q->birthday.year){if(q->dieday.month==q->birthday.month){if(q->dieday.day<q->birthday.day){printf("你输入的天数死亡日期错误,请重新输入!\n");return 0;}}}return 1;}//**************************************************************************** //**************************************************************************** void InPut(BinTree &T){int i;T=(BinTree)malloc(sizeof(BiTNode));T->brother=NULL;T->child=NULL;T->parent=NULL;printf("*******请输入你入录人信息********\n");printf("请输入姓名:\n");scanf("%s",T->name);for(i=0;i<=100;i++){printf("请输入性别:(男(m)或女(f))\n");scanf("%s",T->sex);if(strcmp(T->sex,"m")||strcmp(T->sex,"f")||strcmp(T->sex,"M")||strcmp(T->s ex,"F"))break;}T->generation=1;T->message=0;printf("请输入身高:\n");scanf("%d",&T->hight);printf("请输入家庭住址:\n");scanf("%s",T->address);printf("请输入出生地:\n");scanf("%s",T->birthadd);printf("请输入职业:\n");scanf("%s",T->profession);strcpy(T->fathername,"0");for(i=1;i<=3;i++){printf("请输入出生日期\n");printf("请输入年:\n"); //判断出生日期是否正确,如果不正确,请重新输入scanf("%d",&(T->birthday.year));printf("请输入月:\n");scanf("%d",&(T->birthday.month));printf("请输入日:\n");scanf("%d",&(T->birthday.day));int t=JudgeTime(T);if(t)break;}for(i=0;i<=100;i++){printf("请输入此人是否健在:(健在(l或L),过逝(d或D))\n");scanf("%s",T->live);if(strcmp(T->live,"l")==0||strcmp(T->live,"d")==0||strcmp(T->live,"L")==0| |strcmp(T->live,"D")==0)break;}if(strcmp(T->live,"d")==0||strcmp(T->live,"D")==0){for(i=1;i<=3;i++){printf("请输入死亡日期\n");printf("请输入年:\n");scanf("%d",&T->dieday.year);printf("请输入月:\n");scanf("%d",&T->dieday.month);printf("请输入日:\n");scanf("%d",&(T->dieday.day));if(Comepare(T))break;}}if(strcmp(T->live,"d")==0||strcmp(T->live,"D")==0){T->age=(T->dieday.year-T->birthday.year);}else{T->age=(2012-T->birthday.year);}printf("你已成功入录此人的信息\n");}//**************************************************************************** ****//**************************************************************************** ****BinTree LevelFind(BinTree &T,char Name[15]){BinTree e;if(T==NULL){printf("没有找到你输入的信息\n");return NULL;}else{LinkQueue S;InitQueue(S); //初始化队列EnQueue(S,T);while( !QueueEmpty(S)){DeQueue(S,e);if(strcmp(e->name,Name)==0){return e;}else{if(e->brother!=NULL)EnQueue(S,e->brother);if(e->child!=NULL)EnQueue(S,e->child);}}printf("没有找到你输入的信息\n");return NULL;}}//***********************************************************************//*********************************************************************** void CreatfTree(BinTree &T) //按层次遍历生成此家谱{BinTree p;LinkQueue S;InitQueue(S); //构造一个空队列T=(BinTree)malloc(sizeof(BiTNode));printf("请输入家谱成员的信息!\n");InPut(T);EnQueue(S,T); //T进入队列中while(!QueueEmpty(S)){DeQueue(S,p);if(p->message==0){continue;}else{int i=0,x=1;i=p->message;BinTree p1,p2;p2=p1=(BinTree)malloc(sizeof(BiTNode));printf("请输入%s第%d个孩子的信息:\n",p->name,x);InPut(p1);p1->parent=p;i--; //结点的孩子数EnQueue(S,p1);while(i!=0){x=x+1;BinTree p3;p3=(BinTree)malloc(sizeof(BiTNode));printf("请输入%s第%d个孩子的信息:\n",p->name,x);InPut(p3);p1->brother=p3;p3->parent=p;p1=p3; //将p3的地址保存起来,以便下次连接它的兄弟EnQueue(S,p3);i--;}p->child=p2;}}}//*************************************************************************** //*************************************************************************** void OutPut(BinTree T){printf("*******输出个人信息********\n");printf("\n姓名:%s",T->name);printf("\n性别:%s",T->sex);printf("\n年龄:");printf("%d",T->age);printf("\n辈分:");printf("%d",T->generation);printf("\n身高:");printf("%d",T->hight);printf("\n孩子的个数:");printf("%d",T->message);printf("\n家庭住址:");printf("%s",T->address);printf("\n出生地:");printf("%s",T->birthadd);printf("\n职业:");printf("%s",T->profession);printf("\n父亲姓名:");printf("%s",T->fathername);if (strcmp(T->live,"d")==0||strcmp(T->live,"D")==0 ){printf("\n死亡日期:");printf("%d ",T->dieday.year);printf("%d ",T->dieday.month);printf("%d \n",T->dieday.day);}printf("\n出生日期:%d %d %d\n",T->birthday.year,T->birthday.month,T->birthday.day);}//*************************************************************************** //*************************************************************************** void LevelOutput(BinTree T){BinTree e;e=(BinTree)malloc(sizeof(BiTNode));e=T;if(T==NULL){printf("此家谱图为空,没有信息可以输出!\n");return;}else{LinkQueue S;InitQueue(S); //初始化队列EnQueue(S,e);while( !QueueEmpty(S)){DeQueue(S,e);OutPut(e);if(e->brother!=NULL)EnQueue(S,e->brother);if(e->child!=NULL)EnQueue(S,e->child);}return;}}//************************************************************************** //************************************************************************** void PreOrderD(BinTree T){if(T){T->generation++;PreOrderD(T->brother);PreOrderD(T->child);}}//*************************************************************************** //*************************************************************************** void Addchild(BinTree &T) //比较兄弟岁数后再添加{char Name[15];BinTree Tree,p,t,t1;int c,i,j=1;if(T==NULL){T=(BinTree)malloc(sizeof(BiTNode));printf("家谱不存在,则新建家谱树\n");printf("请输入整个家谱图的信息:\n");CreatfTree(T);//调用创建家谱图}else{while(j){printf("请输入你的选项(1~2):\n");printf("1:添加新成员作为整个家谱的祖先\n");printf("2:添加新成员作为某一成员的孩子\n");for(i=0;i<=3;i++){printf("选项为:");scanf("%d",&c);if(c==1||c==2){break;}elseprintf("你输入的选项有错,请重新输入!\n");}switch(c){case 1:Tree=(BinTree)malloc(sizeof(BiTNode));InPut(Tree);//输入增加节点的信息Tree->child=T;Tree->message++;T->parent=Tree;strcpy(T->fathername,Tree->name) ;PreOrderD(T);//递归函数将整个家族的辈分增加T=Tree;//将指针返回j=0;break;case 2:printf("请输入所添加成员的父亲姓名:\n你有3次机会\n");i=1;while((i++)!=4){scanf("%s",Name);p=LevelFind(T,Name);//将要插入的结点的父亲的指针找出来if(p==NULL){printf("父亲姓名输入错误\n你还有%d次机会\n请从新输入:\n",i-1);if (i==4) {return;}continue;}else{break;}}printf("请输入所添加成员的信息\n");Tree=(BinTree)malloc(sizeof(BiTNode));InPut(Tree); //输入增加节点的信息strcpy(Tree->fathername,p->name);Tree->generation=p->generation+1; //辈分加1if(p->child!=NULL){t1=p;t=p->child;while(t){if(Tree->age<=t->age){if(t->brother==NULL){t->brother=Tree;Tree->parent=p;p->message++; //辈分加1j=0;break;}if (Tree->age<=t->age&&Tree->age>=t->brother->age){Tree->brother=t->brother;t->brother=Tree;Tree->parent=p;p->message++;j=0;break;}t1=t;t=t->brother;continue;}else{Tree->brother=t;t1->child=Tree;Tree->parent=p;p->message++;j=0;break;}}}else{p->child=Tree;Tree->parent=p;p->message++;j=0;break;}break;default:printf("\n\n\t对不起,你的选择不在服务范围之内!\n");printf("\n请再次选择你所要的操作:\n");continue;}}}}//**************************************************************************** ****************//**************************************************************************** ****************void KeepTTFile(BinTree T,FILE *fp) //将树的信息保存到文件中{fprintf(fp,"%s ",T->name);fprintf(fp,"%s ",T->sex);fprintf(fp,"%d ",T->age);fprintf(fp,"%d ",T->generation);fprintf(fp,"%d ",T->hight);fprintf(fp,"%d ",T->message);fprintf(fp,"%s ",T->address);fprintf(fp,"%s ",T->birthadd);fprintf(fp,"%s ",T->profession);fprintf(fp,"%s ",T->fathername);fprintf(fp,"%s ",T->live);if (strcmp(T->live,"d")==0||strcmp(T->live,"D")==0){fprintf(fp,"%d ",T->dieday.year);fprintf(fp,"%d ",T->dieday.month);fprintf(fp,"%d ",T->dieday.day);}fprintf(fp," %d %d %d\n",T->birthday.year,T->birthday.month,T->birthday.da y);}//**************************************************************************** ******************//**************************************************************************** ******************void KCreatTree(BinTree &s) //层次遍历将家谱树保存在文件中{LinkQueue S;BinTree a,p;if (s==NULL){printf("家谱图的信息为空,不用保存到文件中!\n请重新构建家谱图·····\n");return;}FILE *fp;fp=fopen("familytree","wb+");if(fp==NULL){printf("Can not open file\n");exit (0);}InitQueue(S);EnQueue(S,s);while (!QueueEmpty(S)){DeQueue(S,a);KeepTTFile(a,fp);if (a->child!=NULL){EnQueue(S,a->child);p=a->child;while (p->brother!=NULL){EnQueue(S,p->brother); //将一个父亲的所以兄弟都压到队列中,层次保存文件p=p->brother;}}}fclose(fp);printf("家谱信息已成功保存到文件中!\n");return;}//**************************************************************************** ******************//**************************************************************************** ******************void PrinfTree(BinTree T,FILE *fp){fscanf(fp,"%s ",T->name);fflush(stdin);fscanf(fp,"%s ",T->sex);fflush(stdin);fscanf(fp,"%d ",&T->age);fflush(stdin);fscanf(fp,"%d ",&T->generation);fflush(stdin);fscanf(fp,"%d ",&T->hight);fflush(stdin);fscanf(fp,"%d ",&T->message);fflush(stdin);fscanf(fp,"%s ",T->address);fflush(stdin);fscanf(fp,"%s ",T->birthadd);fflush(stdin);fscanf(fp,"%s ",T->profession);fflush(stdin);fscanf(fp,"%s ",T->fathername);fflush(stdin);fscanf(fp,"%s ",T->live);if (strcmp(T->live,"D")==0||strcmp(T->live,"d")==0){fscanf(fp,"%d ",&T->dieday.year);fflush(stdin);fscanf(fp,"%d ",&T->dieday.month);fflush(stdin);fscanf(fp,"%d ",&T->dieday.day);fflush(stdin);}fscanf(fp,"%d %d %d\n",&T->birthday.year,&T->birthday.month,&T->birthday.d ay);fflush(stdin);}//**************************************************************************** *************************//**************************************************************************** **************************void LAddchild(BinTree &T,LinkQueue &S,FILE *fp) //按层次遍历将孩子存储在文件{int i=0;i=T->message;BinTree p1,p2;p2=p1=(BinTree)malloc(sizeof(BiTNode));p1->child=NULL;p1->brother=NULL;p1->parent=T;T->child=p2;i--; //结点的孩子数PrinfTree(p1,fp); //将T结点的信息读入到文件中EnQueue(S,p1);while(i!=0){BinTree p3;p3=(BinTree)malloc(sizeof(BiTNode));p3->parent=T;p3->child=NULL;p3->brother=NULL;p1->brother=p3;p1=p3; //将p3的地址保存起来,以便下次连接它的兄弟PrinfTree(p3,fp);EnQueue(S,p3);i--;}}//**************************************************************************** ***********//**************************************************************************** ***********void LCreateTree(BinTree &T) //从文件中读入成员信息按层次遍历生成家谱{BinTree p;T=(BinTree)malloc(sizeof(BiTNode));T->brother=NULL; //将T的孩子和兄弟初始化为空;T->child=NULL;T->parent=NULL;LinkQueue S;InitQueue(S); //构造一个空队列printf("从文件中读入家谱的成员\n");FILE *fp;fp=fopen("familytree","rb+");if(fp==NULL){printf("Can not open file\n");exit (0);}PrinfTree(T,fp); //将T结点的信息读入到文件中EnQueue(S,T); //T进入队列中while(!QueueEmpty(S)){DeQueue(S,p);if(p->message==0){continue;}else{LAddchild(p,S,fp);}}fclose(fp);printf("家谱信息已从文件中成功读出!\n");return;}。