2022年家谱管理系统

上传人:壹****1 文档编号:567314747 上传时间:2024-07-19 格式:PDF 页数:26 大小:635.01KB
返回 下载 相关 举报
2022年家谱管理系统_第1页
第1页 / 共26页
2022年家谱管理系统_第2页
第2页 / 共26页
2022年家谱管理系统_第3页
第3页 / 共26页
2022年家谱管理系统_第4页
第4页 / 共26页
2022年家谱管理系统_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《2022年家谱管理系统》由会员分享,可在线阅读,更多相关《2022年家谱管理系统(26页珍藏版)》请在金锄头文库上搜索。

1、洛 阳 理 工 学 院课 程 设 计 报 告课程名称_ 设计题目_ 专业 _ 班级 _ 学号 _ 姓名 _ 完成日期_ 数据结构课程设计家谱管理系统计算机科学与技术B150405 B15080822 宋士龙2016 年 12 月 30 日精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 26 页课 程 设 计 任 务 书设计题目:家谱管理系统设计内容与要求:【问题描述】:实现具有下列功能的家谱管理系统1). 输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可

2、附加其它信息、但不是必需的。2). 实现数据的存盘和读盘。3). 显示家谱。4). 按照出生日期查询成员名单。5). 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。6). 修改某成员信息。【基本要求】:界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。测试数据:要求使用1、全部合法数据; 2、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明。指导教师: _ 年月日课 程 设 计 评 语成绩:指导教师: _ 年月日精选学习资料 - - -

3、 - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告1 一、算法思想本程序是一个管理家谱的系统,通过这个系统可以对家族成员进行创建、显示、查找、修改、以及保存家谱和读取家谱功能。该系统分为以下几个模块,分别是:创建家谱,显示家谱、按姓名和生日查找家庭成员、修改家谱、存盘、读盘以及退出系统。本程序用到的存储形式为多叉树,因为家谱中每个人既有父母又有孩子,而且孩子的个数并不确定,所以用多叉树来存储最为合适。用多叉树来存储,就用用到多叉树的递归创建及递归遍历。因为是多叉树,所以遍历时用广度优先搜索合适。本函数最主要的思

4、想就是递归调用,每个子函数中都会用到递归。定义结构体时给定指针数组的最大容量,来规定家谱中最多可以存多少人。定义一个家族树的指针变量用来当每个子函数的参数,从而将其返回到主函数中。以下时算法思想流程图:二、模块划分1.int main():主函数2.void CreatTree(TreeNode *Tree) :创建家族树3.void OutPutAll(TreeNode *Tree):显示家谱4.void Menue(TreeNode *Tree):主菜单5.void SubMenue1(TreeNode * Tree) :副菜单(修改选项菜单)6.void Change(TreeNode

5、* Tree) :修改家谱7.TreeNode * SearchTree(TreeNode *Tree,char name,int length) : 按照姓名查找家谱成员家谱管理系统创建家谱显示家谱修改家谱查找成员读写家谱按照姓名按照生日修改本人修改父母修改孩子存盘读盘退出系统精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告2 8.TreeNode * SearchTree1(TreeNode *Tree,char birth,int length) : 按照生日查找家谱成员9.vo

6、id OutPutMessage(TreeNode * Tree,char name,int length) : 输出按姓名查找到的家谱成员10. void OutPutMessage1(TreeNode * Tree,char birth,int length):输出按生日查找到的家谱成员11. void SaveFamily(TreeNode *root):保存家谱12. void ReadFamily(TreeNode *root):读取家谱三、数据结构typedef struct TreeNode int ChildNum; / 记录这个人拥有几个儿女char Name20;/ 记录这

7、个人的姓名char birthday20;/ 生日int marriage;/ 婚否( 1 表示结婚, 0 表示没结婚)int death;/生死( 1 表示活着, 0 表示过世)char Kind;/ 标示节点的种类有女G 男 B char address100;/住址char livemassage50;/ 死亡日期(如果其已经死亡)struct TreeNode *NextNode20; /记录这个人的儿女struct TreeNode *Parent; /记录这个节点的父节点TreeNode,*tree; 四、测试第一组数据为:爷爷,奶奶,爸爸,妈妈,我,二叔,二婶,姐姐,三叔,三婶,

8、弟弟一共三代 11个人。其中爷爷是根节点,奶奶为爷爷的配偶,同时也是爷爷的第一个后继节点。爸爸,二叔,三叔为爷爷的子女。爸爸的配偶是妈妈,爸爸的子女是我。二叔的配偶是二婶,子女是姐姐。三叔的的配偶是三婶,三叔的的子女是弟弟。进入程序之后,首先进行创建家谱,然后进行存盘,之后进行修改和查询等步骤。退出程序在进入程序时,进行读盘。之后在进行其他操作,程序完成之后退出即可。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告3 图 1 家族树第一组数据测试截图为:图 2 显示家谱爷爷爸爸二叔奶奶

9、三叔妈妈二婶三婶我姐姐弟弟精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告4 图 3 按照姓名查找家族成员图 4 存盘第二组数据为:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告5 图 4 王家家族树第二组数据测试截屏为:图 5 修改家族成员的信息王老王大刘老王二李大张二王 小一王 小二精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -

10、第 7 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告6 图 6 修改某个人的具体信息图 7 按照生日查找某人精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告7 图 8 读盘五、源程序#include #include #include #ifdef WIN32 #define CLEAR system(cls) #define TipForSaveFilePosition printf(tt输入文件名及保存位置(eg: D:example.txt) : ) #defin

11、e TipForReadFilePosition printf(tt文件名及其路径(eg: D:example.txt): ) #else #define CLEAR system(clear) #define TipForSaveFilePosition printf(tt输入文件名及保存位置(eg: /home/xiong/example.txt): ) #define TipForReadFilePosition printf(tt文件名及其路径(eg: /home/xiong/example.txt): ) #endif #define maxFileNameLen 50 / 保存的文

12、件名的最大长度int FLAG=0; int a=1; typedef struct TreeNode int ChildNum; / 记录这个人拥有几个儿女char Name20;/ 记录这个人的姓名char birthday20;/ 生日int marriage;/ 婚否( 1 表示结婚, 0 表示没结婚)精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告8 int death;/生死( 1 表示活着, 0 表示过世)char Kind;/ 标示节点的种类有女G 男 B char a

13、ddress100;/住址char livemassage50;/ 死亡日期(如果其已经死亡)struct TreeNode *NextNode20; /记录这个人的儿女struct TreeNode *Parent; /记录这个节点的父节点TreeNode,*tree; void CreatTree(TreeNode *Tree); void OutPutAll(TreeNode *Tree); void Menue(TreeNode *Tree); void SubMenue1(TreeNode * Tree); void SubMenue2(TreeNode *Tree); void C

14、hange(TreeNode * Tree); void AddNew(TreeNode * Tree); TreeNode * SearchTree(TreeNode *Tree,char name,int length); TreeNode * SearchTree1(TreeNode *Tree,char birth,int length) ; void OutPutMessage(TreeNode * Tree,char name,int length); void OutPutMessage1(TreeNode * Tree,char birth,int length); void

15、SaveFamily(TreeNode *root); void ReadFamily(TreeNode *root); int main()/ 主函数 TreeNode *Tree;/TreeNode *Tree1; /Tree1=&(*Tree); Tree=(TreeNode *)malloc(sizeof(TreeNode); Tree-Parent =NULL; strcpy(Tree-Name,0); Menue(Tree); return 0; void Menue(TreeNode *Tree)/ 输出主菜单 /*TreeNode *Tree1; Tree1=&Tree;*/

16、char c; char name20; char birth20; while(1) system(cls); printf(t); printf(nntt*欢 迎 使 用 家 族 管 理 系 统*nn); printf(ntt A:输入家谱信息建立树); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告9 printf(ntt B:输出整个家谱信息); printf(ntt C:按出生日期查找某人); printf(ntt D:按姓名查找某人); printf(ntt E:修改某

17、个人的信息); printf(ntt F:存盘); printf(ntt G:读盘); printf(ntt H:退出整个程序nt); c=getchar(); switch(c) case A: TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode); printf(nt请输入姓名 :); scanf(%s,Tree-Name); printf(nt请输入性别女G 男 B:); getchar(); scanf(%c,&(Tree-Kind); Tree-Parent=NewNode; Tree-Parent=NULL;

18、/ CreatTree(Tree); / printf(nt-家谱图已经建立成功-nn); printf(nnt-请按 Enter 键继续操作 -); getchar(); break; case B: if(strcmp(Tree-Name,0)=0) printf(nt 家谱图的多叉树尚未建立请先建立树n); getchar(); break; printf(nnt整个家谱的主要信息如下:); OutPutAll(Tree); getchar(); break; case C: if(strcmp(Tree-birthday,0)=0) printf(nt 家谱图的多叉树尚未建立请先建立树

19、n); getchar(); break; printf(nt请输入你要查找的出生日期:); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告10 scanf(%s,birth); OutPutMessage1(SearchTree1(Tree,birth,20),birth,20); printf(nnt-*-*-*-*-*-*-*-*-*-*-nt); getchar(); break; case D: if(strcmp(Tree-Name,0)=0) printf(nt 家谱

20、图的多叉树尚未建立请先建立树n); getchar(); break; printf(nt请输入你要查找的人的姓名:nt); scanf(%s,name); OutPutMessage(SearchTree(Tree,name,20),name,20); printf(nnt-*-*-*-*-*-*-*-*-*-*-nt); getchar(); break; case E: if(strcmp(Tree-Name,0)=0) printf(nt 家谱图的多叉树尚未建立请先建立树n); getchar(); break; Change(Tree); getchar(); break; case

21、 F: if(strcmp(Tree-Name,0)=0) printf(nt 家谱图的多叉树尚未建立请先建立树n); getchar(); break; SaveFamily(Tree); getchar(); break; case G: /*if(strcmp(Tree-Name,0)=0) printf(nt 家谱图的多叉树尚未建立请先建立树n); getchar(); break; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告11 */ ReadFamily(&Tree

22、); getchar(); break; case H: printf(nnt-本次服务到此结束-); printf(nt-欢迎下次使用 -); printf(nt-谢谢 -nn); break; case n: break; default: printf(nnt-对不起 !你的选择不在服务范围之内!-); printf(nt-请您再次选择所需的服务项!-); printf(nt-谢谢 -nt); getchar(); break; if (c=H|c=f) break; getchar(); void CreatTree(TreeNode *Node) / 创建树 int i; TreeN

23、ode *NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode); Node-NextNode0=NewNode; Node-NextNode0=NULL; printf(nt 请输入出生日期:); scanf(%s,Node-birthday); printf(nt 请输入家庭住址:);getchar(); scanf(%s,Node-address); printf(nt 请输入是否建在(1-是或 0-否):); scanf(%d,&(Node-death); if(Node-death=0) printf(nt请输入去世日期:); sca

24、nf(%s,Node-livemassage); else if(Node-death=1) printf(nt 仍然建在 ); printf(nt 请输入 %s 的配偶的姓名 (输入 0 代表没结婚 ):,Node-Name); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告12 scanf(%s,NewNode-Name); if(strcmp(NewNode-Name,0)!=0) printf(t请输入配偶的出生日期:); scanf(%s,NewNode-birthday

25、); printf(nt 请输入家庭住址:);getchar(); scanf(%s,NewNode-address); printf(nt 请输入是否建在(1-是或 0-否):); scanf(%d,&(NewNode-death); if(NewNode-death=0) printf(nt 请输入去世日期:); scanf(%s,NewNode-livemassage); else if(NewNode-death=1) printf(nt 仍然建在 ); printf(nt请输入 %s 的子女的数目(当子女输入0 时便停止输入该成员有关信息):,Node-Name); scanf(%d

26、,&(Node-ChildNum); if(Node-ChildNum)=0&strcmp(NewNode-Name,0)=0) return ; if(Node-Kind=G|Node-Kind=g) NewNode-Kind=B; else NewNode-Kind=G; NewNode-ChildNum=0; NewNode-NextNode0=NULL; Node-NextNode0=NewNode; Node-NextNode0-Parent=Node;/ 孩子的父母for(i=1;iChildNum;i+) NewNode=(TreeNode *)malloc(sizeof(Tre

27、eNode);a+; printf(nt请输入 %s 的第 %d 子女的名字 :,Node-Name,i); scanf(%s,NewNode-Name); printf(nt请输入 %s 的第 %d 子女的性别女G 男 B:,Node-Name,i); getchar(); scanf(%c,&NewNode-Kind); NewNode-ChildNum=-1; NewNode-Parent=Node; Node-NextNodei=NewNode; CreatTree(Node-NextNodei); / 从子女的数目开始 void OutPutAll(TreeNode *Tree) 精

28、选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告13 int i, flag=0; printf(nt-*-*-*-*-*-*-*-*-*-); printf(nt姓 名 :%s 出 生 日 期 :%s 家 庭 住 址 : %s 性别: %c,Tree-Name,Tree-birthday,Tree-address,Tree-Kind); if (Tree-Kind=G|Tree-Kind=g) flag=1; printf( 女); else printf( 男); printf(t

29、 是否健在 (1-健在, 0-去世 ):); if(Tree-death=1) printf(1); else if(Tree-death=0) printf(0); if (!(Tree-NextNode0) printf(nt 至今没有配偶和子女n); return; if(flag=1) printf(nt 丈夫姓名 :%s,Tree-NextNode0-Name); else printf(nt 妻子姓名 :%s,Tree-NextNode0-Name); printf(t 是否健在 (1-健在, 0-去世 ):); if(Tree-death=1) printf(1); else i

30、f(Tree-death=0) printf(0); for(i=1;iChildNum;i+) printf(nt第 %d个 子 女 的 姓 名 :%s 出 生 日 期 :%s 家 庭 住 址 : %s 性别%c,i,Tree-NextNodei-Name,Tree-NextNodei-birthday,Tree-NextNodei-address,Tree-NextNodei-Kind); if (Tree-NextNodei-Kind=G|Tree-NextNodei-Kind=g) printf( 女); else printf( 男); printf(t 是否健在 (1-健在, 0-

31、去世 ):); if(Tree-death=1) printf(1); else if(Tree-death=0) printf(0); printf(nt); for(i=1;iChildNum;i+) OutPutAll(Tree-NextNodei); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告14 TreeNode * SearchTree(TreeNode *Tree,char name,int length) int i; TreeNode *NewNode; if

32、(strcmp(Tree-Name,name)=0) if(length=0) FLAG=1; else FLAG=0; return Tree; if(Tree-NextNode0=NULL) return NULL; for(i=0;iChildNum;i+) if (i=0) NewNode=SearchTree(Tree-NextNodei,name,0); else NewNode=SearchTree(Tree-NextNodei,name,20); if (NewNode!=NULL) return NewNode; return NULL; void OutPutMessage

33、(TreeNode * Tree,char name,int length) int flag=0,i; TreeNode *NewNode; printf(nnt-*-*-*-*-*-*-*-*-*-*-); if(Tree=NULL) printf(nnt*该 家 谱 图 中 没 有 %s这 个 人 的 信 息 请 确 认 是 否 输 入 错 误*n,name); return; printf(nnt您所要找的人已经找到信息如下所示:); printf(nnt姓名:%s出生日期:%s 家庭住址:%s 性别:%c,name,Tree-birthday,Tree-address,Tree-Ki

34、nd); if (Tree-Kind=G|Tree-Kind=g) flag=1; /标记他 (她)的性别printf( 女); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告15 else printf( 男); printf(t 是否健在 (1-健在, 0-去世 ):); if(Tree-death=1) printf(1); else if(Tree-death=0) printf(0); NewNode=Tree-Parent; if (FLAG=1) if(flag=1)

35、 printf(nnt她是嫁入此家族的所以亲生父母信息不在家谱内包括); printf(nt 丈夫姓名 :%s,NewNode-Name); else printf(nnt他是入赘此家族的所以亲生父母信息不在家谱内包括); printf(nt 妻子姓名 :%s,NewNode-Name); if (NewNode-ChildNum)0) /判断他 (她)是否有孩子 printf(nt 的孩子的信息如下:); / 输出他 (她 )的孩子的信息for(i=1;iChildNum;i+) printf(nt 姓名 :%s 性别 :,NewNode-NextNodei-Name); if (NewNo

36、de-NextNodei-Kind=G|NewNode-Kind=g) printf( 女); else printf( 男); printf(t 是否健在 (1-健在, 0-去世 ):); if(Tree-death=1) printf(1); else if(Tree-death=0) printf(0); return; if(NewNode=NULL)/判断它是不是根节点如果是的话就没有父母兄弟信息printf(nt是这个家谱图里最年长的人,name); else if (NewNode-Kind=G|NewNode-Kind=g) /判断父亲节点是父亲还是母亲 printf(nt 母

37、亲姓名 :%s,NewNode-Name);/ 输出他(她)的父母亲的信息精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告16 printf(nt 父亲姓名 :%s,NewNode-NextNode0-Name); else printf(nt 母亲姓名 :%s,NewNode-NextNode0-Name); printf(nt 父亲姓名 :%s,NewNode-Name); if(Tree-NextNode0!=NULL) /判断他 (她)是否有配偶 if(flag=1)/ 输出

38、他 (她)的配偶的信息printf(nt丈夫姓名 :%s,Tree-NextNode0-Name); else printf(nt妻子姓名 :%s,Tree-NextNode0-Name); if (Tree-ChildNum0) /判断他 (她 )是否有孩子 printf(nt 的孩子的信息如下:); /输出他 (她)的孩子的信息for(i=1;iChildNum;i+) printf(nt 姓名 :%s 性别 :,Tree-NextNodei-Name); if (Tree-NextNodei-Kind=G|Tree-Kind=g) printf( 女); else printf( 男);

39、 printf(t 是否健在 (1-健在, 0-去世 ): ); if(Tree-death=1) printf(1); else if(Tree-death=0) printf(0); else printf(nt%s至今还没有孩子,name); else printf(nt%s至今还没有配偶和孩子n,Tree-Name); TreeNode * SearchTree1(TreeNode *Tree,char birth,int length) int i; TreeNode *NewNode; if(strcmp(Tree-birthday,birth)=0) 精选学习资料 - - - -

40、 - - - - - 名师归纳总结 - - - - - - -第 18 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告17 if(length=0) FLAG=1; else FLAG=0; return Tree; if(Tree-NextNode0=NULL) return NULL; for(i=0;iChildNum;i+) if (i=0) NewNode=SearchTree1(Tree-NextNodei,birth,0); else NewNode=SearchTree1(Tree-NextNodei,birth,20); if (NewNode!=NULL) r

41、eturn NewNode; return NULL; void OutPutMessage1(TreeNode * Tree,char birth,int length) int flag=0,i; TreeNode *NewNode; printf(nnt-*-*-*-*-*-*-*-*-*-*-); if(Tree=NULL) printf(nnt*该家谱图中没有出生日期为%s 这个人的信息请确认是否输入错误*n,birth); return; printf(nnt您所要找的人已经找到信息如下所示:); printf(nnt姓名:%s出生日期:%s 家庭住址:%s 性别:%c,Tree-

42、Name,Tree-birthday,Tree-address,Tree-Kind); if (Tree-Kind=G|Tree-Kind=g) flag=1; /标记他 (她)的性别printf( 女); else printf( 男); void Change(TreeNode * Tree) / 修改某个人的信息 char name20; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告18 TreeNode * NewNode; printf(nt请输入你要修改的人的姓名:n

43、t); scanf(%s,name); NewNode=SearchTree(Tree,name,20); if(NewNode=NULL) printf(nnt*该 家 谱 图 中 没 有 %s这 个 人 的 信 息 请 确 认 是 否 输 入 错 误*n,name); return; else SubMenue1(NewNode); void SubMenue1(TreeNode * Tree) / 输出副菜单 char c; int flag,i; char name20; char birth20; char address150; char Parent220; TreeNode *

44、 NewNode; getchar(); while(1) system(cls); printf(t); printf(nnt -*-请 选 择 你 的 操 作 -*- ); printf(nt-*-*-*-A:修改个人的信息-*-*-*-*-*-*- ); printf(nt-*-*-*-B:修改父母的信息-*-*-*-*-*-*- ); printf(nt-*-*-*-C:修改子女的信息-*-*-*-*-*-*- ); printf(nt-*-*-*-D:退出 -*-*-*-*-*-*-*-*-*-nt); c=getchar(); switch(c) case A: printf(nn

45、t 请输入修改的姓名:如果不需要修改就输入 0 然后按 Enter 键继续 nt); scanf(%s,name); if(strcmp(name,0)!=0) strcpy(Tree-Name,name); printf(nnt是否要修改性别:如果需要就输入1不需要修改就输入0然后按 Enter 键精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 20 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告19 继续 nt); scanf(%d,&flag); if (flag=1) if(Tree-Kind=G|Tree-Kind=g) T

46、ree-Kind=B; else Tree-Kind=G; printf(nnt请输入修改的出生日期:如果不需要修改就输入0然后按Enter 键继续nt); scanf(%s,birth); if(strcmp(birth,0)!=0) strcpy(Tree-birthday,birth); printf(nnt请输入修改的家庭地址:如果不需要修改就输入0然后按Enter 键继续nt); scanf(%s,address1); if(strcmp(address1,0)!=0) strcpy(Tree-address,address1); printf(nnt 个人信息修改成功); brea

47、k; case B: if(Tree-Parent=NULL) /判断是不是头节点 printf(nt是这个家谱图里最顶端的人没有父母信息!,name); break; if (FLAG=1) /判断是不是入赘或加入此间的 if(Tree-Kind=G|Tree-Kind=g) printf(nnt她是嫁入此间的所以父母信息不在家谱内包括); else printf(nnt他是入赘此间的所以父母信息不在家谱内包括); break; if(Tree-Parent-Kind=G|Tree-Parent-Kind=g) strcpy(Parent0, 母亲 ); strcpy(Parent1, 父亲

48、 ); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 21 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告20 else strcpy(Parent0, 父亲 ); strcpy(Parent1, 母亲 ); printf(nnt 请输入 %s 要修改的姓名:如果不需要修改就输入0然后按Enter 键继续nt,Parent0); scanf(%s,name); if(strcmp(name,0)!=0) strcpy(Tree-Parent-Name,name); printf(nnt 请输入 %s 要修改的姓名:如果不需要修改就输

49、入0然后按Enter 键继续nt,Parent1); scanf(%s,name); if(strcmp(name,0)!=0) strcpy(Tree-Parent-NextNode0-Name,name); printf(nnt-父母的信息修改成功-); break; case C: if(Tree-ChildNum=0) printf(nnt 至今还没有子女); break; if (Tree-Parent !=NULL) if (strcmp(Tree-Name,Tree-Parent-NextNode0-Name)=0)/如果他是入赘或者是嫁入的就需用配偶节点完成修改 Tree=Tr

50、ee-Parent; for(i=1;iChildNum;i+) printf(nnt请输入 %s 修改的姓名 :如果不需要修改就输入0然后按Enter 键继续 nt,Tree-NextNodei-Name); scanf(%s,name); if(strcmp(name,0)!=0) strcpy(Tree-NextNodei-Name,name); printf(nnt是否要修改性别:如果需要就输入1不需要修改就输入0然后按 Enter 键继续 nt); scanf(%d,&flag); if (flag=1) if(Tree-NextNodei-Kind=G|Tree-NextNodei

51、-Kind=g) Tree-NextNodei-Kind=B; else Tree-NextNodei-Kind=G; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 22 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告21 printf(nnt-子女的信息修改成功-); break; case D: printf(nnt-本项服务到此结束-); break; case n: break; default: printf(nnt-对不起 !你的选择不在服务范围之内!-); printf(nt-请您再次选择所需的服务项!-); prin

52、tf(nt-谢谢合作 !-nt); break; if (c=D|c=d) break; printf(nnt-请按 Enter 键继续操作 -); getchar(); getchar(); void SaveFamily(TreeNode *root)/ 保存家谱至指定文件 char saveFileNamemaxFileNameLen; FILE* fp; TreeNode *queue50, *head; int i, front, rear;/ 队列的头指针,尾指针printf( * 保存家谱*nn); /if(root=NULL) if(root = NULL) printf(tt

53、 家谱中无成员,无法保存!n); return; TipForSaveFilePosition;/ 文件及其绝对路径格式scanf(%s, saveFileName); getchar(); fp = fopen(saveFileName, w);/不存在则新建。存在,则从文件起始位置写,原内容将被覆盖。if(fp = NULL) printf(tt 新建文件失败!n); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 23 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告22 return ; else printf(tt 新建文件成

54、功,文件及其路径为:%sn, saveFileName); /*利用宽度优先搜索遍历家族多叉树*/ fwrite(root, sizeof(TreeNode), 1, fp); /将根结点存入文件(二进制形式 ) front = rear = 0;/ 初始化空队queuerear+ = root;/ 根结点进队while(front != rear)/ 队列不为空 head = queuefront+;/ 队头元素出队if (head-NextNode0 != NULL) fwrite(head-NextNode0, sizeof(TreeNode), 1, fp); for(i=1; iCh

55、ildNum; i+) fwrite(head-NextNodei, sizeof(TreeNode), 1, fp); queuerear+ = head-NextNodei; fclose(fp); fp = NULL; void ReadFamily(tree *root)/ 从指定文件中读取家谱 FILE* fp; char readFileName50; tree queue50,head; int i, front, rear; printf( * 读取家谱*nn); printf(tt输入文件名及其路径,以便从中读取家谱。n); TipForReadFilePosition; s

56、canf(%s, readFileName); getchar(); fp = fopen(readFileName, r);/为读而打开文本文件(文件必须已存在) if(fp = NULL) printf(tt 只读形式打开文件失败!n); return; /*一边从文件读取结构体变量,一边重新建树*/ 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 24 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告23 *root = (tree)malloc(sizeof(TreeNode); if(*root = NULL) printf(

57、tt 重建树时为根结点分配内存失败!n); return; fread(*root, sizeof(TreeNode), 1, fp); front = rear = 0;/ 初始化空队queuerear+ = *root;/ 根结点进队while(front!=rear) head = queuefront+; if (head-NextNode0 != NULL) head-NextNode0 = (tree)malloc(sizeof(TreeNode); if (head-NextNode0 = NULL) printf(tt 重建树时分配内存失败!n); return; fread(

58、head-NextNode0, sizeof(TreeNode), 1, fp); for (i = 1; iChildNum; i+) head-NextNodei = (tree)malloc(sizeof(TreeNode); if (head-NextNodei = NULL) printf(tt 重建树时分配内存失败!n); return; fread(head-NextNodei, sizeof(TreeNode), 1, fp); head-NextNodei-Parent = head; queuerear+ = head-NextNodei; fclose(fp); fp =

59、 NULL; 六、总结本次数据结构课程设计我选的题目是家谱管理系统,历时四天,由我和王月精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 25 页,共 26 页洛 阳 理 工 学 院课 程 设 计 报 告24 同学一起完成。总体来说这次课程设计还是比较困难的,而且我们选的这个题目在这些题目中也是很有难度的。中间遇到很多困难,但是在我和她一起讨论以及老师的帮助下,最终还是顺利的完成了。刚一开始选题目的时候,我并没有怎么在意选什么,只是随便选了一个,到后来才发现选的这个题目非常难。经过分析,发现这个题目需要用到树,而树我又没有学好,所以写的时候非常吃力。

60、最一开始,我用的是二叉树来存储,后来写到一半发现写不下去了,用递归创建函数始终不合适,最后不得不放弃。于是我在网上开始查找资料,不过查到的资料大多于本次实验不相符,还有一些也是看不懂。只有一个,我发现他是用的多叉树,看了一会发现也能理解。于是打算用多叉树来储存。可是又不知道该如何写起,但还是在网上查了多叉树的递归创建方法就开始写了。在上机前一天晚上,王月给我发来了他写的程序,除了存盘和读盘,其他的功能基本都实现了。我拿来他的和我对比,发现我们写的大同小异,于是我结合着她的将我的改了一下,基本的功能也能实现了。接下来就是最重要的模块了,也是最麻烦的, 存盘和读盘。 我和王月同学参考了去年的课程设

61、计的保存和读取。但是那是顺序表的保存和读取,和我们用到的不尽相同。这个时候我们已经没有思路,所以我们向老师求助。老师给我们讲了一些关于存和读的知识,又让我们看了一下书,我们总算大体了解了一下这个知识。接下来我们在网上查找资料,最终终于写出来了存盘和读盘。但是运行的时候发现又有问题了,在表面上看来是只能存不能读。于是我们向老师求助,老师看了我们的程序之后,建议我们换一种方式存盘和读盘,将节点存起来,然后读盘时读一个就把他放在树里。晚上回去,我对我的函数仔细看了一下,突然发现了问题。我的程序存盘也是有问题的。循环内写入文件少一次,或者说是次数不固定。因为我父亲节点的第一个节点如果有配偶,就存配偶,没有的话存子女,很随机。我发现了这个漏洞之后,想了好久才想出解决方法。我把父节点的第一个节点单独存,不让他入队,然后把第二个后继一直到最后一个循环存。这样果然解决了我们存读盘的问题。完成之后,我们的程序也算是大功告成了。通过这次课程设计,我学到了很多课本里学不到的知识。比如多叉树的创建以及遍历,还有树的保存与读取。而且,数据结构这门课对我们来说非常重要,这是我们以后学习和运用的基础。以后我们还是要认真学习, 多多探索其他知识,使我们的大学生活变得更丰富多彩。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 26 页,共 26 页

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号