ImageVerifierCode 换一换
格式:DOC , 页数:58 ,大小:353.04KB ,
资源ID:3032562      下载积分:14 金币
验证码下载
登录下载
邮箱/手机:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

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

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  
声明  |  会员权益     获赠5币     写作写作

1、填表:    下载求助     留言反馈    退款申请
2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
7、本文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

注意事项

本文(数据结构家谱综合管理系统二叉链表.doc)为本站上传会员【快乐****生活】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

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

1、 项目实训二 项目名称 _ 家谱管理系统_ 姓名_ _ 班级 _ _学号_ _指导老师 _ _ _ .1问题描述:家谱用于统计某家族历代家族组员情况和关系。现编制一个家谱资料管理系统,实现对一个家族全部资料进行搜集整理。实现对家庭组员信息建立、查找、插入、修改、增加、删除、更新、统计等等功效。目标和要求:目标:1、 能依据具体问题具体情况,结合数据结构课程中基础理论和基础算法,分析并正确确定数据逻辑结构,合理地选择对应存放结构,并能设计出处理问题有效算法。2、 提升程序设计和调试能力。经过上机学习,验证自己设计算法正确性。学会有效利用基础调试方法。3、 初步掌握软件开发过程中问题分析、系统设计

2、、程序编码、测试等基础方法和技能。4、 培养依据选题需要选择学习书籍,查阅文件资料自学能力。要求: 用于统计某家族历代家族组员情况和关系。现编制一个家谱资料管理系统,实现对一个家族全部资料进行搜集整理。支持对家谱增加,删除,更新,统计等。软件环境:Microsoft Visual Studio 步骤设计:开始Main函数Menu函数FamilyTree函数Getroot函数Case 1Case 2Case 3Case 4Case 5Case 6Case 7Case 8Case 9Case10defeault结束Creat函数函数递归调用Menu函数PreOrder函数函数InOrder函数函数

3、PostOrder函数函数Generation函数函数NumberOfPeople函数函数LifeNum函数函数Message函数函数AddNewPeople函数数DeletePeople函数SetNewName函数FindChild函数SaveToFile函数FileToFamilyTree函数递归调用递归调用递归调用PrintMessage函数函数SetNode函数函数函数PreFindFather函数函数PreFindBrother函数函数PreFindFather函数函数PreFindBrother函数函数PrintMessage函数函数模块划分:1、 统计模块(1) 统计家族总人数、

4、健在人数、几代人(2) 关键函数:int Generation(Node *root); /这个家族共有几代人int NumberOfPeople( ); /家族总人数int LifeNum( ); /健在人数(3) 实现方法:静态组员变量(4) 实现结果:2、 更新模块(1) 创建家谱、增加组员、删除组员、组员更名(2) 关键函数:Node* Creat( ); /结构函数调用void AddNewPeople(Node *root,string FatherName,string NAme); /增加新家族组员int DeletePeople(Node *root,string Fathe

5、rName,string Deletepeople); /删除家族组员int SetNewName(Node *root,string NAme,string NewName); /更改姓名(3) 实现方法:创建家谱和组员更名关键经过递归调用;增加组员和删除组员关键经过栈非递归调用。(4) 实现结果:3、 查询模块(1) 查询组员具体信息、查询组员孩子和孩子具体信息(2) 关键函数:int Message(Node *root,string Name); /显示该组员基础信息int FindChild(Node *root,string NAme); /显示孩子信息(3) 实现方法:经过递归调

6、用,找到组员,输出对应信息(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); /保留到文件void FileToFamilyTree( Node *root) ; /从文件中读取

7、(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.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(is

10、tream &is,BirthDay &b);friend ostream& operator(istream &is,BirthDay &b)isb.yearb.monthb.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:C

11、reat()/结构函数调用Node *root;string ch;coutch; /输入名字 if(ch!=y)/异常处理if(ch!=Y)if(ch!=#)int t=1;docoutn输入不明确,请重新输入!endl;coutch;if(ch=y)|(ch=Y)|(ch=#)t=0;while(t=1);if (ch=#) root = NULL;elseroot=new Node; /申请结点内存空间SetNode(root); /设置结点内容root-child=Creat( ); /该结点孩子root-brother=Creat( ); /该结点弟兄return root; /返回

12、结点void FamilyTree:Release(Node *root) /析构函数调用if(root!=NULL)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输入有错!请重新输入

13、生日(数字):data.birthDayi!=0;+i)if(isdigit(root-data.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)

14、int t=1;docoutn输入不明确,请重新输入!endl;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;elsecoutdata.namechild);PreOrder(root-brother);void FamilyTree:InOr

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

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

17、unt+;LifeNum(root-child);LifeNum(root-brother);return count;*/return LifePeopele;void FamilyTree:PrintMessage(Node *root ) /输出基础信息if(root=NULL)return ;elsecout姓名:data.name;couttt性别:data.sex;couttt配偶:data.spouseendl;cout出生地:data.birthPlace;couttt生日:data.birthDay;/;data.birthDay.year-data.birthDay.mon

18、th-data.birthDay.dayendl;couttt父亲:data.fatherendl;cout学历:data.education;couttt工作:data.job;coutdata.life)=Y)cout是endl;elsecout否data.name=Name)message=1;PrintMessage(root );elseMessage(root-child,Name);Message(root-brother,Name);return message;Node* FamilyTree:PreFindFather(Node *root,string FatherNam

19、e) /给定元素值查找父亲结点指针位置并返回其指针,此方法采取先序遍历 if(root=NULL)throw错误;Node *p;Node *tree20;int top=0;while(root!=NULL|top!=0)while(root!=NULL)if(root-data.name=FatherName)p=root;top+;treetop=root;root=root-child;if(top!=0)root=treetop-brother;top-;return p;Node* FamilyTree:PreFindBrother(Node *root,string Father

20、Name) /给定元素值查找弟兄结点指针位置并返回其指针,此方法采取先序遍历 if(root=NULL)throw错误;Node *p;Node *tree20;int top=0;while(root!=NULL|top!=0)while(root!=NULL)if(root-data.father=FatherName)p=root;top+;treetop=root;root=root-child;if(top!=0)root=treetop-brother;top-;return p;void FamilyTree:AddNewPeople(Node *root,string Fath

21、erName,string NAme) /增加新家族组员if(root=NULL)/假如这个家族为空,直接把该结点置为根结点Creat( ) ;elseNode *p=new Node;p-data.name=NAme;p-child=NULL;p-brother=NULL;Node *Brother=PreFindBrother(root,FatherName); /弟兄结点if(root-data.father=FatherName) /假如和祖先(根结点)同一个父亲,则置为根结点右弟兄Node *q=root;while(q-brother!=NULL) /寻求根结点右弟兄结点为空结点q

22、=q-brother;if(q-brother=NULL) q-brother=p;SetNode(p);Node *Father=PreFindFather(root,FatherName); /父亲结点/Node *Brother=PreFindBrother(root,FatherName); /弟兄结点if(Father-child=NULL) /假如父亲结点孩子结点为空Father-child=p;SetNode(p);else /假如父亲结点孩子结点不为空if(Brother-brother=NULL) /最终一个弟兄结点Brother-brother=p;SetNode(p);i

23、nt FamilyTree:DeletePeople(Node *root,string FatherName,string Deletepeople) /删除家族组员int t=0;Numberofpeople-;if(root=NULL)return t;elseif(root-data.name=Deletepeople) /假如要删除为祖先,则调用Release()函数t=1;root-brother=NULL;root-child=NULL;Release(root);elseNode *Father=PreFindFather(root,FatherName);Node *Brot

24、her=PreFindBrother(root,FatherName); /弟兄结点Node *p;Node *tree20;int top=0;while(root!=NULL|top!=0)while(root!=NULL)if(root-data.name=Deletepeople)p=root;/break;top+;treetop=root;root=root-child;if(top!=0)root=treetop-brother;top-;if(toupper(p-data.life)=Y) /健在人数减一LifePeopele-;if(Father-child-data.nam

25、e=p-data.name)/Deletepeople)Father-child=NULL;elseBrother-brother=NULL;/p-brother=NULL;/p-child=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(root-data.name=NAme)flag=1;root-data.name=NewName;elseSetNewName(root-child,NAme,NewName);SetNewName(root-brother,NAme,NewName);return flag;int FamilyTree:FindChild(Node *root,string NAme) /显示孩子信

移动网页_全站_页脚广告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 

客服