数据结构课程设计(家族关系查询系统)要点
- 格式:doc
- 大小:165.50 KB
- 文档页数:29
家族关系查询系统数据结构课程设计
家族关系查询系统的数据结构可以通过使用图来表示家族成员之间的关系。
以下是一个可能的数据结构设计:
1. 节点:每个节点表示一个家庭成员,包含以下信息:
- 姓名
- 性别
- 出生日期
- 死亡日期(可选)
- 配偶节点指针(如果有)
- 父母节点指针
- 子女节点指针列表
2. 图的表示:使用邻接表或邻接矩阵来表示家族成员之间的关系。
3. 数据结构的操作:
- 添加家庭成员节点
- 删除家庭成员节点
- 添加婚姻关系
- 删除婚姻关系
- 添加父子关系
- 删除父子关系
- 查询某个人的配偶、父母、子女信息
- 查询某个人的兄弟姐妹信息
- 查询某个人的祖先、后代信息
- 查询某个人的近亲结构
- 查询某个人的家族全貌
4. 数据结构的实现:
- 可以使用面向对象的方式,将节点定义为一个类,使用指针/引用来连接不同的家庭成员。
- 使用图的数据结构来表示家族关系。
可以使用邻接表,每个节点对应一个家庭成员,每个节点的边表示亲属关系。
注意,上述只是一个概念性的设计,具体的实现可能需要根据具体的需求进行调整和扩展。
数据结构课程设计家族关系课程名称: 《数据结构》课程设计课程设计题目: 家族关系查询系统姓名: 周楠院系: 计算机学院专业: 软件工程年级: 2011学号: E01114323指导教师: 王爱平2013 年 9月25日目录1 课程设计的目的…………………………2 需求分析…………………………………3 课程设计报告内容………………………3.1概要设计…………………………………3.2详细设计…………………………………3.3调试分析…………………………………3.4用户手册………………………………3.5测试结果…………………………………3.6程序清单………………………………4 小结………………………………………5 参考文献…………………………………1.课程设计的目的(1) 熟练使用 C 语言编写程序,解决实际问题;(2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;2.需求分析随着社会发展,人们使用纸质的家谱已经非常不方便而且不利于在家谱里进行添加和修改。
而用算法设计一个家族关系查询系统则可以解决这个问题。
数据结构的二叉树刚好满足家谱的基本结构。
首先建立一个文件作为家谱,然后在文件中输入字符串,实现了在文件中按照数据的逻辑关系进进输入便可建立相应的三叉链表。
然后就是进行数据的存储、删除及查找工作。
3.算法分析本次设计研究的是建立家族关系,实现对家族成员关系相关查询的问题。
在设计中使用的数据结构为树状结构,树状结构采用三叉链表实现。
我们在建立好家族关系后将其存储在文件中,在文件中家族关系是以树的形式存储,运用树的操作使家族关系得以准确建立。
家族关系查询系统可分为六大模块,分别是创建、修改、查询、保存、退出等。
建立家族关系模块,建立家族关系并存入文件。
数据结构_家谱管理系统【数据结构_家谱管理系统】一、引言家谱是记录家族成员关系的重要文献,传统的家谱管理方式已经无法满足现代社会的需求。
为了更好地管理家族信息,提高家族成员之间的联系和交流,我们设计并开发了一款家谱管理系统。
本文将详细介绍该系统的设计和实现。
二、系统概述家谱管理系统是一个基于数据结构的软件应用,旨在帮助用户管理家族成员的信息,包括姓名、性别、出生日期、配偶、子女等。
系统提供了多种功能,包括添加、删除、修改、查询、统计等操作,方便用户对家谱信息进行维护和管理。
三、系统设计1. 数据结构选择在家谱管理系统中,我们选择了树这种数据结构来表示家族关系。
每个节点代表一个家庭成员,节点之间通过指针连接,形成家族的层级结构。
2. 数据模型设计家族成员的信息可以通过一个结构体来表示,包括姓名、性别、出生日期等字段。
每个节点除了包含成员信息外,还包含指向配偶的指针和指向子女的指针。
3. 系统功能设计家谱管理系统提供了以下功能:(1) 添加成员:用户可以输入成员信息,系统根据用户输入创建一个新的节点,并将其插入到适当的位置。
(2) 删除成员:用户可以指定要删除的成员,系统会删除该成员及其所有子孙节点。
(3) 修改成员信息:用户可以选择要修改的成员,然后输入新的信息进行更新。
(4) 查询成员信息:用户可以通过姓名、出生日期等条件查询成员信息。
(5) 统计家族人数:系统可以统计家族的总人数、男性人数、女性人数等信息。
四、系统实现1. 数据结构实现我们使用C语言来实现家谱管理系统。
通过定义一个节点结构体,使用指针来连接各个节点,实现家族关系的表示和管理。
2. 功能实现(1) 添加成员:根据用户输入的信息,创建一个新节点,并将其插入到适当的位置。
插入操作需要遍历树来找到合适的位置。
(2) 删除成员:根据用户指定的成员,删除该节点及其所有子孙节点。
删除操作需要递归地遍历树。
(3) 修改成员信息:根据用户选择的成员,更新其信息。
课程设计名称:数据结构系:学生姓名:班级:学号:成绩:指导教师:开课时间:学年学期一.设计题目家谱的设计与实现(树,查找)二.主要内容家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。
可。
基本功能如下:(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)。
沈阳工程学院课程设计任务书课程设计题目:--家族关系查询系统--停车场管理系统系别:信息工程系班级:软本1 0 1 姓名:王超修国山孙天龙学号:16 28 38指导老师:吕海华、姜柳职称:副教授、讲师课程设计进行地点:实训F - 6 0 8任务下达时间:2011年12月7日起止日期:2011年12月12日起——至2011年12月23日止教研室主任: 张欣2011年12月05日批准一、课程设计的原始资料及依据1.1家族关系管理系统随着新世纪的到来全国各地的宗族在大陆的分布较分散,近年来为了研究宗族现在的状况对宗族的情况进行了相关项的调查。
其中以具体的家族关系调查为起始。
本次课设就是做实现家族查询的系统。
主要根据数据结构的原理应用树的制作进行家族查询。
完成编写之后将运行出来的程序分行显示,本程序处理起来相对复杂一些但却涉及到很多方面的知识,需要使用到的数据结构有树状结构和队列。
查阅有关程序设计的案例资料,进一步理解程序设计模块化的思想,并利用此思想,根据对程序设计学习编写一个家族关系查询系统。
通过本设计可以加深理解利用程序设计思想开发一个查询系统的整个流程,提高分析问题、解决问题和实际动手的能力。
1.2停车场管理系统随着科技的进步和人类文明的发展,智能停车场管理系统在住宅小区,大厦,机关单位的应用越来越普遍。
而人们对停车场管理的要求也越来越高,智能化程度也越来越高,使用更加方便快捷,也为人们的生活带来了方便和快乐不仅提高了现代人的工作效率,也大大的节约了人力物力,降低了公司的运营成本,并使得整个管理系统安全可靠。
包括车辆出入信息管理,收费管理等等。
查阅有关程序设计的案例资料,进一步理解程序设计模块化的思想,并利用此思想,根据对程序设计学习编写一个停车场管理系统。
通过本设计可以加深理解利用程序设计思想开发一个系统的整个流程,提高分析问题、解决问题和实际动手的能力。
二、课程设计主要内容及要求2.1停车场管理系统以栈模拟停车场,以队列模拟停车场外的便道,按照从终端读入的输入数据的方式进行模拟管理。
家谱运算数据结构课程设计本篇文章将介绍家谱运算数据结构课程设计的相关内容。
家谱运算数据结构是一种非常有用的数据结构,它可以用来表示家族关系,并且可以进行各种基于家族关系的操作。
首先,我们需要了解家谱运算数据结构的基本概念和定义。
家谱是一个家族的树形关系。
在这个家族中,每个人都有一个父亲和一个母亲,这些人构成了家谱的节点。
因此,我们可以将家谱看做是一个树形结构,其中每个节点表示一个家族成员。
此外,我们还需要定义一些家族成员之间的关系,比如父亲和儿子、兄弟等等。
在家谱运算数据结构中,我们需要实现一些基本的操作,比如查找某个家族成员、添加新的家族成员、删除家族成员以及查询某个家族成员的亲戚关系等等。
这些基本操作可以通过使用家谱运算数据结构中的不同算法来实现。
在实现家谱运算数据结构的过程中,我们需要使用一些核心的数据结构和算法,比如树、二叉树、图、深度优先搜索、广度优先搜索等等。
这些核心数据结构和算法都是需要深入理解和掌握的。
在完成课程设计时,我们可以选择使用不同的编程语言和工具来实现家谱运算数据结构,比如C++、Java、Python等等。
此外,我们还可以使用一些数据可视化工具来展示家谱结构,使其更加直观和易懂。
最后,我们需要深刻认识到家谱运算数据结构的实际应用价值。
家谱运算数据结构不仅可以用于记录家族关系,还可以应用于许多其他领域,比如社交网络、信息检索、知识图谱等等。
因此,深入理解和掌握家谱运算数据结构对我们今后的学术和职业发展都具有非常重要的意义。
数据结构_家谱管理系统家谱是记录一个家族的血缘关系和历史的重要文化遗产。
传统的家谱管理方式通常是以纸质形式存在,随着科技的发展,数字化的家谱管理系统逐渐兴起。
本篇文章将介绍一个基于数据结构的家谱管理系统的设计与实现。
一、需求分析家谱管理系统的主要功能包括: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.树的应用:1.1家族族谱的表示:家族族谱可以被看作是一棵树,其中每个节点表示一个家族成员,边表示家族成员之间的关系,如父子关系、兄弟关系等。
树的遍历算法可以用来查询家族成员的相关信息,比如查找某个成员的父亲、孩子、兄弟等。
1.2家族成员的添加和删除:通过树的插入和删除操作,可以方便地对家族成员进行增删操作。
例如,可以通过插入操作添加新的家族成员,通过删除操作删除家族成员。
1.3家族成员关系的查询:通过树的搜索算法,可以快速找到家族成员之间的关系。
例如,可以通过深度优先搜索算法找到某个成员的祖先、后代等。
2.图的应用:2.1家族成员的关系复杂性:家族成员之间的关系往往是复杂的,不仅涉及到父子关系,还可能涉及到配偶关系、外戚关系等。
图可以更好地表示这种复杂的关系。
2.2家族成员关系的可视化:通过图的可视化技术,可以直观地展示家族成员之间的关系,帮助用户更好地了解和使用家谱管理系统。
例如,可以用不同颜色和形状的节点表示不同的家族成员,用边表示他们之间的关系。
2.3关系网络的分析:通过图的分析算法,可以进一步研究和分析家族成员之间的关系。
例如,可以计算家族成员的亲密度、距离等,为家族成员提供更多的服务和帮助。
3.链表的应用:3.1成员信息的存储:家族成员的相关信息可以通过链表来存储,每个节点表示一个家族成员,节点中包含该成员的姓名、性别、出生日期等信息。
通过链表的插入和删除操作,可以方便地对成员信息进行增删操作。
3.2成员关系的维护:通过链表中的指针关系,可以方便地维护家族成员之间的关系。
家族树数据结构课程设计一、课程目标知识目标:1. 学生能够理解家族树数据结构的基本概念和原理,掌握其组成和功能。
2. 学生能够运用家族树数据结构表示和分析家族关系,掌握相关术语和表示方法。
3. 学生能够掌握家族树数据结构在解决实际问题中的应用,如查找、插入和删除家族成员。
技能目标:1. 学生能够运用图表、树状图等工具绘制家族树,并能清晰展示家族关系。
2. 学生能够运用算法实现家族树数据结构的查找、插入和删除操作。
3. 学生能够运用家族树数据结构解决实际问题,提高问题分析能力和逻辑思维能力。
情感态度价值观目标:1. 学生培养对数据结构和算法的兴趣,认识到其在实际生活中的重要性。
2. 学生培养团队协作意识,学会与同学共同探讨和解决问题。
3. 学生通过家族树的学习,体会家庭和谐、亲情可贵,增强家庭责任感。
课程性质:本课程为计算机科学与技术学科的数据结构与算法部分,以家族树为载体,让学生在实际问题中学习数据结构的基本原理和应用。
学生特点:学生处于初中年级,对数据结构有一定的基础知识,具备一定的逻辑思维能力和问题解决能力。
教学要求:教师应注重启发式教学,引导学生主动探索和发现,将理论知识与实际应用紧密结合,提高学生的动手实践能力。
通过课程学习,使学生达到本章节所设定的知识、技能和情感态度价值观目标。
后续教学设计和评估将围绕这些具体学习成果展开。
二、教学内容1. 家族树基本概念:介绍家族树的定义、组成和功能,通过示例使学生理解家族树在表示家族关系中的应用。
教材章节:第一章 数据结构概述,第三节 树状结构。
2. 家族树表示方法:讲解树状图的绘制方法,包括节点、边和层次等概念,引导学生掌握家族树的表示技巧。
教材章节:第二章 树,第一节 树的表示方法。
3. 家族树操作:教授家族树数据结构的查找、插入和删除操作,让学生掌握相关算法。
教材章节:第二章 树,第二节 树的遍历与查找;第三节 树的修改操作。
4. 家族树应用案例:分析家族树在实际问题中的应用,如家族关系查询、家谱管理等,提高学生的问题解决能力。
课 程 设 计目 录编 号:学 号:201140410119教 学 院 计算机学院 课程名称数据结构课程设计 题 目 简易家谱系统 专 业计算机科学与技术班 级 (1)班 姓 名 陈建辉同组人员 周海涛,石义沣,明廷柱指导教师程细才2013 年 1 月 8 日一概述 (2)1.课程设计的目的 (2)2。
课程设计的要求 (2)二总体方案设计 (3)1.简单家谱系统整体设计思路 (3)2.简单家谱系统的主要特点及功能 (4)三详细设计 (6)1。
查询全部的家谱成员信息 (6)2.确定指定成员在家族中的辈份 (7)3.在家谱中添加新成员,并追加到文件中 (9)四程序的调试与运行结果说明 (12)1.实验结果截图: (12)2.调试时遇到的问题 (12)五课程设计总结 (13)附录一:程序源代码 (16)附录二:参考文献 (26)一概述1.课程设计的目的1.理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2.培养综合运用所学知识独立完成课题的能力。
3.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质.4.掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
2.课程设计的要求设计要求:输入家族成员情况,建立树结构,统计家族成员人数,能查询家族成员辈份情况.系统功能:1。
输入、修改与删除家谱信息功能2. 查询功能:1)某家谱成员的所有子孙的集合2)某家谱成员的所有祖先的集合3)某家谱成员的所有同辈成员的集合4)求某家谱成员的所有上一辈成员的集合5)给出两个家谱成员,确定他们的关系二总体方案设计1.简单家谱系统整体设计思路此次课程设计的整体思路是采用遍历算法,整个树的定义使用两个结构体来表示,一个结构体专门用于存放每一个节点的信息,另一个节点中定义了三个指针域,分别为父指针域(兄长指针域),兄弟指针域,子指针域,整个树的输入采用文件导入的方式,首先将文件导入到树中,文件包含每一个家族成员的信息,以及一个标志位flag,标志位的值为0,1,2,0表示此节点没有兄弟节点,1表示此节点至少有一个子节点,2表示此节点至少有一个兄弟节点,使用的算法是先定义一个链式队列,将文件中第一个节点的内容读取放入开辟的树的节点的空间里,然后将树节点放入队列中,此时队列不为空,以队列不为空为判断条件,进行while循环,判断flag的值,循环体中再进行文件读取,循环中进行判断,若flag为0,则继续判断队列是否为空,为空就结束循环,若不为空,则继续出队列,取标志位进行判断,若标志位为1,则生成新节点,用刚刚出列的节点的子指针域进行指向新节点,新节点的父指针域指向出列的节点,剩余的域为空,然后将新生成的节点插入到队列中,若flag为1,则进行兄弟节点的插入,继续循环,若flag不为0,则在进行判断,若为2,则继续进行兄弟节点的插入,以此类推,根据文件的读取,将树生成,本程序中所有的算法都基于以上所介绍的算法。
1 课程设计介绍1.1课程设计项目简介家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书载体。
家谱是中国特有的文化遗产,是中华民族的三大文献之一,属珍贵的人文资料,对于历史学,民俗学,人口学,社会学和经济学的深入研究,均有不可替代的重要功能。
本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息、插入家族成员等功能。
1.2课设题目分析本程序的实质是完成对家谱成员信息的建立、查找、插入等功能。
可以首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
本程序包含以下几个模块(1)建立家族关系树。
此模块将构建一个家族关系,对数据初始化,构造关系树并录入数据一遍后续程序使用。
(2)添加新成员。
此模块将添加一个新成员,实现对家族关系的修改。
(3)家族关系的查询。
此模块将实现对家族不同关系的查询(4)主程序模块。
此模块实现整个程序的进入和进出,以及各种初始化处理。
(5)1.3课程题目原理与数据结构因为家族的成员之间存在一个对多个的层次结构关系,所以不能用线性表来表示和实现。
家谱从形状上看像一颗倒长的树,所以用树结构来表示比较合适。
树形结构是一类非常重要的非线性数据结构,直观看来树是以分支关系定义的层次结构。
因此本课程设计可以采用的数据结构有树状结构和队列。
树状结构采用三叉链表来实现,队列采用链式队列实现。
1.4功能分析说明图2 分析与实现2.1 基本数据结构和栈队的操作2.1.1 结点基本数据结构和链队的定义/*家族关系树实现*/#include<string.h>#include<malloc.h>#include<limits.h>#include<stdio.h>#include<stdlib.h>#include<io.h>#include<math.h>#include<process.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR -1#define INFEASIBLE -1typedef char DataType;#define MAXNUM 20typedef struct TriTNode/* 树的三叉链表存储结构*/ {DataType data[MAXNUM];struct TriTNode *parent;/* 双亲*/struct TriTNode *lchild;/* 左孩子*/struct TriTNode *rchild;/* 右孩子*/}TriTree;typedef struct Node/* 队列的结点结构*/{TriTree *info;struct Node *next;}Node;typedef struct/* 链接队列类型定义*/{struct Node *front; /* 头指针*/struct Node *rear; /* 尾指针*/}LinkQueue;DataType fname[MAXNUM],family[50][MAXNUM];/* 全局变量*/2.1.2 链队的基本操作LinkQueue *LQueueCreateEmpty( )/* 建立一个空队列*/{LinkQueue *plqu=(LinkQueue *)malloc(sizeof(LinkQueue));if (plqu!=NULL)plqu->front=plqu->rear=NULL;else{printf("内存不足!\n");return NULL;}return plqu;}int LQueueIsEmpty(LinkQueue *plqu)/* 判断链接表示队列是否为空队列*/{return(plqu->front==NULL);}void LQueueEnQueue(LinkQueue *plqu,TriTree *x)/* 进队列*/ {Node *p=(Node *)malloc(sizeof(Node));if(p==NULL)printf("内存分配失败!\n");else{p->info=x;p->next=NULL;if(plqu->front==NULL)/* 原来为空队*/plqu->front=p;elseplqu->rear->next=p;plqu->rear=p;}}int LQueueDeQueue(LinkQueue *plqu,TriTree *x)/* 出队列*/ {Node *p;if(plqu->front==NULL){printf("队列空!\n");return ERROR;}else{p=plqu->front;x=p->info;plqu->front=plqu->front->next;free(p);return OK;}}TriTree *LQueueGetFront(LinkQueue *plqu)/* 在非空队列中求队头元素*/{return(plqu->front->info);}2.2建立家族关系2.2.1建立家族关系并存入文件基本思想:首先输入家族关系的名称,以此名称为文件名,建立文本文件接下来按层次输入结点信息,输入一个在文件中写入一行同时将输入的信息保存到二位字符数组family中。
字符数组family是全局变量,存储临时信息 . 注意,输入时每个结点信息占一行,一个结点有多个兄弟,以“@”作为兄弟结束标志,结点若无孩子,直接以“@”代替。
依次输入各节点信息,以“#”作为结束标志。
最后使用函数CreateTriTree建立家族关系树.TriTree *Create(DataType familyname[MAXNUM])/* 建立家族关系并存入文件*/{int i=0; /* i控制family数组下标*/DataType ch,str[MAXNUM]; /* ch存储输入的y或n,str存储输入的字符串*/TriTree *t;FILE *fp;strcpy(fname,familyname); /* 以家族名为文本文件名存储*/ strcat(fname,".txt");fp=fopen(fname,"r"); /* 以读取方式打开文件*/if(fp) /* 文件已存在*/{fclose(fp);printf("%s 的家族关系已存在!重新建立请按“Y”,直接打开请按“N”\n",familyname);ch=getchar();getchar(); /* 接收回车*/if(ch=='N'||ch=='n'){t=Open(familyname);/* 直接打开*/return t;}}if(!fp||ch=='Y'||ch=='y') /* 重新建立,执行以下操作*/{fp=fopen(fname,"w"); /* 以写入方式打开文件,不存在则新建*/printf("请按层次输入结点,每个结点信息占一行\n");printf("兄弟输入结束以“@”为标志,结束标志为“#”\n. ");gets(str);fputs(str,fp);fputc('\n',fp);strcpy(family[i],str); /* 将成员信息存储到字符数组中*/i++; /* family数组下标后移*/while(str[0]!='#'){printf(". "); /* 以点提示符提示继续输入*/gets(str);fputs(str,fp); /* 写到文件中,每个信息占一行*/fputc('\n',fp);strcpy(family[i],str);/* 将成员信息存储到字符数组中*/i++; /* family数组下标后移*/ }fclose(fp); /* 关闭文件*/t=TriTreeCreate(); /* 根据family数组信息创建三叉树*/printf("家族关系已成功建立!\n");return t; /* 返回树*/}}2.2.2建立家族关系树基本思想:采用指针数组作为指针,保存输入的结点地址。
队列的尾指针指向当前结点。
头指针指向当前结点的双亲结点。
输入的结点信息已存储在字符数组family中。
将信息复制到字符串数组“ch”中,如果"ch"不是“@”,则建立一个新结点。
若新结点是第一个结点,则它是根结点,将其入队,指针tree指向这个根节点;如果不是根结点,则将当前结点链接到双亲结点上,即当前结点的双亲指针就是队头元素,然后将当前结点入队列。
接着判断flag的值,如果flag=0,表示当前结点没有左孩子,那么当前结点就是双亲的左孩子。
否则,当前结点就是双亲的右孩子。
用指针root指向刚刚入队的结点。
继续复制数组family的下个元素。
如果“ch”是@。
则flag=0(因为“@”后面的第一个孩子为左孩子),同时判断“@”是否是第一次出现,如果是第一次,则令标志star=1;如果不是第一次出现。
则出队列,root指向队头元素(实际上root总是指向双亲结点)。
继续复制family的下一个元素。
知道遇到“#”结束。
函数返回指针tree。
/* 建立家族关系树*/TriTree *TriTreeCreate(){TriTree *t,*x=NULL,*tree,*root=NULL;LinkQueue *q=LQueueCreateEmpty();/* 建立一个空的队列,存储指向树的指针*/int i=0,flag=0,start=0;DataType str[MAXNUM]; /* 存放family数组中信息*/ strcpy(str,family[i]); /* 复制*/i++; /* family数组下标后移*/ while(str[0]!='#') /* 没遇到结束标志继续循环*/ {while(str[0]!='@') /* 没遇到兄弟输入结束标志继续*/{if(root==NULL) /* 空树*/{root=(TriTree *)malloc(sizeof(TriTree));/* 申请空间*/strcpy(root->data,str);root->parent=NULL;root->lchild=NULL;root->rchild=NULL;LQueueEnQueue(q,root);/* 将root存入队列*/tree=root;}else/* 不为空树*/{t=(TriTree *)malloc(sizeof(TriTree)); /* 申请空间*/strcpy(t->data,str);t->lchild=NULL;t->rchild=NULL;t->parent=LQueueGetFront(q); /* 当前结点的双亲为队头元素*/LQueueEnQueue(q,t); /* 入队*/if(!flag) /* flag为,当前结点没有左孩子*/root->lchild=t;else/* flag为,当前结点已有左孩子*/root->rchild=t;root=t; /* root指向新的结点t */ }flag=1; /* 标记当前结点已有左孩子*/strcpy(str,family[i]);i++;}if(start!=0) /* 标记不是第一次出现“@”*/{LQueueDeQueue(q,x); /* 出队*/if(q->front!=NULL)root=LQueueGetFront(q);/* root为队头元素*/ }start=1; /* 标记已出现过“@”*/flag=0; /* “@”后面的结点一定为左孩子*/strcpy(str,family[i]);i++;}return tree; /* 返回树*/}2.3打开一个家族关系首先输入家族关系名,以家族名为文件名打开文件,如果家族关系不存在,返回空;如果存在,文件打开,读取文件。