(完整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、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间: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;}。