数据结构家谱课程设计报告
数据结构课程设计之简易家谱 报告

编号:学号:201140410119课程设计教学院计算机学院课程名称数据结构课程设计题目简易家谱系统专业计算机科学与技术班级(1)班姓名陈建辉同组人员周海涛,石义沣,明廷柱指导教师程细才2013 年 1 月8 日目录一概述 (2)1.课程设计的目的 (2)2.课程设计的要求 (2)二总体方案设计 (3)1.简单家谱系统整体设计思路 (3)2.简单家谱系统的主要特点及功能 (5)三详细设计 (7)1. 查询全部的家谱成员信息 (7)2.确定指定成员在家族中的辈份 (7)3.在家谱中添加新成员,并追加到文件中 (9)四程序的调试与运行结果说明 (12)1.实验结果截图: (12)2.调试时遇到的问题 (12)五课程设计总结 (13)附录一:程序源代码 (16)附录二:参考文献 (25)一概述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,则继续进行兄弟节点的插入,以此类推,根据文件的读取,将树生成,本程序中所有的算法都基于以上所介绍的算法。
数据结构_家谱管理系统方案

宁波大红鹰学院信息工程学院课程设计报项目名称:家谱查询系统项目组长:白钰琦项目成员:徐程凯、徐海域、项鸿伟班级名称:10计科1班专业名称:计算机科学与技术完成时间:2012年12月1日信息工程学院制一、..................................... 案例描述-3 -1总体描述............................. -3 -2、模块描述........................... -4 -二、..................................... 设计思路-5 -三、..................................... 程序设计-5 -1、数据结构描述......................... -5 -2、主函数及其流程图...................... -6 -3、源程序........................... -7 -四、...................................... 调试与分析-7 -1、主菜单............................ -12 -2、显示家谱信息......................... -13 -3、显示家谱中第n代人所有信息................. -13 -4、按姓名查找某人并相应输出................... -13 -5、按出生日期查找家谱成员信息......... 错误!未定义书签。
6、为家谱中成员添加孩子信息.................. -14 -7、为家谱中成员添加妻子信息............ 错误!未定义书签。
8删除家谱中成员及其后代信息............ 错误!未定义书签。
9、修改家谱中成员信息......................................... -15 ................................................................................... -10、确定家谱中两个成员关系 ........... 错误!未定义书签。
家谱管理系统设计报告

目录第一章绪论............................................... 错误!未定义书签。
第二章需求分析........................................... 错误!未定义书签。
题目..................................................... 错误!未定义书签。
设计任务................................................. 错误!未定义书签。
数据测试................................................. 错误!未定义书签。
第三章概要设计........................................... 错误!未定义书签。
设计思想............................................. 错误!未定义书签。
实现方法............................................. 错误!未定义书签。
第四章详细设计........................................... 错误!未定义书签。
功能构想................................................. 错误!未定义书签。
界面设计................................................. 错误!未定义书签。
增加成员................................................. 错误!未定义书签。
添加子女............................................ 错误!未定义书签。
添加配偶............................................ 错误!未定义书签。
数据结构_家谱管理系统

数据结构_家谱管理系统【数据结构_家谱管理系统】一、引言家谱是记录家族成员关系的重要文献,传统的家谱管理方式已经无法满足现代社会的需求。
为了更好地管理家族信息,提高家族成员之间的联系和交流,我们设计并开发了一款家谱管理系统。
本文将详细介绍该系统的设计和实现。
二、系统概述家谱管理系统是一个基于数据结构的软件应用,旨在帮助用户管理家族成员的信息,包括姓名、性别、出生日期、配偶、子女等。
系统提供了多种功能,包括添加、删除、修改、查询、统计等操作,方便用户对家谱信息进行维护和管理。
三、系统设计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.链表的定义和基本操作,如插入、删除和查找节点等。
2.单向链表、双向链表以及循环链表的特点及适用场景。
3.在家谱管理系统中,链表可以用来存储家族成员的个人资料和家庭关系,形成一个有序的数据结构。
4.链表的优缺点分析,包括插入和删除速度快,但查找的效率低。
二、数组1.数组的定义和基本操作,包括插入、删除和查找元素等。
2.静态数组和动态数组的区别以及在家谱管理系统中的选择。
3.数组的存储方式和访问特点,以及对系统性能的影响。
4.数组的优缺点分析,包括查找速度快,但插入和删除的效率较低。
三、堆1.堆的定义和基本操作,如插入和删除堆顶元素等。
2.最大堆和最小堆的特点及适用场景。
3.在家谱管理系统中,堆可以用来维护家族成员之间的优先级关系,例如根据年龄进行排名。
4.堆的优缺点分析,包括快速找到最大(小)元素,但插入和删除的效率较低。
四、哈希表1.哈希表的定义和基本操作,如插入、删除和查找元素等。
2.哈希函数的设计原则和方法,以及冲突解决的技术。
3.在家谱管理系统中,哈希表可以用来快速查找家族成员的信息,例如根据姓名或者ID进行查找。
4.哈希表的优缺点分析,包括查找速度快,但对存储空间的利用率较低。
五、总结家谱管理系统作为一种用于管理和记录家族历史数据的工具,数据结构在其中起着重要的作用。
本文介绍了家谱管理系统中常用的数据结构,包括链表、数组、堆和哈希表,以及它们在系统中的应用。
家谱运算数据结构课程设计
家谱运算数据结构课程设计本篇文章将介绍家谱运算数据结构课程设计的相关内容。
家谱运算数据结构是一种非常有用的数据结构,它可以用来表示家族关系,并且可以进行各种基于家族关系的操作。
首先,我们需要了解家谱运算数据结构的基本概念和定义。
家谱是一个家族的树形关系。
在这个家族中,每个人都有一个父亲和一个母亲,这些人构成了家谱的节点。
因此,我们可以将家谱看做是一个树形结构,其中每个节点表示一个家族成员。
此外,我们还需要定义一些家族成员之间的关系,比如父亲和儿子、兄弟等等。
在家谱运算数据结构中,我们需要实现一些基本的操作,比如查找某个家族成员、添加新的家族成员、删除家族成员以及查询某个家族成员的亲戚关系等等。
这些基本操作可以通过使用家谱运算数据结构中的不同算法来实现。
在实现家谱运算数据结构的过程中,我们需要使用一些核心的数据结构和算法,比如树、二叉树、图、深度优先搜索、广度优先搜索等等。
这些核心数据结构和算法都是需要深入理解和掌握的。
在完成课程设计时,我们可以选择使用不同的编程语言和工具来实现家谱运算数据结构,比如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. 数据存储:可以将家族成员的信息存储在数据库中,以便实现更复杂的查询和统计功能。
数据库家谱课程设计报告
课程设计(论文)任务书软件学院学院软件+会计专业2012—班一、课程设计(论文)题目二、课程设计(论文)工作自2013 年 12 月 30 日起至 2014 年 1 月 5 日止三、课程设计(论文) 地点: 创新大楼软件实训中心机房四、课程设计(论文)内容要求:1.本课程设计的目的⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题;⑵初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。
2.课程设计的任务及要求1)基本要求:⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告;⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率;⑶程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;⑷每位同学需提交可独立运行的程序和规范的课程设计报告。
2)课程设计论文编写要求⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订;⑵课程设计报告(论文)包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、课设总结、谢辞、参考文献、附录等;⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。
3)课程设计评分标准:⑴学习态度:10分;⑵系统设计:20分;⑶编程调试:20分;⑷回答问题:20分;⑸论文撰写:30分。
4)参考文献:⑴严蔚敏,吴伟民. 数据结构(C语言版)[M]. 清华大学出版社. 2010.3⑵严蔚敏,吴伟民. 数据结构题集(C语言版)[M]. 清华大学出版社. 1999.2⑶何钦铭,冯燕等. 数据结构课程设计[M]. 浙江大学出版社. 2007.85)课程设计进度安排⑴准备阶段(4学时):选择设计题目、了解设计目的要求、查阅相关资料;⑵程序模块设计分析阶段(4学时):程序概要设计、详细设计;⑶代码编写调试阶段(8学时):程序模块代码编写、调试、测试;⑷撰写论文阶段(4学时):总结课程设计任务和设计内容,撰写课程设计论文。
数据结构家谱实验报告
数据结构家谱实验报告
以下是一个数据结构家谱实验报告的模板,可以根据实际情况进行修改和完善:
数据结构家谱实验报告
一、实验目的
本次实验的目的是设计并实现一个家谱数据结构,以展示家族成员之间的关系。
二、实验内容
1. 设计家谱的数据结构,包括节点和边的表示。
2. 实现家谱的基本操作,如添加、删除、查找节点。
3. 按家族关系遍历家谱。
4. 测试所实现的家谱数据结构。
三、实验结果
1. 成功设计了家谱的数据结构,使用邻接表表示节点和边的关系。
2. 实现了家谱的基本操作,可以添加、删除和查找节点。
3. 能够按照家族关系遍历家谱,展示家族成员之间的关系。
4. 通过编写测试用例,验证了所实现的家谱数据结构的正确性。
四、实验总结
通过本次实验,我对数据结构的应用有了更深入的理解。
在设计和实现家谱数据结构的过程中,我运用了邻接表这一数据结构来表示节点和边的关系,并且实现了家谱的基本操作。
通过按家族关系遍历家谱,我成功展示了家族成员之间的关系。
本次实验提高了我的编程能力和问题解决能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
家谱管理系统姓名:田鑫磊学号:1514020421(1)功能部分:本程序共实现了6个功能分别为:1.读出家谱并显示2.确定指定成员在家族中的辈份3.输出指定辈的所有成员4.在家谱中添加新成员,并追加到文件中5.输出指定家庭的所有成员6. 退出本系统(2)各功能的算法思想:1.读出家谱并显示存储结构用栈,按照先显示双亲,然后显示其所有孩子的顺序显示所有的家庭成员。
2.确定指定成员在家族中的辈份用求成员所在的二叉树中的层数(按层遍历二叉树)来确定,这里采用的是递归算法3.输出指定辈的所有成员此处定义了一个新的结构体类型(增加存储节点所在的层数),定义如下:struct{ BTNode *q;int loc; //存结点所在的层数}qu[10];并用一个队列来比较显示同辈分的所有成员。
4.在家谱中添加新成员,并追加到文件中首先,输入一个新成员的名字;然后,输入其双亲;之后,再添加到整个存储二叉链表中。
然后,再将新的存储结构写回到文件中。
二叉链表的结点类型为:typedef struct node{ElemType data[10]; //存放成员的名字struct node *child; //其孩子指针struct node *brother; //其兄弟指针}BTNode;5.输出指定家庭的所有成员首先,设一个栈,并设一个标记位,先置1;然后,找到输入的要待显示的成员,将标记位置0;再次,显示其孩子和兄弟,依次下去直到显示完其所有的亲戚。
6.退出本系统通过一个输入字符q来控制,每完成一个功能,系统提示是否要继续操作:当q为“Y”或者“y”时,显示菜单,程序继续执行;当 q为其他字符时,程序执行结束,退出本系统。
三、详细设计:通过一个do-while语句来控制各个模块的选择和实现。
1.读出家谱并显示void display(BTNode *b){BTNode *q[10]; //定义一个栈int front,rear;int k;BTNode *p;p=b;k=0;front=-1;rear=0;q[rear]=p; //头结点先入栈while(front<rear){ front++;p=q[front];printf("%s",p->data ); //头结点出栈,并显示printf("(");disbr(p->child);printf(")\n");if(p->child!=NULL) //显示其孩子{rear++;q[rear]=p->child;}if(p->brother!=NULL) //显示其兄弟{rear++;q[rear]=p->brother;}}}2.确定指定成员在家族中的辈分int generation(BTNode *b,int h,ElemType x[]) //用递归的思想{ int i;if(b==NULL)return(0);i=strcmp(b->data,x); //比较是否相等if(i==0)return(h);int L=generation(b->child,h+1,x);if(L==0)L=generation(b->brother,h,x);return(L);}3.输出指定辈的所有成员void layer(BTNode *t,int m){ struct //定义一个新的结点类型,在孩子兄弟存储结构的基础上添加一个数据域存其所在层数{B TNode *q;int loc;}qu[10];int front,rear;BTNode *p;p=t;k=0;front=-1;rear=0;qu[rear].q=p;qu[rear].loc=1;if( qu[rear].loc==m) //找到m辈的即输出printf("%c",p->data);while(front<rear) //通过站查找所有m辈的结点并输出{ front++;p=qu[front].q;if(p->child!=NULL){rear++;qu[rear].q=p->child;qu[rear].loc=qu[front].loc+1;if(m== qu[rear].loc)printf("%s ",p->child->data);}if(p->brother!=NULL){rear++;qu[rear].q=p->brother;qu[rear].loc=qu[front].loc;if( qu[rear].loc==m)printf("%s ",p->brother->data);}}}4.在家谱中添加新成员,并追加到文件中void add(BTNode *&b,ElemType y[],ElemType x[]){char filename[20]=" ";FILE *fp;BTNode *p,*q;int i;p=FindNode(b,y);q=(BTNode *)malloc(sizeof(BTNode));for(i=0;x[i]!='\0';i++)q->data[i]=x[i];q->data[i]='\0';q->child=q->brother=NULL;if(p->child ==NULL)p->child=q;else{ p=p->child;while(p->brother!=NULL)p=p->brother ;p->brother=q;}display(b);printf("向文件中读入新家谱\n");printf("\n input a filename:");scanf("%s",&filename);if((fp=fopen(filename,"w"))==NULL){puts("\n can't open the file.");exit(0);} elseDispBTNode(b,fp);fclose (fp);}void DispBTNode(BTNode *b,FILE *fp){char a[10];int i=0;if(b!=NULL){while(b->data[i]!='\0'){a[i]=b->data[i];i++;}a[i]='\0';fputs(a,fp); //写入文件if(b->child!=NULL || b->brother!=NULL){fputs(s,fp);DispBTNode(b->child,fp); //递归写入其孩子if (b->brother!=NULL){fputs(p,fp);DispBTNode(b->brother,fp); //递归写入其兄弟}fputs(t,fp);}}}5.输出指定家庭的所有成员void dispfamily(BTNode *b,ElemType x[]){ BTNode *p;BTNode *q[MaxSize];int top=-1,tap=1;if(b!=NULL){top++;q[top]=b;while(top>-1){p=q[top];top--;if(strcmp(p->data,x)==0) //查找此人{top=-1;tap=0;}if(p->child!=NULL){top++;q[top]=p->child;if(tap==0){display(p->child); //显示其孩子return ;}}if(p->brother!=NULL){top++;q[top]=p->brother;if(tap==0){display(p->brother); //显示其兄弟return ;}}}}}6.退出本系统此处通过一个输入字符q来控制,当q为“Y”或者“y”时,显示菜单,程序继续执行,当 q为其他字符时,程序执行结束,退出本系统。
此时q=‘N’。
四:调试分析1.首先,将已有家谱存储文件写在一个txt文档里,内容为:输出结果为:2.调试时遇到的问题:(1)当选择功能3(添加新成员),添加完成员后,写回文件时出现了错误,原本添加的为其中一个结点的孩子,结果写回文件时却成了该结点的孙子,也就是本是要添加为此结点的孩子的兄弟,结果却成了其孩子的孩子。
最后经过单步跟踪发现写入文件的函数编写错误,缺少判断条件,经过修改后,此问题得到了解决。
(2)当选择功能0(显示此家谱),没有按照事先存储在txt中的文件显示,通过认真检查程序中显示成员的函数(按层遍历)、不断调试,发现并不是该显示函数的错误,因为在功能4(输出指定家庭的所有成员)中,也是通过调用该函数实现输出功能,于是,检查txt文件中事先存储的家谱成员,发现是由于“(”与“)”没有匹配好,导致没有按照预期想法创建二叉树造成的错误,通过修改txt文件,使得错误得以解决。
五、课程设计总结通过本次课程设计,我觉得自己最大的收获就是:由于对二叉链表的存储比较感兴趣,我选做的是家谱,开始觉得无从下手,但是经过仔细分析后,渐渐找到一点思路(首先创建,然后分别实现各个功能,最后利用菜单实现选择功能并输出结果)。
本次编写家谱程序的过程中,我体验到了编程的酸甜苦辣:开始,由于即将运用所学知识设计实际问题而激动兴奋;后来编写程序过程中,在想不出算法如何实现或者追求空间、时间上高效率的算法时会比较纠结;以及遇到BUG时,追踪数据的痛苦;当然,还有解决问题后的激动与自豪。
所有这些都增强了我对编程的热爱、提高了我对计算机专业的兴趣。