数据结构课程设计之简易家谱 报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编号:学号: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,则继续进行兄弟节点的插入,以此类推,根据文件的读取,将树生成,本程序中所有的算法都基于以上所介绍的算法。
关于IO的设计:
考虑到题目要求家谱信息以树形的形式一次读入内存,而个人的各种资料现在虽然条目不多,但随着程序的升级,以后可能变得越来越大。
我把树形结构和个人信息记录的文档分为两个文件保存在外存中,一个文件串行化地记录家谱树的结构信息,保存少量个人信息作为识别标志;另一个文件保存完整的个人信息,所有的个人信息以线性记录的方式记录在其中。当程序运行要读入家谱结构时,只读入保存少量记录的文件并建立起树形结构。索引时,以树形中的少量信息为依据在另一个文件中找到全部的各人信息资料。
这样的好处主要有两点:
1. 由于树形结构是串行化记录于外存,一个节点记录多次,信息大量冗余,
如果树形节点中保留全部信息,必将造成大量的空间浪费;只保存作为索引的少量信息在树形结构中,节约了空间。
2. 由于结构的精简,在家谱初始化时读入内存需要的时间相应减少,节约了装载时间。
这样做存在的问题:
每次执行修改,添加,删除,查询时都要直接访问外存来取得或写入数据。内外存访问上的巨大时间差的存在,使得进行这些操作相对来说并不显得很高效。
关于树形的结构:
在树形结构的选择上,根据实际中多子女的现象选择一般树,考虑到家谱中成员可能存在的不定成员数问题,抛弃了以数组为基础的一般树方案,决定用链表来实现。
树形结构的外存保存。为了提高效率,树形结构在程序初始化时由外存文件一次读入内存,此后不管插入还是修改,删除都不再对外存的树结构保存文件进行操作,只在内存中处理,程序退出时对外存树结构文件进行一次更新。也就是说,不管在程序运行中中对家谱结构进行多少种,多少次的操作,外存的树结构文件始终只会被程序访问两次。
关于功能的设计(以基本要求为准):
1.插入:用户按提示输入资料,在树形中插入节点,在个人完整记录
文件中添加插入人的所有信息并保存。
2.删除:用户输入被删除人的识别关键字(即名字),在树形结构中删
除此人,在个人记录文件中不处理。
3.修改:用户输入被删除任的识别关键字(即名字),从个人完整记录
文件中读出该人所有信息供用户进行修改,然后写回。
4.查询:完成了关键字查找部分和关系查找部分,读出个人全部信息
并显示。
关于个人资料单元:
由于树形节点要涉及到大量的逻辑操作,要用到一些运算符的重载,个人资料在树形单元定义为class类,而写入文件的单元存萃是数据,定义为简单的struct类。
定义为struct和class类,使得不管是树形结构插入删除还是IO都是对整个结构体进行的操作,这样,如果要往结构体中添加若干个新信息条目