数据结构课程设计-家谱系统_第1页
数据结构课程设计-家谱系统_第2页
数据结构课程设计-家谱系统_第3页
数据结构课程设计-家谱系统_第4页
数据结构课程设计-家谱系统_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.前言1项目简介家谱(或称族谱)是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书文体。家谱是中国特有的文化遗产,是中华民族的三大文献(国史,地志,族谱)之一,属宝贵的人文资料,关于历史学、风俗学、人口学、社会学和经济学的深切研究,均有其不可替代的独特功能。2系统功能本项目对家谱治理进行简单的模拟,以实现查看先人和子孙个人信息、插入家族成员、删除家族成员等功能。本项目的实质是完成对家谱成员信息的成立、查找、插入、修改、删除等功能,能够第一概念家族成员的数据结构,然后将每一个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。需求分析

2、1.系统需求本系统是家谱治理系统,顾名思义,是用来治理家族资料的,要实现成立新家谱,查找家谱文件,增加家族成员,修改家族成员,删除家族成员和查找家族成员等大体功能。家谱治理系统是给家族长辈治理家族资料用的,对电脑的操作不必然熟悉,因此操作界面必然要友好,必然要方便,dos界面的操作一样比较枯燥,综合各类缘故,要用MFC实现可视化的界面。2.环境需求硬件:acerASPIRE4740G15处置器2G内存320G硬盘软件:vs2020整体设计整体设计框架程序入口建立家谱配偶信息基本查询关系查询输出家谱删除结点修改结点添加结点保存家谱读取文件图1系统整体设计模块结构图数据结构设计关于树形的结构:在树

3、形结构的选择上,依如实际中多子女的现象选择一样树,考虑抵家谱中成员可能存在的不定成员数问题,抛弃了以数组为基础的一样树方案,决定用链表来实现。树形结构的外存保留。为了提高效率,树形结构在程序初始化时由外存文件一次读入内存,尔后不管插入仍是修改,删除都再也不对外存的树结构保留文件进行操作,只在内存中处置,程序退出时对外存树结构文件进行一次更新。也确实是说,不管在程序运行中中对家谱结构进行多少种,多少次的操作,外存的树结构文件始终只会被程序访问两次。以二叉链表作为树的存储结构,链表中的两个链域别离指向该结点的第一个小孩结点和下一个兄弟结点,它通过描述每一个结点的一个小孩和兄弟信息来反映结点之间的层

4、次关系,其具体的结点结构为:firstChilddatanextSibling其中,firstchild为指向该结点第一个小孩的指针,nextsibling为指向该结点下一个兄弟,elem是数据元素内容,举例如下:算法设计一、家谱的创建和结点的添加家谱采纳的树的结构,通过左小孩,右兄弟的方式变成二叉树,创建的进程事实上确实是二叉树的添加结点的进程,依照父亲的名字添加在父亲结点的左侧。代码如下:家谱的创建FamilyTree:FamilyTree()T=NULL;开始为空家谱家谱结点的添加voidFamilyTree:Add(personparent,personaddNode)/将addnod

5、e添加到parent作为parent的小孩结点intn=0;addNode-firstchild=addNode-nextsibling=NULL;/初始时firstchild同nextsibling都为空addNode-parent=parent;if(parent=NULL)/若是父结点空if(T=NULL)/若是根结点空addNode-=n;T=addNode;/将addnode赋给根结点return;n=T-+l;不然将原先的根结点成为新根结点的小孩T-=n;/并使原先根结点的depth值加1addNode-firstchild=T;T-parent=addNode;T=addNode

6、;return;strcpy(addNode-,parent-;n=parent-+1;addNode-=n;将depth值加1if(parent-firstchild=NULL)/若是parent无小孩,把addNode加入其firstchildparent-firstchild=addNode;elseInsertSibling(parent-firstchild,addNode);/不然插入到相应的兄弟结点中去2、家谱结点的修改家谱结点的修改确实是将结点的指针传入,更新数据就可完成,代码如下:voidFamilyTree:Modify(person&curnode,personnewno

7、de)/修改某个人的信息strcpy(curnode-,newnode-;strcpy(curnode-,newnode-;strcpy(curnode-,newnode-;strcpy(curnode-,newnode-;strcpy(curnode-,newnode-;strcpy(curnode-,newnode-;curnode-=newnode-;curnode-=newnode-;curnode-=newnode-;3、家谱结点的删除结点的删除,若是该结点没有子节点,那么直接删除该结点所有信息,若是结点有子节点,那么不能删除。voidCCMy_Dlg:OnDelete()HTREE

8、ITEMpNode=m_pTree();if(!pNode)MessageBox(请选择结点再删除!);return;if(m_CurNode)MessageBox(该结点有小孩结点,不能直接删除!);return;if(MessageBox(确认删除?,警告,MB_ICONWARNING|MB_OKCANCEL)!=1)return;(m_CurNode);/删除DataTree中相应的数据QUESTIONm_pTree(pNode);if(m_pTree()=0)/删除后假设树为空GetDlgItem(IDC_GENERATION)-SetWindowText(未选结点);GetDlgIt

9、em(IDC_LINEALNAME)-SetWindowText();GetDlgItem(IDC_MATENAME)-SetWindowText();GetDlgltem(IDC_WHOSBRIEF)-SetWindowText(简介);GetDlgItem(IDC_INFORMATION)-SetWindowText();bIsMemory=true;4、家谱的存储和读取家谱信息的存储是按先序遍历的方式依次存入硬盘的,读取的时候,将第一个结点的信息对应根结点,后面依次依照父亲的姓名利用插入函数完成家谱的重建,代码如下:家谱的存储voidFamilyTree:SaveFamilyTree()

10、/保留二叉树到文件fstreamf(,ios:binarylios:out);以二进制写方式打开文件if(!f)cerrvv文件打开失败!vvendl;/若是不能打开,显示犯错信息return;PreOrderTraverse(f,T,SaveNode);/挪用先序遍历写二叉树信息到文件();/关闭文件/person&t=FamilyTree:GetRoot();/返回家谱的根结点/returnt;家谱的重建(从文件读取)voidFamilyTree:CreateFamilyTree()DestroyFamilyTree();删除原先家谱树结构intn=0;/初始化数组下标,用来看有几多个数据

11、fstreamf(,ios:binary|ios:in);以二进制读方式打开if(!f)cerrvv文件打开失败!vvendl;/不能打开,显示犯错信息return;(O,ios:end);指针移到文件尾longposEnd=();(O,ios:beg);指针移到文件头personparentT=newCSNode;persontempmax_char_num;/概念读取数据的数组for(inti=0;idata),sizeof(Info);n+;NewFamilyTree();T=tempO;T-firstchild=T-nextsibling=NULL;/将第一个赋给根结点T-parent

12、=NULL;for(intj=l;jvn;j+)/其余继续用类似add()函数来添加进树里FindByName(T,parentT,tempj-;if(parentT)tempj-firstchild=tempj-nextsibling=NULL;tempj-parent=parentT;if(parentT-firstchild)InsertSibling(parentT-firstchild,tempj);elseparentT-firstchild=tempj;();/关闭文件流5、家谱信息的遍历要紧利用递归的方式遍历家谱树,代码入下:先序遍历:voidFamilyTree:PreOrd

13、erTraverse(fstream&f,person&T,void(_cdecl*Visit)(fstream&f,person&T)/先序遍历二叉树,并执行visit函数if(T)(*Visit)(f,T);PreOrderTraverse(f,T-firstchild,Visit);PreOrderTraverse(f,T-nextsibling,Visit);6、家族成员的查找查找部份涉及的查找方式多样,那个地址用按姓名查找来代表,其他查找利用的算法思想是类似的,利用递归的方式,代码如下:voidFamilyTree:FindByName(person&T,person&Tname,c

14、har*name)/searchthenameininfofromrootT查找姓名=name的人,假设在家谱中,用Tname返回,不然Tname为空,Tname初始为空if(T)if(strcmp(T-,name)=O)/用string库的strcmp()比较两个字符串,假设相等,那么找到符合条件的Tname=T;elseFindByName(T-firstchild,Tname,name);对T的firstchild递归搜索FindByName(T-nextsibling,Tname,name);对T的nextsibling递归搜索三程序实现程序实现部份是算法设计的补充与完善,代码会与算法

15、设计有不同,而且实现了MFC界面显示部份,最终工程的实现以程序的为主。注:代码太长不附在文档上四测试报告1.初始化界面:图2系统初始化界面成效图2文件读取保留模块新建家谱新建家谱实际操作为创建该家谱第一代成员,即该树的根结点。默许创建男性,默许创建当前结点的小孩结点,第一代不能创建兄弟结点,按取消操作,退出创建此家谱冋创建当前节点的孩子结直附加信悬(可跳辺)创建方式创窪与当前节卢同辈的结点退出莉里r-配偶姓名(没有则不填);女无标或-富邁管理至筑1.0交件案炸Q)帮助伸)擀写*人简历砺定|取消新第点的基玄信扈家庶直素成员姓容:创餐节点修改书点删除节盘家谱树查找图3新建家谱界面设计成效图2.2打

16、开文件1)按打开按键,弹出文件窗口,默许打开txt格式文件E臺面虽近访巨的位冒gbueD用库旦氏片4苣乐:2作机烏(c;)口匚L23.txtReadM已txtyu.txt2011/9/111:14交1檢2011/9/110:11对核2011/3/19:442011/g/l10:46丈心档2011/9/110:00打开J八丿CMy.卜CMy妾谱翹至垃卜妙:M好津匡磁P文科名的:yu.tx:|康進文件r.tstjflTF(O图4打开载入文件界面设计成效图2)打开文件后,操作窗口题目栏会显示该文件的文件名,并显示本家谱的信息yo-貂曽兰駆绑刘牛闵操柞帮助(H)询简介家歼-熨邨-1Mm身1妻8卡jds

17、idfsfisfvdv男dfjfjdklfjk图5打开文件信息成效图2.3保留文件按保留按键,直接保留信息到文件,按另存为按键,弹出另存为窗口,能够选择保留途径保留家谱文件。图6保留文件信息页面成效图操作模块创建新结点点击已经存在的一个结点,点击创建新结点按钮,表示在当前结点下创建子节点或兄弟结点,左侧显示编辑框,输入名字信息和配偶名字信息,能够选择性别,能够选择所创建新结点是当前结点的子节点或是兄弟结点。图7创建结点页面成效图3.2修改结点点击要修改的结点,按修改结点按钮,左侧显示编辑框,能够修更名字信息和配偶信息文件旧廡徉口移戢出修改当前结点的皐本信恳家離直系咸员姓茗;渾里女旣偶姓容眉有则

18、不填j:女dfksdfl毎燧庶盲系成员信息】*隸代总男.idasf基本信息生身麓母:12-34*:圈偶信扈:附加信息(可跳过)-掛写个X简历I硝定取消窗、日另白-i女男仙ksdfltjEdogfj男*血l1-创鉅节応極改节点删除节点退出查找家谱树女1-:-券.一-5:;白Bn.-u呂男園*图8修改结点页面设计成效图3.3删除结点1)删除子节点。选择要删除的子节点,按删除结点按钮,弹出警告窗口,询问是不是确认删除结点,按确信删除结点iHlss退出碱澗陰?修枚节点删除节点擁树J查找|日-呈yu-12;|L男仁自.男234sdfkjsdogfj二男jdsk:I自女khjJJ?C-3-_Q,-4-.o

19、0-家谱笞注盏篩1Q文件旧握炸(0)帶前H)【辈伪图】EiazElj简务7屠舷g【汩amf墓本信息2身父爭12、34殳饱嚅信息丁.吏:EdkidL3图9删除子节点页面成效图2)删除有子节点的父节点,会弹出警告窗口,说明有子节点,不能删除该结点图10删除父节点页面成效图4.查找依照姓名信息关键字查找1)不区分大小写冋家谱树蒼询Sjdsk请输入芸谨字方式r退出区少尢小写厂棍拥麵偶査询创逹节点修改节点删除节点萱找I交萍阳鎳作阿翻间pre尙图图11依照名字信息不分大小写查找页面成效图2)区分大小写图12依照姓名信息区分大小写查找页面成效图4.2依照配偶名字信息关键字查找交件旧案件帮助(H)rmI未迭结

20、点sdflcjEd.gfkhjdfrfdsfvd请输入关键字:J方式区少尢小写待棍拥胡偶査询创崖节点修改节点删除节点i二二家谱树査找|图13依照配偶姓名信息查找页面成效图五目标完成总结完成了新家谱的创建,由根结点开始创建新的家谱树完成了家谱文件的读取,能够打开指定途径的文件并在系统中显示该家谱信息完成了家谱文件的保留,能够把新建或修改的家谱文件保留到指定的途径完成了家谱树中新结点的创建,能够创建原有结点的兄弟结点或子结点,根节点只能创建其子结点完成了家谱树中任意结点的修改功能,能够修改结点的信息和其配偶信息完成了家谱树中任意子结点的删除功能,有子结点的父节点无法直接删除完成了家谱树中结点的查找

21、功能,能够依照姓名信息区分大小写或不分大小写查找,也能够依照配偶信息查找六碰到的问题和解决方案需要设计一个简单易用的系统,方便没有运算机技术的治理人员利用,一般的dos界面就无法知足此要求了,因此就要采取编写可视化的解决方案。没有学过可视化编程的相关技术,要从零开始学习此门课程,通过购买相关书籍和上网查找资料解决编程进程中碰到的问题。测试时期总会显现如此那样的问题,这时就需要很多的耐心,而且要细心的处置每一个错误。七尚未解决的问题和应计谋略在删除结点功能上,只能删除子结点,不能删除拥有子结点的父结点,要解决那个尚未解决的问题,需要在程序上做修改,在树形结构上做修改。可是由于完成系统以后,还没写

22、报告,由于时刻紧迫,没有添加此项功能。在删除结点功能上,每次只能删除一个结点,在效率上未能表现。那个问题是比较难解决的问题,以我此刻的编程能力临时未能想到解决方案,在往后的学习中会慢慢挖掘和探讨解决方式。数据没有加密,容易窜改。由于数据寄存于txt文件里面,修改里面的数据较为简单,严峻阻碍系统的平安性。能够概念一种二进制文件,只有本系统才能打开,如此就对数据进行了加密。八收成和心得这次大作业的完成时刻是整整一个暑假,但回忆起来,时刻都用在实习上,没有好好利用暑假的两个月来做课程设计。由于我本身编程能力不强,构思,写代码,修改,调试的时刻加起来绝对是要花上很多时刻的,而且关于可视化MFC之前从来没用过,都要自学,所花的时刻就更多了。确实是因为付出很多,因此在前期的设计组织中,中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论