数据结构课程设计—家谱系统.doc
《数据结构课程设计—家谱系统.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计—家谱系统.doc(25页珍藏版)》请在三一办公上搜索。
1、一.前言1 项目简介 家谱(或称族谱)是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书体裁。家谱是中国特有的文化遗产,是中华民族的三大文献(国史,地志,族谱)之一,属珍贵的人文资料,对于历史学、民俗学、人口学、社会学和经济学的深入研究,均有其不可替代的独特功能。2系统功能 本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息、插入家族成员、删除家族成员等功能。本项目的实质是完成对家谱成员信息的建立、查找、插入、修改、删除等功能,可以首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。一
2、 需求分析1. 系统需求本系统是家谱管理系统,顾名思义,是用来管理家族资料的,要实现建立新家谱,查找家谱文件,增加家族成员,修改家族成员,删除家族成员和查找家族成员等基本功能。家谱管理系统是给家族长辈管理家族资料用的,对电脑的操作不一定熟悉,所以操作界面一定要友好,一定要方便,dos界面的操作一般比较枯燥,综合各种原因,要用MFC实现可视化的界面。2. 环境需求硬件:acer ASPIRE 4740G I5处理器 2G内存 320G硬盘软件:vs 2008二 总体设计3.1 总体设计框架删除结点修改结点添加结点保存家谱读取文件建立家谱程序入口配偶信息关系查询基本查询输出家谱 图1 系统总体设计
3、模块结构图3.2 数据结构设计 关于树形的结构:在树形结构的选择上,根据实际中多子女的现象选择一般树,考虑到家谱中成员可能存在的不定成员数问题,抛弃了以数组为基础的一般树方案,决定用链表来实现。树形结构的外存保存。为了提高效率,树形结构在程序初始化时由外存文件一次读入内存,此后不管插入还是修改,删除都不再对外存的树结构保存文件进行操作,只在内存中处理,程序退出时对外存树结构文件进行一次更新。也就是说,不管在程序运行中中对家谱结构进行多少种,多少次的操作,外存的树结构文件始终只会被程序访问两次。以二叉链表作为树的存储结构,链表中的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,它通过描述
4、每个结点的一个孩子和兄弟信息来反映结点之间的层次关系,其具体的结点结构为:firstChilddatanextSibling其中,firstchild为指向该结点第一个孩子的指针,nextsibling为指向该结点下一个兄弟,elem是数据元素内容,举例如下:3.3 算法设计1、家谱的创建和结点的添加 家谱采用的树的结构,通过左孩子,右兄弟的方式变为二叉树,创建的过程实际上就是二叉树的添加结点的过程,根据父亲的名字添加在父亲结点的左边。代码如下:家谱的创建FamilyTree:FamilyTree() T=NULL;/开始为空家谱 家谱结点的添加void FamilyTree:Add(pers
5、on parent, person addNode) /将addnode添加到parent作为parent的孩子结点 int n=0; addNode-firstchild=addNode-nextsibling=NULL; /初始时firstchild同nextsibling都为空 addNode-parent=parent; if(parent=NULL) /如果父结点空 if(T=NULL) /如果根结点空 addNode-data.Depth=n; T=addNode; /将addnode赋给根结点 return; n=T-data.Depth+1;/否则将原来的根结点成为新根结点的孩
6、子 T-data.Depth=n; /并使原来根结点的depth值加1 addNode-firstchild=T; T-parent=addNode; T=addNode; return; strcpy(addNode-data.parentname,parent-data.name); n=parent-data.Depth+1; addNode-data.Depth=n;/将depth值加1 if(parent-firstchild=NULL) /如果parent无孩子,把addNode加入其firstchild parent-firstchild=addNode; else Insert
7、Sibling(parent-firstchild,addNode); /否则插入到相应的兄弟结点中去 2、 家谱结点的修改家谱结点的修改就是将结点的指针传入,更新数据就可完成,代码如下:void FamilyTree:Modify(person &curnode,person newnode) /修改某个人的信息 strcpy(curnode-data.name,newnode-data.name); strcpy(curnode-data.birthplace,newnode-data.birthplace); strcpy(curnode-data.sex,newnode-data.se
8、x); strcpy(curnode-data.occupation,newnode-data.occupation); strcpy(curnode-data.education,newnode-data.education); strcpy(curnode-data.top_headship,newnode-data.top_headship); curnode-data.height=newnode-data.height; curnode-data.birthdate=newnode-data.birthdate; curnode-data.deathdate=newnode-data
9、.deathdate; 3、 家谱结点的删除结点的删除,如果该结点没有子节点,则直接删除该结点所有信息,如果结点有子节点,则不能删除。void CCMy_Dlg:OnDelete()HTREEITEM pNode=m_pTreePage-m_ShowTree.GetSelectedItem();if(!pNode)MessageBox(请选择结点再删除!);return;if(DataTree.HaveChild(m_CurNode)MessageBox(该结点有孩子结点,不能直接删除!);return;if(MessageBox(确认删除?,警告,MB_ICONWARNING|MB_OKCA
10、NCEL)!=1)return;DataTree.DeleteNode(m_CurNode);/删除DataTree中相应的数据QUESTIONm_pTreePage-m_ShowTree.DeleteItem(pNode);if(m_pTreePage-m_ShowTree.GetCount()=0)/删除后若树为空GetDlgItem(IDC_GENERATION)-SetWindowText(未选结点);GetDlgItem(IDC_LINEALNAME)-SetWindowText();GetDlgItem(IDC_MATENAME)-SetWindowText();GetDlgIte
11、m(IDC_WHOSBRIEF)-SetWindowText(简介);GetDlgItem(IDC_INFORMATION)-SetWindowText();bIsMemory=true;4、 家谱的存储和读取家谱信息的存储是按先序遍历的方式依次存入硬盘的,读取的时候,将第一个结点的信息对应根结点,后面依次根据父亲的姓名使用插入函数完成家谱的重建,代码如下:家谱的存储void FamilyTree:SaveFamilyTree() /保存二叉树到文件 fstream f(1.dat,ios:binary|ios:out);/以二进制写方式打开文件 if(!f) cerr文件打开失败!endl;
12、/如果不能打开,显示出错信息 return;PreOrderTraverse(f,T,SaveNode);/调用先序遍历写二叉树信息到文件f.close();/关闭文件/person& t=FamilyTree:GetRoot();/ 返回家谱的根结点 /return t;家谱的重建(从文件读取)void FamilyTree:CreateFamilyTree() DestroyFamilyTree();/删除原来家谱树结构 int n=0;/初始化数组下标,用来看有几多个数据 fstream f(1.dat,ios:binary|ios:in);/以二进制读方式打开 if(!f) cerr文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 家谱 系统
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-2396800.html