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

合集下载

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

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

编号:学号: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 课程设计介绍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中。

数据结构课程设计--二叉树生成家谱

数据结构课程设计--二叉树生成家谱

数学与计算机学院课程设计说明书课程名称: 数据结构与算法课程设计课程代码: 6014389 题目: 二叉树生成家谱年级/专业/班: 2011级/软件工程/2班学生姓名: 陈凯雄学号: 312011********* 开始时间: 2012 年 12 月 09 日完成时间: 2012 年 12 月 29 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5)说明书(计算书、图纸、分析报告)撰写质量(45)总分(100)指导教师签名:年月日目录(小三黑体,居中)1 需求分析 (6)1.1任务与分析 (6)1.2测试数据 (6)2 概要设计 (7)2.1 ADT描述 (7)2.2程序模块结构 (8)2.3 各功能模块 (9)3 详细设计 (10)3.1结构体定义 (10)3.2 初始化 (11)3.3 插入操作 (13)3.4 查询操作 (15)4 调试分析 (18)5 用户使用说明 (18)6 测试结果 (18)结论 (23)附录 (24)参考文献 (25)随着计算机科学技术、计算机产业的迅速发展,计算机的应用普及也在以惊人的速度发展,计算机应用已经深入到人类社会的各个领域。

计算机的应用早已不限于科学计算,而更多地应用在信息处理方面。

计算机可以存储的数据对象不再是纯粹的数值,而扩展到了字符、声音、图像、表格等各种各样的信息。

对于信息的处理也不再是单纯的计算,而是一些如信息存储、信息检索等非数值的计算。

那么,现实世界的各种数据信息怎样才能够存储到计算机的内存之中,对存入计算机的数据信息怎样进行科学处理,这涉及计算机科学的信息表示和算法设计问题。

为解决现实世界中某个复杂问题,总是希望设计一个高效适用的程序。

这就需要解决怎样合理地组织数据、建立合适的数据结构,怎样设计适用的算法,以提高程序执行的时间效率和空间效率。

“数据结构”就是在此背景下逐步形成、发展起来的。

在各种高级语言程序设计的基本训练中,解决某一实际问题的步骤一般是:分析实际问题;确定数学模型;编写程序;反复调试程序直至得到正确结果。

数据结构课程设计报告

数据结构课程设计报告

武汉工商学院课程设计报告课程名称:数据结构课程设计设计题目:家谱信息管理系统专业:计算机科学与技术班级:17计科本2班姓名:郑权学号:17403048 指导老师:朱涵完成时间:2018/10/1课程设计任务书课程名称:数据结构课程设计设计题目:家谱信息管理系统专业:计算机科学与技术班级:17计科本2班课程设计成绩评价表指导教师:年月日目录1.引言 (1)2.系统需求分析 (1)2.1 程序的功能 (1)2.2 系统界面 (1)2.3 数据初始化 (1)2.4 系统的功能模块图 (3)3. 数据结构设计及用法说明 (4)3.1分析系统设计数据结构 (4)3.2设计数据的存储方式 (4)4. 详细设计与代码描述 (5)4.1功能模块说明和算法实现 (5)1程序主入口初始运行 (5)2程序主界面主菜单 (5)(3)等待用户输入界面功能选择及执行 (6)4.2功能执行算法实现 (6)(1)树的添加 (7)(2)树的层次遍历 (9)5.系统运行及测试 (11)5.1 初始录入数据 (11)5.2 运行及截图 (11)1添加成员运行及截图 (11)2查找某人的所有孩子运行及截图 (12)(3)查找某人的双亲运行及截图 (13)(4)查找某人的所有祖先运行及截图 (13)(5)查找某人的所有兄弟运行及截图 (14)6.体会与总结 (15)6.1系统的优点 (15)6.2系统的缺点 (15)参考文献 (16)附录(源程序清单) (17)1抽象出类 (17)1.1 Person类 (17)1.2 Object类 (19)2 链表的实现 (20)3 有关树的算法的封装类 (26)4 界面类 (29)4.1 界面类头文件用来定义方法 (29)4.2 界面类实现文件 (30)5 预编译头文件pch.h (37)6 主函数 (37)1.引言家谱是现代人们怀旧的重要部分,因此,家谱管理系统会很快进入人们的生活。

本文系统采用C++语言开发家谱信息管理系统,运用树形结构存储信息,使工作人员的工作效率得以提高,减轻以往繁杂的工作量,将其从传统的家谱管理方式中彻底解脱出来,并克服了传统方式中记载家族信息的媒介的不足。

数据结构课程设计报告

数据结构课程设计报告

1.问题阐述:广州作为广东的省会,是经济政治文化中心,相对来说,外来流动人员多,对公安机关的管理造成成了一定程度上的困难,而传统的家谱通常是纸质的,查询更新比较麻烦,因此,由纸质家谱向电子转化,把家谱电子化,对管理有很大的帮助,不能仅降低成本,而且可以提高效率。

本家谱管理系统用于记录某家族历代家族成员的情况与关系。

实现一个计算机软件,可以实现以下功能:1.1支持对家谱的建立与删除,建立一个新的家谱或者从磁盘里建立一个新的家谱。

1.2支持对家谱的存储,可以永久保存在磁盘里。

1.3.支持对家谱进行修改更新,可以添加新成员,删除成员,修改成员的信息。

1.4支持对家谱的树形打印,可以形象地了解整个家族的情况,以及对每个成员详细情况的打印。

1.5支持根据不同的信息对家谱进行查询,包括姓名,出生地,出生日期,死生日期,性别,身高,受教育程度,职位,最高职位,亲威关系来查找。

1.6 支持对家谱的统计,可以清楚的了解这个家族的情况。

1. 8 在控制台下,支持鼠标的操作,让操作更加便利。

2.设计方法阐述2.1 程序设计时数据类型的实现。

每个家庭成员都有自己独特的特征,必须对成员的数据用一个集合来保存。

这程序中,定义了Info 数据类型,具体数据成员如下:struct Info{char name [max_char_num];//名字char sex [max_char_num];//性别Date birthdate;//出生日期char birthplace[max_char_num];//出生地点bool death;//是否健在bool marriage;//是否结婚Date deathdate;//死亡日期int height;//身高char ID [max_char_num];//身份证号char occupation [max_char_num];//职位char education [max_char_num];//受教育程度char top_headship [max_char_num];.//最高职位char parentname [max_char_num];//父亲名字char wifename[max_char_num];//母亲的名字int depth;//二叉树的深度,为输出二叉树做准备int y ;//输出时此节点的y坐标};而且还定义了Date类型作为日期的结构,如下:struct Date{int year;int month;int day;};2.2 程序设计过程时数据结构以及存结构的实现本程序采用了树的结构,但是却有自己的独到之处,每个节点的定义如下:typedef struct CSNode{Info data;CSNode * firstchild,*nextsibling,*parent;}*person;里面有成员的信息有数据data,还有三个指针,分别指向第一个儿子节点,下一个兄弟节点节,以及父亲节点。

家谱管理系统 -数据结构大作业

家谱管理系统 -数据结构大作业

家谱管理系统 -数据结构大作业家谱管理系统数据结构大作业在当今数字化的时代,信息管理系统在各个领域都发挥着重要作用。

家谱作为家族历史和传承的重要记录,也需要一个高效、便捷的管理系统来保存、整理和查询相关信息。

本次数据结构大作业,我将深入探讨家谱管理系统的设计与实现。

一、需求分析家谱管理系统的主要用户包括家族成员和对家族历史感兴趣的研究者。

系统需要满足以下基本需求:1、能够存储家族成员的详细信息,如姓名、出生日期、逝世日期、籍贯、职业等。

2、支持家族关系的建立和维护,如父子、母子、夫妻等关系。

3、提供便捷的查询功能,用户可以根据姓名、出生日期、关系等条件快速找到所需的家族成员信息。

4、支持家谱的可视化展示,以清晰呈现家族成员之间的关系结构。

5、具备数据的添加、删除和修改功能,以保证家谱信息的及时更新。

二、数据结构选择为了有效地存储和管理家谱数据,我们需要选择合适的数据结构。

考虑到家谱中家族成员之间的层次关系,树结构是一个理想的选择。

在这里,我们可以使用二叉树来表示家族关系。

每个节点代表一个家族成员,节点中存储成员的相关信息。

父节点与左子节点表示父子关系,父节点与右子节点表示父女关系。

另外,为了提高查询效率,我们还可以结合哈希表来存储家族成员的信息。

通过哈希函数将成员的关键信息(如姓名)映射到哈希表中的特定位置,从而实现快速的查找和访问。

三、系统功能模块设计1、数据录入模块提供友好的用户界面,方便用户输入家族成员的信息。

对输入的数据进行合法性检查,确保信息的准确性和完整性。

2、数据存储模块利用选择的数据结构(二叉树和哈希表)将家族成员的信息进行存储。

确保数据的安全存储,防止数据丢失或损坏。

3、查询模块支持多种查询条件,如按姓名、出生日期、关系等进行查询。

快速返回查询结果,并以清晰的方式展示给用户。

4、关系维护模块允许用户添加新的家族成员,并建立其与其他成员的关系。

支持修改和删除家族成员的信息及关系。

数据结构课程设计—家谱系统

数据结构课程设计—家谱系统

一.前言1 项目简介家谱(或称族谱)是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书体裁。

家谱是中国特有的文化遗产,是中华民族的三大文献(国史,地志,族谱)之一,属珍贵的人文资料,对于历史学、民俗学、人口学、社会学和经济学的深入研究,均有其不可替代的独特功能。

2系统功能本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息、插入家族成员、删除家族成员等功能。

本项目的实质是完成对家谱成员信息的建立、查找、插入、修改、删除等功能,可以首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。

一.需求分析1.系统需求本系统是家谱管理系统,顾名思义,是用来管理家族资料的,要实现建立新家谱,查找家谱文件,增加家族成员,修改家族成员,删除家族成员和查找家族成员等基本功能。

家谱管理系统是给家族长辈管理家族资料用的,对电脑的操作不一定熟悉,所以操作界面一定要友好,一定要方便,dos界面的操作一般比较枯燥,综合各种原因,要用MFC实现可视化的界面。

2.环境需求硬件:acer ASPIRE 4740GI5处理器2G内存320G硬盘软件:vs 2008二.总体设计3.1 总体设计框架建立家谱读取文件保存家谱添加结点修改结点删除结点程序入口输出家谱基本查询关系查询配偶信息图1系统总体设计模块结构图3.2 数据结构设计关于树形的结构:在树形结构的选择上,根据实际中多子女的现象选择一般树,考虑到家谱中成员可能存在的不定成员数问题,抛弃了以数组为基础的一般树方案,决定用链表来实现。

树形结构的外存保存。

为了提高效率,树形结构在程序初始化时由外存文件一次读入内存,此后不管插入还是修改,删除都不再对外存的树结构保存文件进行操作,只在内存中处理,程序退出时对外存树结构文件进行一次更新。

也就是说,不管在程序运行中中对家谱结构进行多少种,多少次的操作,外存的树结构文件始终只会被程序访问两次。

数据结构课程设计总结报告 家族关系查询系统

数据结构课程设计总结报告 家族关系查询系统

郑州轻工业学院课程设计任务书题目家族关系查询系统专业、班级软件外包11-01 学号姓名主要内容、基本要求、主要参考资料等:主要内容:建立家族关系数据库,实现对家族成员关系的相关查询。

基本要求:(1)建立家族关系并能存储到文件中;(2)实现家族成员的添加。

(3)可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息。

课程设计按照教学要求需要一周时间完成,总共要上机调试程序10小时。

对每个题目要有需求分析,在需求分析中,将题目中要求的功能进行叙述分析,并且设计解决此问题的数据存储结构,设计或叙述解决此问题的算法,描述算法建议使用流程图,进行算法分析指明关键语句的时间复杂度。

给出实现功能的一组或多组测试数据,程序调试后,将按照此测试数据进行测试的结果列出来。

源程序要按照写程序的规则来编写。

要结构清晰,重点函数的重点变量,重点功能部分要加上清晰的程序注释。

程序能够运行,要有基本的容错功能。

尽量避免出现操作错误时出现死循环;主要参考资料:数据结构(C语言版),在网上查询的相关资料及部分代码完成期限:2013.6.18-2013.6.20指导教师签名:课程负责人签名:2013年 6 月18 日郑州轻工业学院本科数据结构课程设计总结报告设计题目:家族关系查询系统学生姓名:系别:计算机与通信工程专业:软件外包班级:学号:指导教师:2013年6 月20 日一、设计题目(任选其一)家族关系查询系统二、运行环境(软、硬件环境)电脑及Visual C++ 6.0三、算法设计的思想随着社会发展,人们使用纸质的家谱已经非常不方便而且不利于在家谱里进行添加和修改。

而用算法设计一个家族关系查询系统则可以解决这个问题。

数据结构的二叉树刚好满足家谱的基本结构。

首先建立一个文件作为家谱,然后在文件中输入字符串,实现了在文件中按照数据的逻辑关系进进输入便可建立相应的三叉链表。

然后就是进行数据的存储、删除及查找工作。

四、 算法的流程图家谱的创建:修改家谱:成员查询:五、算法设计分析本次设计研究的是建立家族关系,实现对家族成员关系相关查询的问题。

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

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

家谱管理系统姓名:田鑫磊学号:1514020421(1)功能部分:本程序共实现了6个功能分别为:1.读出家谱并显示2.确定指定成员在家族中得辈份3.输出指定辈得所有成员4.在家谱中添加新成员,并追加到文件中5.输出指定家庭得所有成员6、退出本系统(2)各功能得算法思想:1.读出家谱并显示存储结构用栈,按照先显示双亲,然后显示其所有孩子得顺序显示所有得家庭成员。

2.确定指定成员在家族中得辈份用求成员所在得二叉树中得层数(按层遍历二叉树)来确定,这里采用得就是递归算法3.输出指定辈得所有成员此处定义了一个新得结构体类型(增加存储节点所在得层数),定义如下:struct{BTNode*q;int loc;//存结点所在得层数}qu[10];并用一个队列来比较显示同辈分得所有成员.4.在家谱中添加新成员,并追加到文件中首先,输入一个新成员得名字;然后,输入其双亲;之后,再添加到整个存储二叉链表中。

然后,再将新得存储结构写回到文件中。

二叉链表得结点类型为:typedefstruct 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,intm){ struct //定义一个新得结点类型,在孩子兄弟存储结构得基础上添加一个数据域存其所在层数ﻩ{BTNode *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、在家谱中添加新成员,并追加到文件中voidadd(BTNode *&b,ElemType y[],ElemTypex[]){char [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 :");ﻩ scanf("%s",&);ﻩif((fp=fopen(,”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)ﻩ{ﻩﻩf puts(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为其她字符时,程序执行结束,退出本系统。

数据结构课程设计家谱

数据结构课程设计家谱

数据结构课程设计家谱一、课程目标知识目标:1. 理解并掌握数据结构中树状结构的基本概念与性质;2. 学会使用家谱树作为具体实例,掌握其构建、遍历及搜索等基本操作;3. 掌握家谱树在数据结构中的应用场景,理解其在解决实际问题中的优势。

技能目标:1. 能够运用所学知识,独立构建家谱树,并进行相关操作;2. 能够通过分析家谱树的特点,编写相应的遍历和搜索算法;3. 能够将家谱树应用于实际问题的解决,提高编程解决问题的能力。

情感态度价值观目标:1. 培养学生对数据结构学习的兴趣,激发学生主动探究家谱树等树状结构的积极性;2. 培养学生的团队协作意识,鼓励学生在学习过程中互相交流、共同进步;3. 增强学生的数据结构与实际应用联系的意识,培养学生的创新思维和问题解决能力。

本课程针对高年级学生,结合数据结构学科特点,注重理论与实践相结合,旨在提高学生运用数据结构解决实际问题的能力。

课程围绕家谱树展开,以实用性为导向,充分考虑学生的认知水平和兴趣,分解课程目标为具体可衡量的学习成果,为后续教学设计和评估提供依据。

二、教学内容本章节教学内容主要包括以下几部分:1. 树状结构基本概念:介绍树的基本概念、性质以及相关术语,如根节点、叶子节点、子树、深度、高度等。

2. 家谱树构建:以实际家谱为案例,讲解如何将现实问题抽象为家谱树,并运用数据结构知识进行构建。

3. 树的遍历:介绍树的遍历方法,包括前序遍历、中序遍历和后序遍历,分析各种遍历方法在家谱树中的应用。

4. 树的搜索:讲解树的基本搜索算法,如深度优先搜索和广度优先搜索,以及在家谱树中的应用实例。

5. 家谱树应用实例:分析家谱树在实际问题中的应用,如查找家族成员关系、计算家族成员辈分等。

教学内容依据教材相关章节,结合课程目标进行组织。

具体教学安排如下:1. 第一课时:树状结构基本概念及家谱树构建;2. 第二课时:树的遍历方法及其在家谱树中的应用;3. 第三课时:树的搜索算法及其在家谱树中的应用;4. 第四课时:家谱树应用实例分析和编程实践。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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时,追踪数据的痛苦;当然,还有解决问题后的激动与自豪。

所有这些都增强了我对编程的热爱、提高了我对计算机专业的兴趣。

相关文档
最新文档