ImageVerifierCode 换一换
格式:DOCX , 页数:41 ,大小:323.80KB ,
资源ID:3714389      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3714389.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构家谱管理系统二叉链表.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构家谱管理系统二叉链表.docx

1、数据结构家谱管理系统二叉链表 项目实训二 项目名称 _ 家谱管理系统_ 姓名_ _ 班级 _ _ 学号_ _ 指导教师 _ _ _ 2018.1问题描述:家谱用于记录某家族历代家族成员的情况与关系。现编制一个家谱资料管理系统,实现对一个家族所有的资料进行收集整理。实现对家庭成员信息的建立、查找、插入、修改、增加、删除、更新、统计等等功能。目的和要求:目的:1、能根据具体问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。2、提高程序设计和调试能力。通过上机学习,验证自己设计的算法的正确性。学会有效利用基本

2、调试方法。3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。4、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。要求: 用于记录某家族历代家族成员的情况与关系。现编制一个家谱资料管理系统,实现对一个家族所有的资料进行收集整理。支持对家谱的增加,删除,更新,统计等。软件环境:Microsoft Visual Studio 2010流程设计:模块划分:1、统计模块(1)统计家族总人数、健在人数、几代人(2)主要函数:int Generation(Node *root); /这个家族共有几代人int NumberOfPeople( ); /家族的总人数int Lif

3、eNum( ); /健在人数(3)实现方法:静态成员变量(4)实现结果:2、更新模块(1)创建家谱、增加成员、删除成员、成员改名(2)主要函数:Node* Creat( ); /构造函数调用void AddNewPeople(Node *root,string FatherName,string NAme); /增加新的家族成员int DeletePeople(Node *root,string FatherName,string Deletepeople); /删除家族成员int SetNewName(Node *root,string NAme,string NewName); /更改姓名

4、(3)实现方法:创建家谱和成员改名主要通过递归调用;增加成员和删除成员主要通过栈的非递归调用。(4)实现结果:3、查询模块(1)查询成员详细信息、查询成员的孩子以及孩子的详细信息(2)主要函数:int Message(Node *root,string Name); /显示该成员的基本信息int FindChild(Node *root,string NAme); /显示孩子信息(3)实现方法:通过递归调用,找到成员,输出相应的信息(4)实现结果:4、显示模块(1)前序、中序、后序遍历家谱(2)主要函数:void PreOrder(Node *root); /前序递归遍历输出家谱void In

5、Order(Node *root); /中序递归遍历输出家谱void PostOrder(Node *root); /后序递归遍历输出家谱(3)实现方法:递归遍历(4)实现结果:5、文件模块(1)保存到文件、从文件读取(2)主要函数:void SaveToFile(Node *root); /保存到文件void FileToFamilyTree( Node *root) ; /从文件中读取(3)实现方法:文件流(4)实现结果:数据结构实现:1、生日结构体struct BirthDay int year; int month; int day; friend istream& operator(

6、istream &is,BirthDay &b); friend ostream& operator重载会跳过空白字符,包括回车符。解决问题:使用cin.get()函数接收回车。9、问题:删除成员时,删除能够成功,但会出现空指针错误。解决方案:在delete该成员时,需要将指向该成员的指针置空。10、问题:在主函数中,通过请用户输入数字,来选择相应的操作,当用户误输入的为选择以外的字符时,会结束程序运行。解决方案:与解决方案4相同。实验结果及分析1、创建家谱2、保存到文件3、读取文件4、增加成员5、基本信息6、查询成员信息7、成员改名8、遍历家谱9、查询孩子信息10、删除成员收获: 本次实训在

7、我们为期两周的时间里进行,通过自己的不断学习、请教和老师的指导,完成了关于家谱资料管理的设计。前期主要是准备阶段,运用哪些技术,中期实践阶段,通过几天的上机编写代码,然后完成,后期完善阶段,对一些难点和重点再细化,和做一些数据输入时的异常处理。最后进行答辩阶段。通过这次实训的互相帮助学习的过程,自己看书学习的经验,以及从网上以及其他各种途径获得信息和知识的经验。理论与实际相结合的设计,锻炼了我综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平。而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,我的各方面经验都得到

8、了极大的丰富。附录 全部代码Familytree.h#ifndef FAMILYTREE_H#define FAMILYTREE_H#include #include #include #include #include #include using namespace std;struct BirthDay int year; int month; int day; friend istream& operator(istream &is,BirthDay &b); friend ostream& operator(istream &is,BirthDay &b) isb.yearb.mon

9、thb.day; return is;ostream& operator(ostream &os,const BirthDay &b) osb.year-b.month-root=Creat();FamilyTree:FamilyTree() /析构函数,释放链表中各结点的存储空间 Release(root);Node* FamilyTree:Getroot() /获取根结点 return root;Node* FamilyTree:Creat()/构造函数调用 Node *root; string ch; coutch; /输入名字 if(ch!=y)/异常处理 if(ch!=Y) if(c

10、h!=#) int t=1; do coutn输入不明确,请重新输入!endl; coutch; if(ch=y)|(ch=Y)|(ch=#) t=0; while(t=1); if (ch=#) root = NULL; else root=new Node; /申请结点内存空间 SetNode(root); /设置结点内容 root-child=Creat( ); /该结点的孩子 root-brother=Creat( ); /该结点的兄弟 return root; /返回结点void FamilyTree:Release(Node *root) /析构函数调用 if(root!=NULL

11、) Release(root-child); /释放左孩子 Release(root-brother); /释放右兄弟 delete root; void FamilyTree:SetNode(Node *root) /设置结点信息 Numberofpeople+; cout请输入家庭成员的基本信息endl; coutroot-data.name; coutroot-data.birthPlace; coutroot-data.birthDay; if(cin.fail() cout输入有错!请重新输入生日(数字):data.birthDayi!=0;+i) if(isdigit(root-d

12、ata.birthDayi)=0) coutn输入不明确,请重新输入!endl; break; */ coutroot-data.sex; coutroot-data.education; coutroot-data.job; coutroot-data.father; cout配偶(有多任配偶则以“,”或者“、”间隔):root-data.spouse; coutroot-data.life; if(toupper(root-data.life)!=Y) /异常处理 if(toupper(root-data.life)!=N) int t=1; do coutn输入不明确,请重新输入!end

13、l; coutroot-data.life; if(toupper(root-data.life)=Y)|(toupper(root-data.life)=N) t=0; while(t=1); if(toupper(root-data.life)=Y) LifePeopele+;void FamilyTree:PreOrder(Node *root) /前序递归遍历输出家谱 if(root=NULL) return; else coutdata.namechild); PreOrder(root-brother); void FamilyTree:InOrder(Node *root) /中

14、序递归遍历输出家谱 if(root=NULL) return; else InOrder(root-child); coutdata.namebrother); void FamilyTree:PostOrder(Node *root) /后序递归遍历输出家谱 if(root=NULL) return; else PostOrder(root-child); PostOrder(root-brother); coutdata.namechild); /左孩子的 return l+1; /int numberofpeople=0;int FamilyTree:NumberOfPeople( )

15、/家族的总人数 if(root=NULL) /家族人数为0 return 0; /*else if(root!=NULL) numberofpeople+; NumberOfPeople(root-child); NumberOfPeople(root-brother); return numberofpeople;*/ else return Numberofpeople;/int count=0;int FamilyTree:LifeNum( ) /健在人数 if(root=NULL) /-1表示这个家族不存在 return -1; /*else if(toupper(root-data.life)=Y) count+; LifeNum(root-child);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1