二叉树家谱(共110页).doc

上传人:飞****2 文档编号:13345614 上传时间:2022-04-29 格式:DOC 页数:110 大小:472.50KB
返回 下载 相关 举报
二叉树家谱(共110页).doc_第1页
第1页 / 共110页
二叉树家谱(共110页).doc_第2页
第2页 / 共110页
点击查看更多>>
资源描述

《二叉树家谱(共110页).doc》由会员分享,可在线阅读,更多相关《二叉树家谱(共110页).doc(110页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上数据结构课程实训报告题 目:家谱树完 成 人:专业班级:学 号:指导教师: 年 月 日1. 题目与要求1.1 问题提出本人计划编写一个家谱管理系统,主要用来管理家族成员的基本信息。1.2 本系统涉及的知识点结构体,数组,循环,函数,分支,指针1.3 功能要求 1、确定整个程序的功能模块。实现程序的主界面,要对主界面的功能选择输入进行容错处理。 2、实现单个结点信息的录入。 3、对录入日期信息进行合法性检验。 4、采用改变字体颜色的方式突出显示主界面的功能项。 5、计算从出生日期到死亡日期的实际天数6、若家谱树为空,则新建家谱树。实现成员节点的添加。基本功能中可以 强制

2、要求所有成员不同名,即不考虑同名情况(符合小家族的实际情况)。7、添加成员节点时,可以选择将新添加的节点作为整个家谱的上一代祖先, 或者将新添加的节点作为某个现有成员的孩子。8、作为某个现有成员的孩子,根据给出的父节点的姓名将该结点添加到相 应位置,注意,针对某一父节点,添加第一个孩子和其它孩子的区别。 9、要求在孩子兄弟二叉树中按各个孩子的年龄进行排序。 10、将家谱树保存到二进制文件。注意,不能保存空白节点。 11、从文件读入家谱信息,重建孩子兄弟二叉树形式的家谱。12.从文件中读出所有节点信息到一个数组中,然后按一年中生日的先后进 行快速排序。 13、按姓名查询家谱成员并显示该成员的各项

3、信息。 14、给出某一成员的姓名,删除该成员和该成员的所有子孙。15、成员信息的修改。信息修改时要给出选择界面让用户选择需要修改的信 息项。基本功能中可以限定不容许修改父亲姓名和本人姓名。对日期信 息进行修改时要进行检验。 16、实现层次递进的方式显示整个家谱,显示结果应该体现家谱树的结构。17、按各种关键字进行查询,要求给出关键字选择界面,并显示符合查询条 件的节点信息。18、 信息统计基本要求包括:平均身高,平均寿命,男女成员各多少,平均 家庭人口数目(假定每个成员构成一个家庭,该家庭的家庭成员是指成 员本人和他的孩子,即家庭人口数=孩子数+1)。要给出统计项的选择界 面. 19、查询某一

4、成员的所有直系亲属。 20、给出某一成员的所有嫡系祖先。21、确定两人关系。若两人辈分不等,则应指出甲是乙的多少代长辈(晚辈), 甲是否是乙的直系长辈(晚辈),若辈分相同,则应指出是亲兄弟还是多 少代的堂兄弟。2. 功能设计2.1 算法设计本程序需要实现的功能要求:1.利用switch设计如下图的主菜单 请输入选项编号(16)1新建家谱 2成员添加3查找成员4删除成员5修改成员信息6显示家谱 7统计操作8从文件读取家 谱 9保存家谱0退出图1树状家谱管理系统主菜单选择1后,调用CreateTree函数:创建个人信息作为整个家族的祖先选择2后,调用Add函数,判断是否存在家谱,若不存在家谱则直接

5、创建个人信息作为整个家族的祖先,若存在则进入添加成员菜单。.1增添祖先2增添新成员图2添加成员菜单(1)选择1后,首先调用CreateTree(BinTree &T,BinTree F)函数:创建个人信息作为整个家族的祖先 最后,调用AddDegress(BinTree &T)函数:修改所有成员辈分(2)选择2后,首先调用Value(BinTree T,char Namelen)查找到添加成员的父亲 然后调用CreateTree(BinTree &T,BinTree F)函数:创建个人信息作为查找到的父亲的孩子选择3后,进入查询菜单。1-按姓名查找2-按出生日期查找3-按是否健在及死亡日期查找

6、4-按出生地址查找5-按家庭住址查找6-按简历查找7按父亲姓名查找8按辈分查找9按身高查找10-按年龄查找11-查询直系亲属12-查询嫡系祖先 13-查询两人之间的关系14-查询某人生存天数0-返回上一级图3查询信息菜单(1)首先,调用InquireName(BinTree T)函数:根据输入的姓名以及调用Value函数定位成员节点 然后,调用Put(BinTree T)函数:显示该成员的个人信息(2)首先,InquireBirthday(BinTree T)函数:根据输入的出生日期以及ValueBirthday(BinTree T,Date Birth)函数定位成员节点 然后,调用Put(B

7、inTree T)函数:显示所有符合条件成员的个人信息(3)首先,调用InquireSW(BinTree T)函数:输入查找人是否健在 若健在,调用ValueSW(BinTree T)函数,输出所有符合条件的成员的个人信息。 若死亡,调用ValueDie(BinTree T,Date Die)函数,输出所有符合条件的成员的个人信息(4)首先,调用InquireBrothadd(BinTree T)函数:根据输入的出生地址以及ValueBrothadd(BinTree T,char Birthaddlen)函数定位符合条件的成员 然后,调用Put(BinTree T)函数:输出所有符合条件的成员

8、的信息(5)首先,调用InquireAddress(BinTree T)函数:根据输入的家庭住址以及ValueAddress(BinTree T,char Vocationlen)函数定位成员节点 最后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息(6)首先,调用InquireVocation(BinTree T)函数:根据输入的职业以及ValueVocation(BinTree T,char Fatherlen)函数定位成员节点 最后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息(7)首先,调用InquireFather(BinTree T

9、)函数:根据输入的父亲姓名以及ValueFather(BinTree T,char Fatherlen)函数定位 最后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息(8) 首先,InquireDegress(BinTree T)函数:根据输入的辈分以及 ValueDegress(BinTree T,int Degress)函数定位成员 然后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息(9)首先,调用InquireHeight(BinTree T)函数:根据输入的身高以及ValueHeight定位成员节点 最后,调用Put(BinTree T

10、)函数:显示所有符合条件的成员的个人信息(10)首先,调用InquireAge(BinTree T)函数:根据输入的年龄以及ValueAge(BinTree T,int Age)函数定位成员 最后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息(11)首先,调用InquireZhixi(BinTree T)函数:根据输入的查询人姓名以及ValueZhixi(BinTree T,char Namelen)函数定位成员节点 然后,利用结构体指针*parent、*child查找到直系亲属 最后,调用Put函数:显示指定成员的个人信息以及直系亲属的信息(12) 首先,调用Inq

11、uireRoot(BinTree T)函数:根据输入的查询人姓名以及Value(BinTree T,char Namelen)函数定位成员节点 然后,利用结构体指针*parent查找到嫡系祖先 最后,调用Put(BinTree T)函数:显示指定成员的个人信息以及嫡系祖先的信息(13)首先,调用RelationShip(BinTree T)函数:根据输入的姓名确定两人的关系(14)首先,调用Inquireday(BinTree T)函数:根据输入的查询人的姓名以及Value(BinTree T,char Namelen)函数定位成员 然后,调用Count_day(BinTree T)函数:计算

12、出生存天数 最后,显示指定成员的生存天数(0) 破坏循环条件:c=0;主菜单新建家谱成员添加查询成员删除成员退出保存家谱读取家谱统计操作显示家谱修改信息出生日期查找出生地址查找家庭地址查找查询直系亲属年龄查找辈分查找简历查找姓名查找健在及死亡日期查找返回上一级父亲姓名查找查询生存天数成员关系查询查询嫡系祖先身高查找图4 查询信息模块图选择4后,调用DeleteTree(BinTree &T)函数,根据输入的删除人的姓名以及Value(BinTree T,char Namelen)函数定位成员然后直接删除该成员以及该成员的后代选择5后,进入修改菜单。1修改姓名2修改出生日期3修改成员是否健在及及

13、死 亡日期4修改出生地址5修改家庭住址6修改职业7修改简历0-返回上一级 图5 修改信息菜单(1)根据输入的姓名以及调用Value(BinTree T,char Namelen)函数定位成员,然后直接修改成员姓名,最后修改他所有孩子的父亲姓名。(2)根据输入的姓名以及调用Value(BinTree T,char Namelen)函数定位成员,然后直接修改成员出生日期(3)根据输入的姓名以及调用Value(BinTree T,char Namelen)函数定位成员,然后直接修改成员是否健在,若死亡则直接修改死亡日期(4)根据输入的姓名以及调用Value(BinTree T,char Namele

14、n)函数定位成员,然后直接修改成员出生地址(5)根据输入的姓名以及调用Value(BinTree T,char Namelen)函数定位成员,然后直接修改成员家庭住址(6)根据输入的姓名以及调用Value(BinTree T,char Namelen)函数定位成员,然后直接修改成员职业(7)根据输入的姓名以及调用Value(BinTree T,char Namelen)函数定位成员,然后直接修改成员简历(0)破坏循环条件:c=0;主菜单新建家谱成员添加查询成员删除成员修改信息显示家谱统计操作读取家谱保存家谱退出返回上一菜单修改简历修改职业修改家庭住址修改出生日期修改是否健在及死亡日期修改出生日

15、期修改姓名图6 修改信息模块图选择6后,调用OutPutFamily(BinTree T)函数:按线序遍历显示整个家谱树。选择7后,调用MainMenueTongji(BinTree T)函数,进入信息统计菜单,并且 计算出平均年龄、平均身高、男女人数、家庭平均人口。1平均年龄2平均身高3性别报告4平均家庭人口5返回上一级图7 统计操作菜单(1) 直接输出平均年龄(2) 直接输出平均身高(3) 直接输出男女人数(4) 直接输出平均家庭人口数(5) 破坏菜单循环条件:C=0.选择8后,调用ReadTree(BinTree &T)函数,利用队列,采用层次遍历读取文件中的成员信息。 选择9后,调用B

16、aoCun(BinTree T)函数,利用队列,采用层次遍历的方式把家谱保存为二进制文件。选择0后,破坏循环条件:c=0,退出程序2.2 部分模块流程图输入出生日期出生日期是否合法N Y保存出生日期是否健在输入死亡日期 N Y 死亡日期合法且在出生日期之后 N Y 保存图8 日期信息的合法性检验流程图输入成员信息父亲是否有第一个孩子添加兄弟模块 Y N将新输入的节点作为父亲节点的第一 个 孩子 完成图9添加成员孩子模块流程图图10添加成员兄弟模块流程图3程序代码设计(1)主菜单模块 1.函数原型:void MainMenue(BinTree T) 2.功能:列出程序功能,利用switch,sc

17、anf,gecher按需要进行选择。 3.变量及类型:int c:菜单循环条件 TreeNode F:在新建家谱中判断是否存在父亲4.说明:system(cls) : 清屏 SetConsoleTextAttribute() : 改变字体颜色 (2)判断日期正误模块 1.函数原型:int Inspect(Date D) 2.功能:判断时间的正确性,正确返回1,错误返回0 (3)判断日期前后模块 1.函数模型:int Inspect1(Date B,Date D)2.功能:利用if函数判断日期的先后 3.说明:B的日期在D之前返回1,否则返回0(4)创建成员节点模块 1.函数原型:void Cr

18、eateTree(BinTree &T,BinTree F) 2.功能:利用for循环语句和scanf、strcmp函数完成对结构数组的输入,存放家谱中一个结点信息(姓名、性别、家庭住址,出生地、职业、辈分、出生日期、死亡日期、孩子个数、父亲姓名)3.变量及类型:int j:判断日期输入是否正确(5)辈分增加一模块 1.函数原型:void AddDegress(BinTree &T) 2.功能:利用树的左右节点是否为空来判断循环,每个节点的辈分增加一(6)队列模块 1.函数原型:void InitQueue(LinkQueue &Q) 2.功能:初始化队列 1.函数原型:void EnQueu

19、e(LinkQueue &Q,QElemType e)2.功能:入队列3.变量及类型:QueuePtr p:创建一个新队列成员1.函数原型:int DeQueue(LinkQueue &Q,QElemType &e)2.功能:出队列3.变量及类型:QueuePtr p:删除队首成员1.函数原型:int QueueEmpty(LinkQueue Q)2.功能:判断队列是否为空(7)查找指定节点模块 1.函数原型:BinTree Value(BinTree T,char Namelen)2.功能根据输入的名字定位成员节点(8)增添成员主菜单 1.函数原型:void Add(BinTree &T)

20、2.功能:列出增添功能,利用if,switch,scanf,getchar函数按需要选择 3.变量及类型:int c:菜单循环条件 int i:用于判断双亲输入次数 char Namelen:接收输入的父亲姓名 BinTree Tree:用于构建新祖先节点,定位双亲节BinTree P:用于判断新建节点是否存在父亲BinTree F:用于存放父亲节点BinTree Clen:用于存放孩子节点4.说明:判断是否存在家谱,若不存在,则直接创建个人信息作为家谱的祖先,若存在家谱则进入添加菜单,添加祖先时,原先所有成员的辈分加一,添加孩子是判断是否为第一个孩子,是则直接添加,不是则是添加为父亲第一个孩

21、子的兄弟(9)数据存储模块 1.函数原型:void BaoCun(BinTree T) 2.功能:保存整个家谱树的成员信息 3.变量及类型:FILE *fp:文件指针,用于文件打开,访问,关闭操作。 LinkQueue q:申请一个队列 QElemType a:用于队列元素操作 QElemType Clen:用于保存孩子节点 Int i:判断孩子个数 (10)从文件读取数据模块 1.函数原型:void InPut(BinTree &B,FILE *fp) 2.功能:从文件中读取数据到B中 3.变量及类型:FILE *fp: 文件指针,用于文件打开,访问,关闭操作。 BinTree &B:用于存

22、放读取出来的成员数据(11)数据读取建立孩子-兄弟树模块 1.函数原型:void ReadTree(BinTree &T) 2.功能:从InPut(BinTree &B,FILE *fp)读取节点并构建家谱树 3.变量及类型:FILE *fp: 文件指针,用于文件打开,访问,关闭操作。int i:判断孩子个数BinTree B:保存读取到的节点LinkQueue q,s,h;:新建队列QElemType a;:用于把所有成员按顺序放入队列BinTree Clen:保存孩子节点BinTree F:保存父亲节点QElemType p;:用于在新建立的家谱中找到p保存到F中 4.说明:利用队列,用层

23、次遍历建立家谱(12)显示模块1.函数原型:void Put(BinTree T)2.功能:显示某个成员的个人信息 (13)查询模块: 1.函数模块:void MainMenueInquire(BinTree T) 2.功能:提供选择查询方式 3.变量及类型: int c:控制菜单循环 1.函数原型:void InquireName(BinTree T);2.功能:根据输入的姓名进行定位成员节点3.变量及类型:int j:定位是否成功判断条件 char namelen:存放查询人姓名 BinTree Tree:保存需要查询人节点 (14)删除模块 1.函数原型:void DeleteTree(

24、BinTree &T) 2.功能:删除成员及其后代 3.变量及类型:BinTree Tree:用于定位成员节点 char namelen: 用于接收输入的成员姓名。 BinTree F :保存父亲节点 BinTree P:保存孩子节点 BinTree Q:跟踪保存P的上一个节点 1.函数原型:void ShiFang(BinTree T) 2.功能:按后序释放节点空间 (15)修改模块 1.函数原型:void MainMenue1(BinTree T) 2.功能:修改某成员的个人信息 3.变量及类型:int C:控制菜单循环条件 (16)统计操作模块 1.函数原型:void MainMenue

25、Tongji(BinTree T) 2.功能:显示功能列表并实现相应功能 3.变量及类型:int c:菜单循环控制条件 int people:用于计算家族总人口 double PHeight=0:用于计算平均身高 double PAge:用于计算平均年龄 int Pfamily:用于计算平均家庭人口 int man=0:用于计算男性人数 int woman:用于计算女性人数 LinkQueue q:申请一个队列 QElemType a:队列元素,用于队列操作 (17)亲属查询模块 1.函数原型:void Menue_5(TreeNode T); 2.功能:列出亲属查询、关系查询等功能,进行操作

26、选择 3.变量及类型:int i: 接收输入的编号 int k:用于菜单循环控制 char namelen_name:接收输入的成员姓名 TreeNode p:用于定位成员节点 1.函数原型:InquireRoot(BinTree T) 2.功能:显示某个成员的所有直系亲属 3.变量及类型:char namelen:记录查询人的姓名 int j:控制是否需要重新查询 BinTree Tree:保存查询人节点 1.函数原型:int ValueZhixi(BinTree T,char Namelen) 2.功能:输出所有直系亲属的个人信息 1.函数原型:void InquireZhixi(BinT

27、ree T) 2.功能:查找到指定节点 1.函数原型:void RelationShip(BinTree T) 2.功能:查询两个成员之间的关系 3.变量及类型:char name1len:用于接收输入的第一个成员姓名 char name2len:用于接收输入的第二个成员姓名 BinTree Tree1:存放第一个人的节点 BinTree Tree2:存放第二个人的节点 3.总结 3-1 (1)界面容错 输入:asdf 截屏: 结果分析:只能输入09的数字,其他的字符都错误。(2)对日期的校验 输入:1991年2月29日 输出:给出提示“输入的出生日期错误!请重新输入!” 错误分析:1991年

28、是平年,只有28天 输入:2000年2月29日结果分析:2000年是闰年,有29天。 死亡日期输入:2001年2月6日输出:“死亡日期比出生日期早,请从新输入”错误分析:死亡日期必须比出生日期早,否则出错。(3)增添新成员 输入:asdf 输出:给出提示“父亲姓名输入错误,你还有2次机会” 输入:asdf 输出:给出提示“父亲姓名输入错误,你还有1次机会.” 输入:asdf 输出:“父亲姓名输入错误,请按Enter键继续操作” 错误分析:家谱中不存在,所以没有找到 (4)删除成员 输入:asdf 输出:“不存在此人!请重新输入你要删除人的姓名 输入:张小小 输出:给出提示“删除成功” (5)显

29、示成员信息 输入:张小弟 (6)修改成员信息 输入:张小弟 (7)显示家谱(8) 查询直系亲属 输入:张一山 (8)平均年龄 (10)查询成员间关系 输入:张小弟 张小小3-2 心的体会: 在做家谱管理系统时,刚开始觉得很难,特别是原先自己提前做了一下,感觉好难,对孩子兄弟树好陌生,感觉是无从下手,特别是添加成员时,老是添加不成功,就老是在埋怨,还有很多感觉很陌生的,就像第一部分的字体颜色改变,最后还是攻克了。实际上有很多都是学过的,网络上也有很多资源,只是不会运用罢了,需要我们不断的去拓展。 影响最深刻的就是文件的存取这部分,尤其是需要从文件中读取出来的时候,要跟存储时相对应,存储时采用什么

30、方式存储,读取时就要采用什么方式读取,最后想了好久才用层次遍历的方式弄成功了。有时候看着自己编的程序,往往会有一种成就感,这是一种动力,我相信我会越走越远5.结束语这次实训让我学到了很多关于树和结构体、队列等的相关操作,使我对编程有了更大的信心,很感谢阳树洪老师对我的教导,不懂的地方也是能够耐心解释,虽然只是一个小程序,但我感到很自豪,因为它是我自己的成果。附录:程序清单/头文件#include #include #include #include #define len 20#define MAX 100/typedef struct Date /定义时间结构体int year; /年int

31、 month; /月int day; /日Date;typedef struct ifo /成员信息结构体char Namelen; /记录这个人的姓名Date Birthday; /记录这个人的出生日期char SWlen; /记录这个人是否死亡Date Dieday; /记录这个人的死亡日期char Kindlen; /记录这个人的性别char Maritallen; /记录这个人婚否char Brothaddlen; /记录这个人的出生地址char Addresslen; /记录这个人的家庭住址char Vocationlen; /记录这个人的职业char Degreelen; /记录这

32、个人的简历char Fatherlen; /记录这个人的父亲姓名int Degress; /记录这个人的辈分int Height; /记录这个人身高int Age; /记录这个人年龄int Num; /记录这个人拥有几个儿女ifo;typedef struct BinNode /定义树ifo data; /成员信息struct BinNode *child; /定义孩子指针struct BinNode *brother; /定义兄弟指针struct BinNode *parent; /定义父亲指针BinNode,*BinTree;/typedef BinTree QElemType;typed

33、ef struct QNode /队列QElemType Data;struct QNode *next;QNode,*QueuePtr;typedef structQueuePtr front,rear;LinkQueue;/void MainMenue1(BinTree T); /子菜单选择void MainMenue(BinTree T); /菜单选择int Inspect1(Date B,Date D); /判断日期大小-B大于Dint Inspect(Date D); /判断时间的正确性BinTree Value(BinTree T,char Namelen); /查找指定结点voi

34、d AddDegress(BinTree &T); /添加祖先时树的每个成员辈分加一void Add(BinTree &T); /增加成员void CreateTree(BinTree &T,BinTree F); /单个节点的录入void BaoCun(BinTree T); /把家谱保存到文件中void InPut(BinTree &B,FILE *fp); /从文件读取信息辅助函数void ReadTree(BinTree &T); /从文件读取信息建立家谱树void Put(BinTree T); /输出成员信息void InquireName(BinTree T); /姓名查询家谱成员并显示该成员的各项信息void DeleteTree(BinTree &T); /删除成员void XiuGaiName(BinTree &T); /修改成员姓名void ChangeBirthday(BinTree &T); /修改成员出生日期void ChangeSW(BinTree &T); /修改成员是否健在void ChangeBrothadd(BinTree &T); /修改成员出生地址void ChangeAddress(BinTree &T); /修改成员家庭住址void ChangeVocation(BinTree &T); /修改成员

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁