家谱的设计与实现
族谱家谱制作方法

族谱家谱制作方法族谱家谱作为一种记录家族血脉和历史的重要资料,对于维系家族关系、传承家族文化、了解家族历史具有重要意义。
下面将介绍一种常见的族谱家谱制作方法。
一、族谱家谱的分类族谱家谱可以分为一般族谱和彩色族谱两种类型。
一般族谱是采用黑白印刷,只记录家族的基本信息;而彩色族谱则采用彩色印刷,不仅记录家族的基本信息,还包括家族历史、家族成员的照片等。
二、族谱家谱的内容族谱家谱的内容包括家族的起源、家族的分支、家族成员的姓名、出生日期、籍贯等基本信息,还可以添加家族成员的照片以及对家族历史的叙述等。
三、族谱家谱的制作流程1.确定族谱家谱的范围:首先确定族谱家谱所要覆盖的范围,可以是一个家族的所有成员,也可以是某一支家族的成员。
2.收集家族资料:收集家族成员的基本信息,如姓名、出生日期、籍贯等。
可以通过家族成员的口述或者查找家谱、户籍等渠道获取这些信息。
3.完善家族资料:将收集到的家族资料进行整理和补充,确保信息的准确性和完整性。
4.设计族谱家谱的版式:根据制作族谱家谱的需求,设计族谱家谱的版式,包括页面的排版、字体的选择等。
5.制作族谱家谱:根据设计好的版式,使用文字处理软件进行制作。
可以根据需求选择合适的排版软件,如Microsoft Word、Adobe InDesign等。
6.添加照片和插图:如果制作的是彩色族谱家谱,可以添加家族成员的照片和家族历史的插图,以丰富族谱家谱的内容。
7.校对和修改:完成族谱家谱后,进行校对和修改,确保文字的准确性和格式的美观。
8.印刷和装订:选择合适的印刷厂进行印刷,可以选择黑白印刷或者彩色印刷。
印刷完成后,选择合适的装订方式,如胶装、线装等。
9.分发族谱家谱:制作好的族谱家谱可以通过邮寄、交流会、家族聚会等方式进行分发,让更多的家族成员了解家族历史和血脉。
四、族谱家谱的保存和传承为了让族谱家谱能够长久保存和传承,应该做好以下几点:1.复制和备份:制作好的族谱家谱应该多备份几份,以备不时之需。
数据结构家谱程序

数据结构家谱程序家谱数据结构的设计与实现家谱是一种用来记录家族成员关系和家族历史的工具。
在计算机科学中,家谱可以被视为一个特殊类型的图结构,其中节点代表家族成员,边代表成员之间的关系。
设计一个高效的家谱数据结构对于实现家族历史查询、成员管理等功能至关重要。
本文将介绍两种常用的家谱数据结构:树状结构和邻接列表结构,并探讨它们在实现家谱程序中的应用和性能优缺点。
一、树状结构树状结构是一种层级化的数据结构,适用于表示具有层次关系的家谱信息。
在树状结构中,每个节点都有零个或多个子节点,而每个子节点又可以有它自己的子节点,依此类推。
这种结构使得家谱信息呈现出一种从上到下、从祖到孙的清晰层次感。
(1)易于表示层次关系:树状结构天然地适合表示家谱这种层次化的数据,可以直观地展示家族成员之间的亲属关系。
(2)高效的查询操作:在树状结构中,对于任意一个节点,我们都可以在O(h) 的时间内找到其父节点,其中 h 表示树的高度。
这对于实现家谱查询功能非常有利。
(3)灵活的扩展性:树状结构可以很容易地扩展新的家族成员和关系,只需要在合适的位置添加新的节点和边。
(4)空间复杂度高:树状结构需要为每个节点存储多个指针,这会导致较高的空间复杂度。
(5)查询速度受树形影响:在树状结构中,如果家谱层次较深,查询速度会受到树形的影响,性能可能不如其他结构。
二、邻接列表结构邻接列表是一种将图的节点和边分别存储在数组中的数据结构。
在邻接列表中,每个节点对应一个数组,数组中的每个元素都是一个表示相邻节点的列表。
这种结构适用于表示家谱中成员之间的关系。
(1)空间效率高:邻接列表结构不需要为每个节点存储多个指针,只需要存储指向相邻节点的指针,因此空间复杂度较低。
(2)查询速度快:在邻接列表结构中,对于任意一个节点,我们可以在O(1) 的时间内找到其所有子节点,这对于实现家谱查询功能非常有利。
(3)灵活的扩展性:邻接列表结构可以很容易地扩展新的家族成员和关系,只需要在相应的数组中添加新的元素。
家谱管理系统设计与实现

课程设计报告ﻩ课程名称ﻩ《数据结构》ﻩﻩ课题名称排序综合ﻩ专ﻩﻩ业ﻩﻩ班ﻩﻩ级ﻩﻩ学ﻩ号ﻩﻩﻩﻩﻩ姓ﻩ名ﻩﻩﻩﻩﻩﻩ联系方式ﻩﻩﻩﻩﻩ指导教师ﻩﻩﻩ20 11 年12月21 日目录1。
问题陈述 (3)2.设计方法阐述 (3)2.1总体规划 (3)2.2功能构想 (4)2。
2。
1增加成员........................................................................42。
2.2修改成员资料 (5)2。
2。
3删除成员........................................................................62.2.4打开家谱 (7)2.2。
5新建家谱 (8)2.2.6保存家谱...........................................................................102。
2.7查看某代信息 (11)2.2.8按姓名查找 (12)2.2.9按生日查找 (12)2。
2。
10查看成员关系..................................................................132。
2。
11按出生日期排序...............................................................1 4 2.3板块整合 (15)2.4调试分析.................................................................................193.总结 (19)4. 测试结果…………………………………………………………………………201.问题陈述家谱用于记录某家族历代家族成员的情况与关系。
现编制一个家谱资料管理软件,实现对一个家族所有的资料进行收集整理.支持对家谱的存储、更新、查询、统计等操作。
家谱设计教案

家谱设计教案教案标题:家谱设计教案教案目标:1. 了解家谱的概念和作用。
2. 学习家谱设计的基本步骤和技巧。
3. 培养学生的家族意识和历史意识。
4. 提高学生的绘画和创意能力。
教案步骤:引入活动:1. 向学生介绍家谱的概念和作用,解释家谱对于了解家族历史和传承家族文化的重要性。
知识讲解:2. 介绍家谱设计的基本步骤和技巧:a. 收集家族成员的姓名、出生日期和关系等信息。
b. 绘制家谱的框架,包括祖先、父母和子女等关系。
c. 使用合适的图形、符号和线条表示家族关系。
d. 添加个人照片或插图,使家谱更加生动有趣。
e. 考虑使用颜色、装饰等方式增加家谱的美观度。
示范演示:3. 展示一个精心设计的家谱样本,解释其中的设计理念和技巧,并鼓励学生提出问题和意见。
实践活动:4. 学生分组,每组选择一个家族成员作为设计对象,收集相关信息,并设计自己的家谱。
5. 引导学生使用绘图工具和材料,按照所学步骤和技巧,设计和绘制家谱。
6. 鼓励学生在家谱中加入个人创意和想法,使其更加独特和有个性。
展示和评价:7. 学生展示自己设计的家谱,并向其他同学介绍自己的家族历史和文化。
8. 引导学生互相评价和交流,分享对其他家谱设计的观点和建议。
总结和延伸:9. 总结家谱设计的重要性和技巧,并鼓励学生将所学应用到其他相关活动中,如家族聚会、文化节庆等。
10. 鼓励学生继续研究和探索自己的家族历史,加深对家族文化的认识和理解。
教学资源:1. 家谱样本2. 绘图工具和材料3. 家谱设计指导手册评估方式:1. 学生家谱设计的完成度和质量。
2. 学生对于家族历史和文化的理解和表达能力。
3. 学生对于家谱设计步骤和技巧的掌握程度。
教案扩展:1. 组织学生进行家谱展览活动,邀请家长和其他班级参观。
2. 鼓励学生进行家谱研究,了解更多关于家族历史和文化的信息。
3. 引导学生设计和制作家谱相关的手工制品,如家谱书签、家谱相框等。
希望这份教案能对您有所帮助,祝您教学顺利!。
数据结构_家谱管理系统

数据结构_家谱管理系统家谱是记录一个家族的血缘关系和历史的重要文化遗产。
传统的家谱管理方式通常是以纸质形式存在,随着科技的发展,数字化的家谱管理系统逐渐兴起。
本篇文章将介绍一个基于数据结构的家谱管理系统的设计与实现。
一、需求分析家谱管理系统的主要功能包括: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. 数据存储:可以将家族成员的信息存储在数据库中,以便实现更复杂的查询和统计功能。
家谱的实现与设计

家谱的实现与设计
首先,数据的收集和管理是实现家谱的基础。
可以通过采访家族成员、查阅历史文献和公共数据库等方式收集家族成员的个人信息和关系。
这些
信息可以包括姓名、性别、出生日期、父母、配偶、子女等。
在数据管理
方面,可以选择使用数据库来存储和管理数据,数据库可以提供高效的数
据检索和管理功能。
家谱的功能扩展是为了提供更多的价值和服务。
除了基本的家族成员
关系和血统记录功能之外,可以考虑添加其他功能如全球定位系统(GPS)跟踪家族成员的活动轨迹、上传和分享家族照片和视频等。
另外,可以与
社交媒体和云存储平台进行集成,使得家谱的信息能够更方便地与亲友共
享和访问。
此外,在实现家谱时还要考虑数据的隐私和安全保护。
可能有些家族
成员对于个人信息的公开程度有所不同,因此应该提供不同的权限设置,
使得每个家族成员可以控制自己信息的公开程度。
同时,应该采用措施保
护数据的安全,如数据加密、身份验证等。
最后,实现和设计家谱需要考虑到用户的使用体验。
用户的使用体验
包括界面的简洁和美观、功能的便捷和稳定等。
在开发过程中可以进行用
户测试和反馈收集,及时修复和改进存在的问题。
同时,也可以添加一些
生动有趣的元素,如家族故事、名言警句等,增强用户对于家谱的兴趣和
参与度。
总之,实现和设计家谱需要考虑数据收集和管理、用户界面设计、功
能扩展、数据隐私和安全保护以及用户体验等方面。
通过合理的规划和设
计,可以创建一个方便、实用且引人入胜的家谱,让家族成员能够更好地了解和连接彼此,传承家族文化和记忆。
数据结构家谱实验报告

数据结构家谱实验报告
以下是一个数据结构家谱实验报告的模板,可以根据实际情况进行修改和完善:
数据结构家谱实验报告
一、实验目的
本次实验的目的是设计并实现一个家谱数据结构,以展示家族成员之间的关系。
二、实验内容
1. 设计家谱的数据结构,包括节点和边的表示。
2. 实现家谱的基本操作,如添加、删除、查找节点。
3. 按家族关系遍历家谱。
4. 测试所实现的家谱数据结构。
三、实验结果
1. 成功设计了家谱的数据结构,使用邻接表表示节点和边的关系。
2. 实现了家谱的基本操作,可以添加、删除和查找节点。
3. 能够按照家族关系遍历家谱,展示家族成员之间的关系。
4. 通过编写测试用例,验证了所实现的家谱数据结构的正确性。
四、实验总结
通过本次实验,我对数据结构的应用有了更深入的理解。
在设计和实现家谱数据结构的过程中,我运用了邻接表这一数据结构来表示节点和边的关系,并且实现了家谱的基本操作。
通过按家族关系遍历家谱,我成功展示了家族成员之间的关系。
本次实验提高了我的编程能力和问题解决能力。
家谱的实现与设计说明

课程设计报告课程设计名称:数据结构课程设计系:三系学生姓名:朱强班级: 13软件学号: 20130311227 成绩:指导教师:刘杰开课时间:2014-2015学年一学期设计题目一:家谱的实现与设计一、实习目的通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。
二、问题描述家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。
可。
基本功能如下:(1)家谱祖先数据的录入(树的根结点)。
(2)家庭成员的添加:即添加某一人的儿女,儿女的数目由控制台端给出,然后输入相应的儿女姓名(此处儿女的姓名不能重名)。
(3)家庭成员的修改:可以修改某一成员的姓名。
(4)员的查询:查询某一成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。
(5)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后代成员。
三、需求分析该程序所做的工作是对家族成员的的管理,为家族成员对各代成员的姓名,性别及子女情况的记录、查询提供方便。
此程序规定:1.在姓名录入时,姓名为10个字母以内的字符串;性别以M/F表示;2.程序的输出信息主要为:输出家族成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。
3.程序的功能主要包括:家谱祖先数据的录入、家庭成员的添加、家庭成员的修改、员的查询、家庭成员的删除;四、概要设计系统用到的数据有:char name[MAX];char sex; /int generation;1)typedef struct node{ } //定义data存储结构2)typedef struct ft{ } //创建结构体3)ft *search(ft *p,char ch[]) // 搜索指针函数4)ft *parent(ft *p,ft *q,int *flag) //通过parent函数得到双亲结点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告课程设计名称:数据结构系:三系学生姓名:***班级:10计本2学号:***********成绩:指导教师:**开课时间:2011-2012 学年1 学期一.设计题目家谱的设计与实现(树,查找)二.主要内容家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。
可。
基本功能如下:(1)家谱祖先数据的录入(树的根结点)。
(2)家庭成员的添加:即添加某一人的儿女,儿女的数目由控制台端给出,然后输入相应的儿女姓名(此处儿女的姓名不能重名)。
(3)家庭成员的修改:可以修改某一成员的姓名。
(4)家庭成员的查询:查询某一成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。
(5)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后代成员。
三.课题设计的基本思想,原理和算法描述1.基本思想此课题使用的数据结构为树形结构,为使结构整洁清晰在此使用二叉树结构,其中data 存储结构中包含以下信息:姓名、性别、代目。
而二叉树结构中l为直系成员,m为旁系成员(即配偶)。
lchild指针指向其的兄弟,rchild指向孩子,实现功能的具体代码如下:typedef struct node{ //定义data存储结构char name[STA]; //姓名char sex; //性别int generation;//代目}node;typedef struct ft{struct node l; //家谱中直系成员struct node m; //家谱中旁系成员struct ft *lchild;//用来指向兄弟struct ft *rchild;//用来指向孩子}ft;2.输出界面:实现其功能的代码见源程序及注释。
3.输入信息通过搜索结点直接赋值,包含以下几个函数:(1)主要功能函数:void Add() 在主函数中直接调用。
下面四个函数为其子函数。
(2)搜索指针函数:ft *search(ft *p,char ch[]) 搜索需要改动的结点。
(3)获得代目函数:int generation(ft *p,char ch[]) 获得搜索到的成员的代目的返回值。
(4)存储孩子函数:void saves(ft *p,char b[],char c,int d) 创建结点并对l赋值。
思路如下:如该结点没有右孩子则直接创建右孩子结点,如果存在右孩子则对右孩子创建左孩子,作为兄弟结点,如此循环。
(5)存储配偶函数:void savep(ft *p,char b[],char c,int d) 直接对m成员赋值详细代码见源程序及注释。
4.输出结点信息通过搜索结点获得数据后输出,包含以下几个函数:(1)主要功能函数:void Search() 在主函数中直接调用。
下面两个函数为其子函数。
(2)搜索指针函数:ft *search(ft *p,char ch[]) 搜索需要获得的结点。
(3)输出数据函数:void disp(ft *n) 对搜索到数据的输出详细代码见源程序及注释。
5.修改成员姓名通过搜索结点获得数据后修改,包含以下几个函数:(1)主要功能函数:void Change() 在主函数中直接调用。
下面两个函数为其子函数。
(2)搜索指针函数:ft *search(ft *p,char ch[]) 搜索需要修改的结点,然后直接赋值修改。
6.删除成员及其孩子思想,包含以下几个函数:主要功能函数:void Del()搜索指针函数:ft *search(ft *p,char ch[])搜索双亲函数:ft *parent(ft *p,ft *q,int *flag)删除A则只需用free(root)函数初始化;删除结点则需要知道结点在二叉树的位置,通过parent函数得到双亲结点。
用flag标志,-1为左孩子,1为右孩子。
如删除B,则通过parent函数得到A结点,flag标志为1,进行如下操作:B的rchild指针指向NULL,A 的rchild指向C,即A->rchild=B->lchild ;如删除C或E,则可直接使B或D的lchild值等于C或E的lchild,rchild指向NULL即可。
具体代码见源程序及注解。
四.源程序及注释#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <string>#define STA 10typedef struct node{ //定义data存储结构char name[STA]; //姓名char sex; //性别int generation;//代目}node;typedef struct ft{struct node l; //家谱中直系家属struct node m; //家谱中旁系家属struct ft *lchild;//用来指向兄弟struct ft *rchild;//用来指向孩子}ft;ft *root;ft *search(ft *p,char ch[])//输入头指针,姓名{ft *q;if(p==NULL) return NULL;//没有家谱,头指针下为空if(strcmpi(p->,ch)==0||strcmpi(p-> ,ch)==0) return p;//家谱不为空,头指针下有这个人if(p->lchild){q=search(p->lchild,ch);//在做孩子中找if(q) return q;//找到}if(p->rchild){q=search(p->rchild,ch);//在右孩子中找if(q!=NULL) return q;}return NULL;//没有找到}ft *parent(ft *p,ft *q,int *flag){if(p==NULL) return NULL;//没有家谱,头指针下为空if(p->rchild==NULL) {flag=0;return NULL;}else{if(p->lchild==q){*flag=1;return p;}else if(p->rchild==q){*flag=-1;return p;}else{if(p->lchild!=NULL)parent(p->lchild,q,*&flag);if(p->rchild!=NULL)parent(p->rchild,q,*&flag);}}}int generation(ft *p,char ch[]){ft *q;if(p==NULL) return NULL;if(strcmpi(p->,ch)==0) return p->l.generation;//家谱不为空,头指针下有这个人if(p->lchild){q=search(p->lchild,ch);//在做孩子中找if(q) return q->l.generation;//找到}if(p->rchild){q=search(p->rchild,ch);//在右孩子中找if(q!=NULL) return q->l.generation;}return NULL;}void savep(ft *p,char b[],char c,int d)//建立家谱配偶节点{for(int i=0;i<STA;i++)p->[i]=b[i];p->m.sex=c;p->m.generation=d;}void saves(ft *p,char b[],char c,int d)//建立家谱孩子结点{for(int i=0;i<STA;i++)p->[i]=b[i];p->l.sex=c;p->l.generation=d;p->[0]='\0';}void disp(ft *n){ft *t=NULL;printf("此人姓名:%s 性别%c 为第%d代\n",n->,n->l.sex,n->l.generation);printf("此人的配偶:");printf("%s\n",n->);printf("此人的孩子:");if(n->rchild==NULL);else if(n->rchild->lchild==NULL)printf("%s %c\t",n->rchild->,n->rchil d->l.sex);else{printf("%s %c\t",n->rchild->,n->rchil d->l.sex);t=n->rchild->lchild;while(t!=NULL){printf("%s %c\t",t->,t->l.sex);t=t->lchild;}}printf("\n");}void Reset(){system("cls");char b[STA],c;int a;printf("┏━━━━━━━━━━━━┓\n");printf("┃初始化家谱... ┃\n");printf("┃建立家谱的第一代人┃\n");printf("┃输入姓名(不超过10个字符)┃\n");printf("┃及性别[M/F(男/女)] ┃\n");printf("┃如:XX M(姓名为XX性别男)┃\n");printf("┃┃\n");printf("┃家谱bata1.0┃\n");printf("┗━━━━━━━━━━━━┛\n");printf("请输入:");free(root);root=(ft *)malloc(sizeof(ft));scanf("%s %c",&b,&c);a=1;//输入姓名,性别root->rchild=NULL;root->lchild=NULL;saves(root,b,c,a);//存入结构system("cls");printf("初始化成功!\n");}void Manu(){printf("┏━━━━━━━━━━━━┓\n");printf("┃选择操作: ┃\n");printf("┣━━━━━━━┓0.退出┃\n");printf("┃家谱┃1.输入┃\n");printf("┃版本:bata1.0 ┃2.查找┃\n");printf("┃(C)2011 SQ Co.┃3.修改┃\n");printf("┃三系计本团队┃4.删除┃\n");printf("┃保留所有权利┃5.初始化┃\n");printf("┗━━━━━━━┻━━━━┛\n");}void Add(){ft *n,*m,*t=NULL;char b[STA],c,d[STA];int i;getchar();printf("请输入相关人姓名:\n");//判断是否有重名scanf("%s",&d);n=search(root,d);int a=generation(root,d);while(n==NULL){printf("此人不存在,请输入姓名:\n");getchar();scanf("%s",&d);n=search(root,d);}printf("选择家庭成员类别:(1.配偶 2.孩子)\n");scanf("%d",&i);if(i==1){getchar();printf("配偶输入:\n");scanf("%s %c",&b,&c);m=search(root,b);if(m!=NULL) printf("出现重名,请在姓名后标记后再输入\n");else savep(n,b,c,a);printf("操作结束!\n");}else//i=2孩子{getchar();if(n->rchild==NULL){printf("孩子输入:\n");scanf("%s %c",&b,&c);a++;m=search(root,b);if(m!=NULL) printf("出现重名,请在姓名后标记后再输入\n");else{n->rchild=(ft*)malloc(sizeof(ft));n->rchild->lchild=NULL;n->rchild->rchild=NULL;saves(n->rchild,b,c,a);}printf("操作结束!\n");}else{n=n->rchild;while(n->lchild!=NULL)n=n->lchild;printf("孩子输入:\n");scanf("%s %c",&b,&c);a++;m=search(root,b);if(m!=NULL) printf("出现重名,请在姓名后标记后再输入\n");else{t=(ft *)malloc(sizeof(ft));saves(t,b,c,a);t->lchild=NULL;t->rchild=NULL;n->lchild=t;}printf("完成!\n");}}}void Search(){ft *n;char d[STA];getchar();printf("输入姓名,查找相关信息:\n");scanf("%s",&d);n=search(root,d);while(n==NULL){printf("此人不存在,请再次输入:\n");getchar();scanf("%s",&d);n=search(root,d);}disp(n);}void Change(){getchar();char a[STA],r[STA],c;ft *n;printf("*注:修改配偶可直接在输入中覆盖\n");printf("请输入要修改的相关人姓名:");scanf("%s",&a);n=search(root,a);while(n==NULL){printf("此人不存在,请输入姓名:\n");getchar();scanf("%s",&a);n=search(root,a);}printf("请更改:");scanf("%s %c",&r,&c);for(int i=0;i<STA;i++)n->[i]=r[i];n->l.sex=c;printf("修改成功!\n");}void Del(){getchar();ft *n,*m;int flag;char d[STA],a[STA];printf("请输入要删除的相关人姓名:");scanf("%s",&a);n=search(root,a);while(n==NULL){printf("此人不存在\n");goto sd;}disp(n);printf("确定删除此人及其后代?(确定请输入[OK]):");scanf("%s",&d);if(strcmpi(d,"OK")==0){m=parent(root,n,&flag);if(flag>0)m->lchild=n->lchild;else if(flag<0)m->rchild=n->lchild;elseprintf("家谱为空或此人为头结点,无法删除!");}else{printf("操作取消!\n");}sd: printf("结束操作!\n"); }int main(){Reset();for(;;){system("pause");system("cls");Manu();int choice;scanf("%d",&choice);switch(choice){case 0:exit(0); break;case 1:Add(); break;case 2:Search();break;case 3:Change();break;case 4:Del(); break;case 5:Reset(); break;}}return 0;}五、运行示例及结果分析1.建立二叉树模型:2.操作截图:A配偶:B二代:C二代:D 三代:F三代:G二代:E并依次添加成员E,F,G。