二叉树家谱

更新时间:2024-06-12 19:03:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《数据结构》 课程实训报告

题 目:家谱树 完 成 人: 专业班级: 学 号: 指导教师:

年 月 日

- - 1 - -

1. 题目与要求

1.1 问题提出

本人计划编写一个家谱管理系统,主要用来管理家族成员的基本信息。

1.2 本系统涉及的知识点

结构体,数组,循环,函数,分支,指针

1.3 功能要求

1、确定整个程序的功能模块。实现程序的主界面,要对主界面的功能选择

输入进行容错处理。 2、实现单个结点信息的录入。 3、对录入日期信息进行合法性检验。

4、采用改变字体颜色的方式突出显示主界面的功能项。 5、计算从出生日期到死亡日期的实际天数

6、若家谱树为空,则新建家谱树。实现成员节点的添加。基本功能中可以 强制要求所有成员不同名,即不考虑同名情况(符合小家族的实际情况)。 7、添加成员节点时,可以选择将新添加的节点作为整个家谱的上一代祖先, 或者将新添加的节点作为某个现有成员的孩子。

8、作为某个现有成员的孩子,根据给出的父节点的姓名将该结点添加到相 应位置,注意,针对某一父节点,添加第一个孩子和其它孩子的区别。 9、要求在孩子兄弟二叉树中按各个孩子的年龄进行排序。 10、将家谱树保存到二进制文件。注意,不能保存空白节点。 11、从文件读入家谱信息,重建孩子兄弟二叉树形式的家谱。

12.从文件中读出所有节点信息到一个数组中,然后按一年中生日的先后进 行快速排序。

13、按姓名查询家谱成员并显示该成员的各项信息。 14、给出某一成员的姓名,删除该成员和该成员的所有子孙。

15、成员信息的修改。信息修改时要给出选择界面让用户选择需要修改的信 息项。基本功能中可以限定不容许修改父亲姓名和本人姓名。对日期信 息进行修改时要进行检验。

16、实现层次递进的方式显示整个家谱,显示结果应该体现家谱树的结构。

17、按各种关键字进行查询,要求给出关键字选择界面,并显示符合查询条 件的节点信息。

18、信息统计基本要求包括:平均身高,平均寿命,男女成员各多少,平均 家庭人口数目(假定每个成员构成一个家庭,该家庭的家庭成员是指成

- - 2 - -

员本人和他的孩子,即家庭人口数=孩子数+1)。要给出统计项的选择界 面.

19、查询某一成员的所有直系亲属。 20、给出某一成员的所有嫡系祖先。

21、确定两人关系。若两人辈分不等,则应指出甲是乙的多少代长辈(晚辈), 甲是否是乙的直系长辈(晚辈),若辈分相同,则应指出是亲兄弟还是多 少代的堂兄弟。

2. 功能设计

2.1 算法设计

本程序需要实现的功能要求: 1.利用switch设计如下图的主菜单

请输入选项编号(1~6)

1—新建家谱 2—成员添加 3—查找成员 4—删除成员

5—修改成员信息

6—显示家谱

7—统计操作

8—从文件读取家 谱 9—保存家谱 0—退出

图1树状家谱管理系统主菜单

选择1后,调用CreateTree函数:创建个人信息作为整个家族的祖先

- - 3 - -

选择2后,调用Add函数,判断是否存在家谱,若不存在家谱则直接创建个人信息作为整个家族的祖先,若存在则进入添加成员菜单。

.

1—增添祖先 2—增添新成员 图2添加成员菜单

(1)选择1后,首先调用CreateTree(BinTree &T,BinTree F)函数:创建个人

信息作为整个家族的祖先

最后,调用AddDegress(BinTree &T)函数:修改所有成员辈分 (2)选择2后,首先调用Value(BinTree T,char Name[len])查找到添加成员

的父亲

然后调用CreateTree(BinTree &T,BinTree F)函数:创建个人信息作为查

找到的父亲的孩子 选择3后,进入查询菜单。

1--按姓名查找 2--按出生日期查找 3--按是否健在及死亡日期查找 4--按出生地址查找 5--按家庭住址查找 6--按简历查找 7—按父亲姓名查找 8—按辈分查找 9—按身高查找 10-按年龄查找 11-查询直系亲属 12-查询嫡系祖先 13-查询两人之间的关系 - - 4 - -

14-查询某人生存天数 0-返回上一级 图3查询信息菜单

(1)首先,调用InquireName(BinTree T)函数:根据输入的姓名以及调用Value

函数定位成员节点

然后,调用Put(BinTree T)函数:显示该成员的个人信息

(2)首先,InquireBirthday(BinTree T)函数:根据输入的出生日期以及

ValueBirthday(BinTree T,Date Birth)函数定位成员节点

然后,调用Put(BinTree T)函数:显示所有符合条件成员的个人信息 (3)首先,调用InquireSW(BinTree T)函数:输入查找人是否健在

若健在,调用ValueSW(BinTree T)函数,输出所有符合条件的成员的个人

信息。

若死亡,调用ValueDie(BinTree T,Date Die)函数,输出所有符合条件的

成员的个人信息

(4)首先,调用InquireBrothadd(BinTree T)函数:根据输入的出生地址以及

ValueBrothadd(BinTree T,char Birthadd[len])函数定位符合条件的成员

然后,调用Put(BinTree T)函数:输出所有符合条件的成员的信息 (5)首先,调用InquireAddress(BinTree T)函数:根据输入的家庭住址以及

ValueAddress(BinTree T,char Vocation[len])函数定位成员节点 最后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息 (6)首先,调用InquireVocation(BinTree T)函数:根据输入的职业以及

ValueVocation(BinTree T,char Father[len])函数定位成员节点 最后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息 (7)首先,调用InquireFather(BinTree T)函数:根据输入的父亲姓名以及

ValueFather(BinTree T,char Father[len])函数定位

最后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息 (8)首先,InquireDegress(BinTree T)函数:根据输入的辈分以及 ValueDegress(BinTree T,int Degress)函数定位成员

然后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息 (9)首先,调用InquireHeight(BinTree T)函数:根据输入的身高以及

ValueHeight定位成员节点

- - 5 - -

最后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息 (10)首先,调用InquireAge(BinTree T)函数:根据输入的年龄以及

ValueAge(BinTree T,int Age)函数定位成员

最后,调用Put(BinTree T)函数:显示所有符合条件的成员的个人信息 (11)首先,调用InquireZhixi(BinTree T)函数:根据输入的查询人姓名以及

ValueZhixi(BinTree T,char Name[len])函数定位成员节点 然后,利用结构体指针*parent、*child查找到直系亲属

最后,调用Put函数:显示指定成员的个人信息以及直系亲属的信息 (12)首先,调用InquireRoot(BinTree T)函数:根据输入的查询人姓名以及

Value(BinTree T,char Name[len])函数定位成员节点 然后,利用结构体指针*parent查找到嫡系祖先

最后,调用Put(BinTree T)函数:显示指定成员的个人信息以及嫡系祖先

的信息

(13)首先,调用RelationShip(BinTree T)函数:根据输入的姓名确定两人的

关系

(14)首先,调用Inquireday(BinTree T)函数:根据输入的查询人的姓名以及

Value(BinTree T,char Name[len])函数定位成员 然后,调用Count_day(BinTree T)函数:计算出生存天数 最后,显示指定成员的生存天数 (0)破坏循环条件:c=0; 删除成员 查询新建成员 添加 成员 家谱 出生姓家庭出生健 在 地址地址名日期及死 查找 查找 查查找 亡日 找 期查找 主菜单 修改信息 显示家谱 统计操作 读取家谱 保存家谱 退出 简历查找 父亲姓名查找 辈分查找 身高查找 年查询龄直系查亲属 找 查询嫡系祖先 成员关系查询 查询生存天数 返回上一级 图4 查询信息模块图

- - 6 - -

选择4后,调用DeleteTree(BinTree &T)函数,根据输入的删除人的姓名以及

Value(BinTree T,char Name[len])函数定位成员 然后直接删除该成员以及该成员的后代

选择5后,进入修改菜单。

1—修改姓名

2—修改出生日期

图5 修改信息菜单

(1)根据输入的姓名以及调用Value(BinTree T,char Name[len])函数定位成

员,然后直接修改成员姓名,最后修改他所有孩子的父亲姓名。 (2)根据输入的姓名以及调用Value(BinTree T,char Name[len])函数定位成

员,然后直接修改成员出生日期

(3)根据输入的姓名以及调用Value(BinTree T,char Name[len])函数定位成

员,然后直接修改成员是否健在,若死亡则直接修改死亡日期

(4)根据输入的姓名以及调用Value(BinTree T,char Name[len])函数定位成

员,然后直接修改成员出生地址

(5)根据输入的姓名以及调用Value(BinTree T,char Name[len])函数定位成

员,然后直接修改成员家庭住址

(6)根据输入的姓名以及调用Value(BinTree T,char Name[len])函数定位成

员,然后直接修改成员职业

(7)根据输入的姓名以及调用Value(BinTree T,char Name[len])函数定位成

员,然后直接修改成员简历

3—修改成员是否健在及及死 亡日期 4—修改出生地址 5—修改家庭住址 6—修改职业 7—修改简历 0-返回上一级 - - 7 - -

(0)破坏循环条件:c=0;

新建成员 查询删除家谱 添加 成员 成员 修改 姓名 修改出生日期 主菜单 修改信息 显示家谱 统计操作 读取家谱 保存家谱 退出 修改是否健在及死亡日期 修改出生日期 修改家庭住址 修改职业 修改简历 返回上一菜单 图6 修改信息模块图

选择6后,调用OutPutFamily(BinTree T)函数:按线序遍历显示整个家谱树。 选择7后,调用MainMenueTongji(BinTree T)函数,进入信息统计菜单,并且 计算出平均年龄、平均身高、男女人数、家庭平均人口。

1—平均年龄 2—平均身高 3—性别报告 4—平均家庭人口 5—返回上一级 图7 统计操作菜单

(1) 直接输出平均年龄 (2) 直接输出平均身高 (3) 直接输出男女人数 (4) 直接输出平均家庭人口数

- - 8 - -

(5) 破坏菜单循环条件:C=0.

选择8后,调用ReadTree(BinTree &T)函数,利用队列,采用层次遍历读取文

件中的成员信息。

选择9后,调用BaoCun(BinTree T)函数,利用队列,采用层次遍历的方式把家

谱保存为二进制文件。

选择0后,破坏循环条件:c=0,退出程序

2.2 部分模块流程图

输入出生日期 N 出生日期 是否合法 Y 保存出生日 是否健在 输入死亡日期 N Y N 死亡日期合法且 在出生日期之后 Y 保存 图8 日期信息的合法性检验流程图

- - 9 - -

输入成员信息

Y 父亲是否有添加兄弟模块

第一个孩子

N 将新输入的节点作为父 亲节点的第一 个 孩子

完成

图9添加成员孩子模块流程图

输入的成员出生比第一个孩子早?N阴影部分的实际是链表插入Y将新输入的节点作为父节点的第一个孩子,原来的第一孩子作为新输入节点的兄弟C[i]保存孩子节点,i=1时指针指向第一个孩子新输入节点的兄弟指针指向C[i-1];C[i]的兄弟指针指向新输入节点;新输入节点的出生日期比C[i]晚YC[i+1]指针指向C[i]的brother;N完成

图10添加成员兄弟模块流程图

- - 10 - -

3.程序代码设计

(1)主菜单模块

1.函数原型:void MainMenue(BinTree T)

2.功能:列出程序功能,利用switch,scanf,gecher按需要进行选择。 3.变量及类型:int c:菜单循环条件

TreeNode F:在新建家谱中判断是否存在父亲

4.说明:system(\清屏

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 CreateTree(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 EnQueue(LinkQueue &Q,QElemType e) 2.功能:入队列

3.变量及类型:QueuePtr p:创建一个新队列成员

- - 11 - -

1.函数原型:int DeQueue(LinkQueue &Q,QElemType &e) 2.功能:出队列

3.变量及类型:QueuePtr p:删除队首成员

1.函数原型:int QueueEmpty(LinkQueue Q) 2.功能:判断队列是否为空 (7)查找指定节点模块

1.函数原型:BinTree Value(BinTree T,char Name[len])

2.功能根据输入的名字定位成员节点 (8)增添成员主菜单

1.函数原型:void Add(BinTree &T)

2.功能:列出增添功能,利用if,switch,scanf,getchar函数按需要选择 3.变量及类型:int c:菜单循环条件 int i:用于判断双亲输入次数 char Name[len]:接收输入的父亲姓名

BinTree Tree:用于构建新祖先节点,定位双亲节

BinTree P:用于判断新建节点是否存在父亲 BinTree F:用于存放父亲节点 BinTree C[len]:用于存放孩子节点

4.说明:判断是否存在家谱,若不存在,则直接创建个人信息作为家谱的祖先,若存在家谱则进入添加菜单,添加祖先时,原先所有成员的辈分加一,添加孩子是判断是否为第一个孩子,是则直接添加,不是则是添加为父亲第一个孩子的兄弟

(9)数据存储模块

1.函数原型:void BaoCun(BinTree T) 2.功能:保存整个家谱树的成员信息

3.变量及类型:FILE *fp:文件指针,用于文件打开,访问,关闭操作。 LinkQueue q:申请一个队列 QElemType a:用于队列元素操作 QElemType C[len]:用于保存孩子节点 Int i:判断孩子个数 (10)从文件读取数据模块

1.函数原型:void InPut(BinTree &B,FILE *fp) 2.功能:从文件中读取数据到B中

3.变量及类型:FILE *fp: 文件指针,用于文件打开,访问,关闭操作。

- - 12 - -

BinTree &B:用于存放读取出来的成员数据 (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 C[len]:保存孩子节点 BinTree F:保存父亲节点

QElemType p;:用于在新建立的家谱中找到p保存到F中

4.说明:利用队列,用层次遍历建立家谱

(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 name[len]:存放查询人姓名

BinTree Tree:保存需要查询人节点

(14)删除模块

1.函数原型:void DeleteTree(BinTree &T) 2.功能:删除成员及其后代

3.变量及类型:BinTree Tree:用于定位成员节点

char name[len]: 用于接收输入的成员姓名。 BinTree F :保存父亲节点 BinTree P:保存孩子节点

BinTree Q:跟踪保存P的上一个节点

- - 13 - -

1.函数原型:void ShiFang(BinTree T) 2.功能:按后序释放节点空间

(15)修改模块

1.函数原型:void MainMenue1(BinTree T) 2.功能:修改某成员的个人信息

3.变量及类型:int C:控制菜单循环条件

(16)统计操作模块

1.函数原型:void MainMenueTongji(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.功能:列出亲属查询、关系查询等功能,进行操作选择 3.变量及类型:int i: 接收输入的编号 int k:用于菜单循环控制

char name[len_name]:接收输入的成员姓名 TreeNode p:用于定位成员节点

1.函数原型:InquireRoot(BinTree T) 2.功能:显示某个成员的所有直系亲属

3.变量及类型:char name[len]:记录查询人的姓名

int j:控制是否需要重新查询 BinTree Tree:保存查询人节点

1.函数原型:int ValueZhixi(BinTree T,char Name[len]) 2.功能:输出所有直系亲属的个人信息

- - 14 - -

1.函数原型:void InquireZhixi(BinTree T) 2.功能:查找到指定节点

1.函数原型:void RelationShip(BinTree T) 2.功能:查询两个成员之间的关系

3.变量及类型:char name1[len]:用于接收输入的第一个成员姓名 char name2[len]: BinTree Tree1 BinTree Tree2

3.总结 3-1

(1)界面容错 输入:asdf 截屏:

用于接收输入的第二个成员姓名 :存放第一个人的节点 :存放第二个人的节点 - - 15 - -

结果分析:只能输入0~9的数字,其他的字符都错误。

(2)对日期的校验

输入:1991年2月29日

输出:给出提示“输入的出生日期错误!请重新输入!!” 错误分析:1991年是平年,只有28天 输入:2000年2月29日

结果分析:2000年是闰年,有29天。

死亡日期输入:2001年2月6日

- - 16 - -

输出:“死亡日期比出生日期早,请从新输入”

错误分析:死亡日期必须比出生日期早,否则出错。

(3)增添新成员 输入:asdf

输出:给出提示“父亲姓名输入错误,你还有2次机会” 输入:asdf

输出:给出提示“父亲姓名输入错误,你还有1次机会.” 输入:asdf

输出:“父亲姓名输入错误,请按Enter键继续操作”

错误分析:家谱中不存在,所以没有找到

- - 17 - -

(4)删除成员 输入:asdf

输出:“不存在此人!请重新输入你要删除人的姓名\ 输入:张小小

输出:给出提示“删除成功”

(5)显示成员信息 输入:张小弟

(6)修改成员信息 输入:张小弟

- - 18 - -

(7)显示家谱

(8)查询直系亲属 输入:张一山

- - 19 - -

(8)平均年龄

(10)查询成员间关系 输入:张小弟 张小小

3-2 心的体会:

在做家谱管理系统时,刚开始觉得很难,特别是原先自己提前做了一下,感

觉好难,对孩子兄弟树好陌生,感觉是无从下手,特别是添加成员时,老是添加不成功,就老是在埋怨,还有很多感觉很陌生的,就像第一部分的字体颜色改变,最后还是攻克了。实际上有很多都是学过的,网络上也有很多资源,只是不会运用罢了,需要我们不断的去拓展。

影响最深刻的就是文件的存取这部分,尤其是需要从文件中读取出来的时

候,要跟存储时相对应,存储时采用什么方式存储,读取时就要采用什么方式读取,最后想了好久才用层次遍历的方式弄成功了。有时候看着自己编的

- - 20 - -

程序,往往会有一种成就感,这是一种动力,我相信我会越走越远?

5.结束语

这次实训让我学到了很多关于树和结构体、队列等的相关操作,使我对编程有了更大的信心,很感谢阳树洪老师对我的教导,不懂的地方也是能够耐心解释,虽然只是一个小程序,但我感到很自豪,因为它是我自己的成果。 附录:程序清单

//头文件 #include #include #include #include

#define len 20 #define MAX 100

////////////////////////////////////////////////

typedef struct Date { int year; //年 int month; //月

int day; //日}Date;

typedef struct ifo { char Name[len]; Date Birthday; char SW[len]; Date Dieday; char Kind[len]; char Marital[len]; char Brothadd[len]; char Address[len]; char Vocation[len];

char Degree[len]; //定义时间结构体 //成员信息结构体 //记录这个人的姓名 //记录这个人的出生日期 //记录这个人是否死亡 //记录这个人的死亡日期 //记录这个人的性别 //记录这个人婚否 //记录这个人的出生地址 //记录这个人的家庭住址 //记录这个人的职业 //记录这个人的简历

- - 21 - -

char Father[len]; //记录这个人的父亲姓名 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;

typedef struct QNode //队列 {

QElemType Data; struct QNode *next;

}QNode,*QueuePtr; typedef struct {

QueuePtr front,rear;

}LinkQueue;

///////////////////////////////////////////////////////////////////////

void MainMenue1(BinTree T); //子菜单选择 void MainMenue(BinTree T); //菜单选择

int Inspect1(Date B,Date D); //判断日期大小--B大于D int Inspect(Date D); //判断时间的正确性 BinTree Value(BinTree T,char Name[len]); //查找指定结点

void AddDegress(BinTree &T); //添加祖先时树的每个成员辈分加一

void Add(BinTree &T); //增加成员 void CreateTree(BinTree &T,BinTree F); //单个节点的录入 void BaoCun(BinTree T); //把家谱保存到文件中

- - 22 - -

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); void ChangeDegree(BinTree &T); void OutPutFamily(BinTree T); int ValueBirthday(BinTree T,Date Birth); void InquireBirthday(BinTree T); int ValueDie(BinTree T,Date Die); int ValueSW(BinTree T); void InquireSW(BinTree T); 查找

int ValueBrothadd(BinTree T,char Birthadd[len]); void InquireBrothadd(BinTree T); int ValueBrothadd(BinTree T,char Address[len]); void InquireAddress(BinTree T); int ValueVocation(BinTree T,char Vocation[len]); void InquireVocation(BinTree T); int ValueFather(BinTree T,char Father[len]); void InquireFather(BinTree T); int ValueDegress(BinTree T,int Degress); void InquireDegress(BinTree T); int ValueHeight(BinTree T,int Height); void InquireHeight(BinTree T); int ValueAge(BinTree T,int Age); void InquireAge(BinTree T); void MainMenueTongji(BinTree T); - - 23 - -

//修改成员出生日期 //修改成员是否健在 //修改成员出生地址 //修改成员家庭住址 //修改成员职业 //修改成员简历 //按层次遍历输出家谱 //按出生日期查找辅助函数 //按出生日期查找 //按死亡日期查找辅助函数 //查找健在的人的辅助函数 //按成员是否健在及死亡日期 //按成员出生地址查找辅助函数 //按成员出生地址查找 //按成员家庭住址查找辅助函数 //按成员家庭住址查找 //按成员职业查找辅助函数 //按成员职业查找 //按父亲姓名查找辅助函数 //按父亲姓名查找 //按辈分查找辅助函数 //按辈分查找 //按身高查找辅助函数 //按身高查

//按年龄查找辅助函数 //按身高查找 //统计操作

void CengciPut(BinTree T); //层次遍历输出

int ValueZhixi(BinTree T,char Name[len]); //查询某一成员的所有直系亲属辅助函数

void InquireZhixi(BinTree T); //查询某一成员的所有直系亲属 void InquireRoot(BinTree T); //查询某一成员的所有嫡系祖先

void RelationShip(BinTree T); //查询两个人的关系 int Count_day(BinTree T); //生存天数计算 void Inquireday(BinTree T); //生存天数

#include #include #include //#include #include\

//typedef BinTree QElemType;

////////////////////////////////////////////////////////////////////////// void MainMenue1(BinTree T) {//菜单选择

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

int c; while(1) {

system(\好像是清屏幕 HANDLE consolehwnd;

consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);

EEN|FOREGROUND_RED); //设置文字颜色为黄色

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

printf(\

printf(\ ---*****---请选择你的操作---****---\

EEN|FOREGROUND_RED|FOREGROUND_BLUE);//设置文字颜色为白色

printf(\

- - 24 - -

SetConsoleTextAttribute(consolehwnd,FOREGROUND_GREEN|FOREGROUND_INTENS

ITY); //设置文字颜色为绿色

printf(\修改姓名------------------------------\printf(\修改出生日期--------------------------\

printf(\修改成员是否健在及死亡日期------------\printf(\修改出生地址--------------------------\printf(\修改家庭住址--------------------------\printf(\修改职业------------------------------\printf(\修改简历------------------------------\printf(\返回上一菜单--------------------------\

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

EEN|FOREGROUND_RED|FOREGROUND_BLUE); //设置文字颜色为白色

printf(\printf(\请输入你的选项:(0~5)\fflush(stdin); scanf(\switch(c) { case 1:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

XiuGaiName(T);

printf(\不存在家谱树!请返回重新选择\

case 2:

system(\清屏幕

- - 25 - -

if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

ChangeBirthday(T);

printf(\不存在家谱树!请返回重新选择\

case 3:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

ChangeSW(T);

printf(\不存在家谱树!请返回重新选择\

case 4:

system(\清屏幕 if (T==NULL) { } else {

printf(\不存在家谱树!请返回重新选择\

- - 26 - -

ChangeBrothadd(T); }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

case 5:

system(\清屏幕 if (T==NULL) { } else {

ChangeAddress(T); }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

printf(\不存在家谱树!请返回重新选择\

case 6:

system(\清屏幕 if (T==NULL) { } else {

ChangeVocation(T); }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

printf(\不存在家谱树!请返回重新选择\

case 7:

- - 27 - -

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

ChangeDegree(T);

printf(\不存在家谱树!请返回重新选择\

case 0:

break;

default:

fflush(stdin); system(\

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_RE

D);//设置文字颜色为红色

printf(\对不起!你的选择不在服务范围之内!-------------\printf(\请您再次选择所需的服务项!-----------------\printf(\请按任意键键继续操作--------------------\printf(\谢谢合作!--------------------------\\n\\t\

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

EEN|FOREGROUND_RED|FOREGROUND_BLUE);//设置文字颜色为白色

}

///////////////////////////////////////////////////////////////////////////////

}

}

if(c==0) break;

getchar(); break;

- - 28 - -

void MainMenueInquire(BinTree T) {//菜单选择

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

int c; while(1) {

c=100;

system(\好像是清屏幕 HANDLE consolehwnd;

consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);

EEN|FOREGROUND_RED); //设置文字颜色为黄色

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

printf(\

printf(\ ---*****---请选择你的操作---****---\

EEN|FOREGROUND_RED|FOREGROUND_BLUE);//设置文字颜色为白色

SetConsoleTextAttribute(consolehwnd,FOREGROUND_GREEN|FOREGROUND_INTENS

printf(\

ITY); //设置文字颜色为绿色

printf(\按姓名查找----------------------------\printf(\按出生日期查找------------------------\

printf(\按成员是否健在及死亡日期查找----------\printf(\按出生地址查找------------------------\printf(\按家庭住址查找------------------------\printf(\按简历查找----------------------------\printf(\按父亲姓名查找------------------------\printf(\按辈分查找----------------------------\printf(\按身高查找----------------------------\printf(\按年龄查找----------------------------\printf(\查询某一成员的所有直系亲属------------\printf(\查询某一成员的所有嫡系祖先------------\printf(\查询两个人的关系----------------------\printf(\查询某人生存天数----------------------\

- - 29 - -

printf(\返回上一菜单,退出查找----------------\

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

EEN|FOREGROUND_RED|FOREGROUND_BLUE); //设置文字颜色为白色

printf(\printf(\请输入你的选项:(0~5)\fflush(stdin); scanf(\fflush(stdin); switch(c) { case 1:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

InquireName(T);

printf(\不存在家谱树!请返回重新选择\

case 2:

system(\清屏幕 if (T==NULL) { } else { }

InquireBirthday(T);

printf(\不存在家谱树!请返回重新选择\

- - 30 - -

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

case 3:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

InquireSW(T);

printf(\不存在家谱树!请返回重新选择\

case 4:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

InquireBrothadd(T);

printf(\不存在家谱树!请返回重新选择\

case 5:

system(\清屏幕

- - 31 - -

if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

InquireAddress(T);

printf(\不存在家谱树!请返回重新选择\

case 6:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

InquireVocation(T);

printf(\不存在家谱树!请返回重新选择\

case 7:

system(\清屏幕 if (T==NULL) { } else {

InquireFather(T);

printf(\不存在家谱树!请返回重新选择\

- - 32 - -

}

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

case 8:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

InquireDegress(T);

printf(\不存在家谱树!请返回重新选择\

case 9:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

InquireHeight(T);

printf(\不存在家谱树!请返回重新选择\

case 10:

system(\清屏幕

- - 33 - -

if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

InquireAge(T);

printf(\不存在家谱树!请返回重新选择\

case 11:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

InquireZhixi(T);

printf(\不存在家谱树!请返回重新选择\

case 12:

system(\清屏幕 if (T==NULL) { } else {

InquireRoot(T);

printf(\不存在家谱树!请返回重新选择\

- - 34 - -

}

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

case 13:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

RelationShip(T);

printf(\不存在家谱树!请返回重新选择\

case 14:

system(\清屏幕 if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

Inquireday(T);

printf(\不存在家谱树!请返回重新选择\

case 0:

break;

- - 35 - -

default:

fflush(stdin); system(\

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_RE

D);//设置文字颜色为红色

printf(\对不起!你的选择不在服务范围之内!-------------\printf(\请您再次选择所需的服务项!-----------------\printf(\请按任意键键继续操作--------------------\printf(\谢谢合作!--------------------------\\n\\t\

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

EEN|FOREGROUND_RED|FOREGROUND_BLUE);//设置文字颜色为白色

}

/////////////////////////////////////////////////////////////////////////////// void MainMenue(BinTree T) {//菜单选择

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

int c;

BinTree F=NULL; BinTree F=NULL; SYSTEMTIME calendar; GetLocalTime(&calendar); while(1) {

system(\好像是清屏幕 HANDLE consolehwnd;

consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE); }

}

if(c==0) break;

getchar(); break;

- - 36 - -

EEN|FOREGROUND_RED); //设置文字颜色为黄色

printf(\

printf(\ 当前时间为:\

printf(\年d月d日 d:d:d\\n\calendar.wYear,

calendar.wMonth, calendar.wDay, calendar.wHour, calendar.wMinute, calendar.wSecond);

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

printf(\ ---*****---请选择你的操作---****---\

EEN|FOREGROUND_RED|FOREGROUND_BLUE);//设置文字颜色为白色

SetConsoleTextAttribute(consolehwnd,FOREGROUND_GREEN|FOREGROUND_INTENS

printf(\

ITY); //设置文字颜色为绿色

printf(\新 建 家 谱----------------------------\printf(\成 员 添 加 ---------------------------\printf(\查询成员信息---------------------------\printf(\删除家谱成员---------------------------\printf(\成员信息修改---------------------------\printf(\家谱树的显示---------------------------\printf(\统计操作-------------------------------\

printf(\从文件中读取信息重建家谱树-------------\printf(\保存家谱到文件-------------------------\printf(\退出-----------------------------------\

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

EEN|FOREGROUND_RED|FOREGROUND_BLUE); //设置文字颜色为白色

printf(\printf(\请输入你的选项(0~8):\scanf(\switch(c) { case 1:

system(\清屏幕

T=(BinTree)malloc(sizeof(BinNode)); T->parent =NULL;

- - 37 - -

T->brother=NULL; CreateTree(T,F); T->data.Degress=1;

printf(\家谱图已经建立成功---------------\\n\\n\printf(\请按Enter键继续操作--------------\getchar(); break;

case 2:

Add(T); fflush(stdin);

printf(\请按Enter键继续操作--------------\getchar(); break;

case 3:

MainMenueInquire(T); //查找子菜单 fflush(stdin); break;

case 4:

if (T==NULL) { } else { }

printf(\请按Enter键返回菜单--------------\fflush(stdin); getchar(); break;

DeleteTree(T);

printf(\删除成功!------------------\printf(\不存在家谱树!请返回重新选择\

case 5:

MainMenue1(T); //修改子菜单 fflush(stdin); break;

- - 38 - -

case 6:

if (T==NULL) { } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

OutPutFamily(T);

printf(\不存在家谱树!请返回重新选择\

case 7:

if (T==NULL) { } else { }

fflush(stdin); break;

MainMenueTongji(T);

printf(\不存在家谱树!请返回重新选择\

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar();

case 8:

ReadTree(T);

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

case 9:

if (T==NULL)

- - 39 - -

{ } else { }

printf(\请按Enter键继续操作--------------\fflush(stdin); getchar(); break;

BaoCun(T);

printf(\不存在家谱树!请返回重新选择\

case 0:

break;

default:

fflush(stdin);

//system(\清屏幕

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_RE

D);//设置文字颜色为红色

printf(\对不起!你的选择不在服务范围之内!-----------\printf(\请您再次选择所需的服务项!-----------------\printf(\请按任意键键继续操作--------------------\printf(\谢谢合作!------------------------\\n\\t\

SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY|FOREGROUND_GR

EEN|FOREGROUND_RED|FOREGROUND_BLUE);//设置文字颜色为白色

}

///////////////////////////////////////////////////////////////////////// void main()

}

}

if(c==0) break;

getchar(); break;

- - 40 - -

本文来源:https://www.bwwdw.com/article/v7g6.html

Top