收藏 分销(赏)

数据结构家谱管理系统(二叉链表).doc

上传人:快乐****生活 文档编号:2669604 上传时间:2024-06-04 格式:DOC 页数:58 大小:366.54KB
下载 相关 举报
数据结构家谱管理系统(二叉链表).doc_第1页
第1页 / 共58页
数据结构家谱管理系统(二叉链表).doc_第2页
第2页 / 共58页
数据结构家谱管理系统(二叉链表).doc_第3页
第3页 / 共58页
数据结构家谱管理系统(二叉链表).doc_第4页
第4页 / 共58页
数据结构家谱管理系统(二叉链表).doc_第5页
第5页 / 共58页
点击查看更多>>
资源描述

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

2、性。学会有效利用基本调试方法。3、 初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。4、 培养根据选题需要选择学习书籍,查阅文献资料的自学能力。要求: 用于记录某家族历代家族成员的情况与关系。现编制一个家谱资料管理系统,实现对一个家族所有的资料进行收集整理。支持对家谱的增加,删除,更新,统计等。软件环境:Microsoft Visual Studio 2010流程设计:开始Main函数Menu函数FamilyTree函数Getroot函数Case 1Case 2Case 3Case 4Case 5Case 6Case 7Case 8Case 9Case10defeau

3、lt结束Creat函数函数递归调用Menu函数PreOrder函数函数InOrder函数函数PostOrder函数函数Generation函数函数NumberOfPeople函数函数LifeNum函数函数Message函数函数AddNewPeople函数数DeletePeople函数SetNewName函数FindChild函数SaveToFile函数FileToFamilyTree函数递归调用递归调用递归调用PrintMessage函数函数SetNode函数函数函数PreFindFather函数函数PreFindBrother函数函数PreFindFather函数函数PreFindBroth

4、er函数函数PrintMessage函数函数模块划分:1、 统计模块(1) 统计家族总人数、健在人数、几代人(2) 主要函数:int Generation(Node *root); /这个家族共有几代人int NumberOfPeople( ); /家族的总人数int LifeNum( ); /健在人数(3) 实现方法:静态成员变量(4) 实现结果:2、 更新模块(1) 创建家谱、增加成员、删除成员、成员改名(2) 主要函数:Node Creat( ); /构造函数调用void AddNewPeople(Node root,string FatherName,string NAme); /增加

5、新的家族成员int DeletePeople(Node root,string FatherName,string Deletepeople); /删除家族成员int SetNewName(Node root,string NAme,string NewName); /更改姓名(3) 实现方法:创建家谱和成员改名主要通过递归调用;增加成员和删除成员主要通过栈的非递归调用。(4) 实现结果:3、 查询模块(1) 查询成员详细信息、查询成员的孩子以及孩子的详细信息(2) 主要函数:int Message(Node *root,string Name); /显示该成员的基本信息int FindChi

6、ld(Node *root,string NAme); /显示孩子信息(3) 实现方法:通过递归调用,找到成员,输出相应的信息(4) 实现结果:4、 显示模块(1) 前序、中序、后序遍历家谱(2) 主要函数:void PreOrder(Node *root); /前序递归遍历输出家谱void InOrder(Node root); /中序递归遍历输出家谱void PostOrder(Node root); /后序递归遍历输出家谱(3) 实现方法:递归遍历(4) 实现结果:5、 文件模块(1) 保存到文件、从文件读取(2) 主要函数:void SaveToFile(Node root); /保存

7、到文件void FileToFamilyTree( Node root) ; /从文件中读取(3) 实现方法:文件流(4) 实现结果:数据结构实现:1、 生日结构体struct BirthDay int year;int month;int day;friend istream operator(istream &is,BirthDay &b);friend ostream& operator重载会跳过空白字符,包括回车符。解决问题:使用cin.get()函数接收回车。9、 问题:删除成员时,删除能够成功,但会出现空指针错误。解决方案:在delete该成员时,需要将指向该成员的指针置空.10、

8、 问题:在主函数中,通过请用户输入数字,来选择相应的操作,当用户误输入的为选择以外的字符时,会结束程序运行。解决方案:与解决方案4相同。实验结果及分析1、 创建家谱2、 保存到文件3、 读取文件4、 增加成员5、 基本信息6、 查询成员信息7、 成员改名8、 遍历家谱9、 查询孩子信息10、 删除成员收获: 本次实训在我们为期两周的时间里进行,通过自己的不断学习、请教和老师的指导,完成了关于家谱资料管理的设计。前期主要是准备阶段,运用哪些技术,中期实践阶段,通过几天的上机编写代码,然后完成,后期完善阶段,对一些难点和重点再细化,和做一些数据输入时的异常处理.最后进行答辩阶段。通过这次实训的互相

9、帮助学习的过程,自己看书学习的经验,以及从网上以及其他各种途径获得信息和知识的经验。理论与实际相结合的设计,锻炼了我综合运用所学的基础知识,解决实际问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力水平。而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,我的各方面经验都得到了极大的丰富。附录 全部代码Familytree。hifndef FAMILYTREE_H#define FAMILYTREE_H#include include include using namespace std;struct BirthDay int year;int m

10、onth;int day;friend istream& operator(istream is,BirthDay &b);friend ostream operatorb.yearb。monthb。day;return is;ostream& operator(ostream os,const BirthDay &b)osb.year-b。month-ch; /输入名字 if(ch!=”y)/异常处理if(ch!=”Y”)if(ch!=”#”)int t=1;docoutn输入不明确,请重新输入!!”endl;coutchild=Creat( ); /该结点的孩子root-brother=C

11、reat( ); /该结点的兄弟return root; /返回结点void FamilyTree:Release(Node root) /析构函数调用if(root!=NULL)Release(root-child); /释放左孩子Release(rootbrother); /释放右兄弟delete root;void FamilyTree::SetNode(Node root) /设置结点信息Numberofpeople+;cout”请输入家庭成员的基本信息endl;coutrootdata。birthPlace;coutrootdata。birthDay;if(cin.fail())co

12、ut输入有错!请重新输入生日(数字):data.birthDayi!=0;+i)if(isdigit(rootdata。birthDayi)=0)cout”n输入不明确,请重新输入!”endl;break;/coutrootdata。sex;coutrootdata.education;cout”工作:;cinroot-data.job;coutrootdata.father;cout”配偶(有多任配偶则以“,”或者“、”间隔):endl;cinrootdata.spouse;coutdata。life;if(toupper(root-data.life)!=Y) /异常处理if(touppe

13、r(rootdata.life)!=N)int t=1;docout”n输入不明确,请重新输入!endl;coutdata.life)=Y)|(toupper(root-data。life)=N))t=0;while(t=1);if(toupper(rootdata。life)=Y)LifePeopele+;void FamilyTree::PreOrder(Node *root) /前序递归遍历输出家谱if(root=NULL)return;elsecoutroot-data。namedata.namebrother);void FamilyTree::PostOrder(Node *roo

14、t) /后序递归遍历输出家谱if(root=NULL)return;elsePostOrder(rootchild);PostOrder(root-brother);coutdata。namedata.life)=Y)count+;LifeNum(root-child);LifeNum(rootbrother);return count;*/return LifePeopele;void FamilyTree:PrintMessage(Node *root ) /输出基本信息if(root=NULL)return ;elsecout”姓名:”rootdata。name;cout”tt性别:”r

15、ootdata.sex;couttt配偶:root-data.spouseendl;cout”出生地:”data.birthPlace;cout”tt生日:root-data。birthDay;/;data.birthDay。year-”data.birthDay.monthdata.birthDay.dayendl;cout”tt父亲:data。fatherendl;cout”学历:data。education;cout”tt工作:rootdata。job;couttt是否健在:”;if(toupper(rootdata。life)=Y)cout”是”endl;elsecout”否”data

16、。name=Name)message=1;PrintMessage(root );elseMessage(rootchild,Name);Message(root-brother,Name);return message;Node FamilyTree::PreFindFather(Node root,string FatherName) /给定元素值查找父亲结点指针位置并返回其指针,此方法采用的先序遍历 if(root=NULL)throw错误;Node *p;Node *tree20;int top=0;while(root!=NULLtop!=0)while(root!=NULL)if(

17、root-data。name=FatherName)p=root;top+;treetop=root;root=root-child;if(top!=0)root=treetopbrother;top;return p;Node* FamilyTree:PreFindBrother(Node *root,string FatherName) /给定元素值查找兄弟结点指针位置并返回其指针,此方法采用的先序遍历 if(root=NULL)throw错误;Node *p;Node *tree20;int top=0;while(root!=NULLtop!=0)while(root!=NULL)if

18、(rootdata。father=FatherName)p=root;top+;treetop=root;root=root-child;if(top!=0)root=treetopbrother;top-;return p;void FamilyTree:AddNewPeople(Node root,string FatherName,string NAme) /增加新的家族成员if(root=NULL)/如果这个家族为空,直接把该结点置为根结点Creat( ) ;elseNode *p=new Node;pdata。name=NAme;pchild=NULL;pbrother=NULL;N

19、ode Brother=PreFindBrother(root,FatherName); /兄弟结点if(root-data。father=FatherName) /如果与祖先(根结点)同一个父亲,则置为根结点的右兄弟Node *q=root;while(q-brother!=NULL) /寻找根结点的右兄弟结点为空的结点q=q-brother;if(qbrother=NULL) q-brother=p;SetNode(p);Node Father=PreFindFather(root,FatherName); /父亲结点/Node *Brother=PreFindBrother(root,F

20、atherName); /兄弟结点if(Fatherchild=NULL) /如果父亲结点的孩子结点为空Fatherchild=p;SetNode(p);else /如果父亲结点的孩子结点不为空if(Brother-brother=NULL) /最后一个兄弟结点Brotherbrother=p;SetNode(p);int FamilyTree::DeletePeople(Node root,string FatherName,string Deletepeople) /删除家族成员int t=0;Numberofpeople-;if(root=NULL)return t;elseif(roo

21、tdata.name=Deletepeople) /如果要删除的为祖先,则调用Release()函数t=1;root-brother=NULL;root-child=NULL;Release(root);elseNode *Father=PreFindFather(root,FatherName);Node *Brother=PreFindBrother(root,FatherName); /兄弟结点Node *p;Node *tree20;int top=0;while(root!=NULL|top!=0)while(root!=NULL)if(rootdata.name=Deletepeo

22、ple)p=root;/break;top+;treetop=root;root=rootchild;if(top!=0)root=treetop-brother;top;if(toupper(pdata。life)=Y) /健在人数减一LifePeopele;if(Father-childdata。name=pdata。name)/Deletepeople)Fatherchild=NULL;elseBrother-brother=NULL;/pbrother=NULL;/pchild=NULL;t=1;delete p;return t;int flag=0; /标记int FamilyTree::SetNewName(Node root,string NAme,string NewName) /更改姓名if(root=NULL)return flag;elseif(rootdata.name=NAme)flag=1;rootdata.name=NewName;elseSetNewName(root-child,NAme,NewName);SetNewName(root

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服