版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、家谱( 3-1 )一、题目要求基本要求:从文件中读入家庭成员建立家谱,以孩子兄弟表示法存储。 基本功能:家谱管理,如:(1)(2)(3) 等等。在家谱中添加新成员,并追加到文件中。输出指定家庭的所有成员。确定指定成员在家族中的辈份(第几代) 。二 概要设计(1)功能部分: 本程序共实现了 6 个功能分别为:1. 读出家谱并显示2. 确定指定成员在家族中的辈份3. 输出指定辈的所有成员4. 在家谱中添加新成员,并追加到文件中5. 输出指定家庭的所有成员6. 退出本系统(2) 各功能的算法思想 :1. 读出家谱并显示 存储结构用栈,按照先显示双亲,然后显示其所有孩子的顺序显示所有的家庭成员。2.
2、确定指定成员在家族中的辈份 用求成员所在的二叉树中的层数(按层遍历二叉树)来确定,这里采用的是递归算法3. 输出指定辈的所有成员 此处定义了一个新的结构体类型(增加存储节点所在的层数) ,定义如下: struct BTNode *q;int loc;/存结点所在的层数qu10;并用一个队列来比较显示同辈分的所有成员。4. 在家谱中添加新成员,并追加到文件中 首先,输入一个新成员的名字; 然后,输入其双亲; 之后,再添加到整个存储二叉链表中。 然后,再将新的存储结构写回到文件中。 二叉链表的结点类型为: typedef struct nodeElemType data10;/存放成员的名字str
3、uct node *child;/其孩子指针struct node *brother;/ 其兄弟指针BTNode;5. 输出指定家庭的所有成员首先,设一个栈,并设一个标记位,先置1;然后,找到输入的要待显示的成员,将标记位置0;再次,显示其孩子和兄弟,依次下去直到显示完其所有的亲戚。6. 退出本系统通过一个输入字符 q 来控制,每完成一个功能,系统提示是否要继续操作: 当q为“ Y ”或者“ y”时,显示菜单,程序继续执行; 当 q 为其他字符时,程序执行结束,退出本系统。 三、详细设计 :通过一个 do-while 语句来控制各个模块的选择和实现。1. 读出家谱并显示void display
4、(BTNode *b)BTNode *q10;/int front,rear;int k;BTNode *p;p=b;k=0;front=-1;rear=0;qrear=p; /while(front<rear) front+;p=qfront;printf("%s",p->data ); / printf("(");disbr(p->child);printf(")n");if(p->child!=NULL) /rear+;qrear=p->child;if(p->brother!=NULL) /
5、rear+;qrear=p->brother;2. 确定指定成员在家族中的辈分定义一个栈头结点先入栈头结点出栈,并显示显示其孩子显示其兄弟/ 用递归的思想int generation(BTNode *b,int h,ElemType x) int i;if(b=NULL)return(0);比较是否相等i=strcmp(b->data,x); /if(i=0)return(h);int L=generation(b->child,h+1,x);if(L=0)L=generation(b->brother,h,x);return(L);3. 输出指定辈的所有成员void
6、layer(BTNode *t,int m) struct / 定义一个新的结点类型,在孩子兄弟存储结构的基础上添加一个数据域存其 所在层数BTNode *q;int loc;qu10;int front,rear;BTNode *p;p=t;k=0;front=-1;rear=0;qurear.q=p;qurear.loc=1;if( qurear.loc=m) /找到 m辈的即输岀printf("%c",p->data);while(fr on t<rear)/通过站查找所有n辈的结点并输岀 front+;p=qufront.q;if(p->child
7、!=NULL)rear+;qurear.q=p->child;qurear.loc=qufront.loc+1;if(n= qurear.loc)printf("%s ",p->child->data);if(p->brother!=NULL)rear+;qurear.q=p->brother; qurear.loc=qufront.loc;if( qurear.loc=n)printf("%s ",p->brother->data);4. 在家谱中添加新成员,并追加到文件中void add(BTNode *&a
8、mp;b,ElenType y,ElenType x)char filename20=" "FILE *fp;BTNode *p,*q;int i;p=FindNode(b,y);q=(BTNode *)malloc(sizeof(BTNode); for(i=0;xi!='0'i+) q->datai=xi;q->datai='0' q->child=q->brother=NULL;if(p->child =NULL)p->child=q;else p=p->child; while(p->b
9、rother!=NULL) p=p->brother ;p->brother=q;display(b);printf(" 向文件中读入新家谱 n"); printf("n input a filename:");scanf("%s",&filename);if(fp=fopen(filename,"w")=NULL) puts("n can't open the file.");exit(0); elseDispBTNode(b,fp);fclose (fp);voi
10、d DispBTNode(BTNode *b,FILE *fp)char a10;int i=0;if(b!=NULL)while(b->datai!='0')ai=b->datai;i+; ai='0' fputs(a,fp); / 写入文件 if(b->child!=NULL | b->brother!=NULL) fputs(s,fp);递归写入其孩子递归写入其兄弟DispBTNode(b->child,fp); / if (b->brother!=NULL) fputs(p,fp); DispBTNode(b->
11、brother,fp); /fputs(t,fp);5. 输出指定家庭的所有成员 void dispfamily(BTNode *b,ElemType x) BTNode *p;BTNode *qMaxSize;int top=-1,tap=1; if(b!=NULL) top+; qtop=b;while(top>-1)p=qtop;top-;if(strcmp(p->data,x)=0) / 查找此人top=-1; tap=0;if(p->child!=NULL)top+; qtop=p->child;if(tap=0)display(p->child); /
12、 return ;if(p->brother!=NULL)top+;qtop=p_>brother;if(tap=0)display(p->brother); / return ;显示其孩子显示其兄弟6.退出本系统此处通过一个输入字符q来控制,当q为“ Y”或者“ y”时,显示菜单,程序继续执行,当q为其他字符时,程序执行结束,退出本系统。此时q= N '四:调试分析1 首先,将已有家谱存储文件写在一个txt文档里,内容为:wuwu(wucha ng(wux in( wujia,wuhua),wuli)输出结果为:_系统功能0 显示此家庭1 禰定指定成员在家族中的輩2
13、输出指定蜚的所有成员3 卷家谱史添赧诚员,、并追4 输出旨克聖庭俞斎有成员 退出本条统请输人您的选择:0uuuu<uuchan9 wli > wue hang< uux in wuhua、 uuxin <uujia wuliO wuj ia< > ijuhua< >是否萝继缝操作(V/N>:2.调试时遇到的问题:(1)当选择功能3 (添加新成员),添加完成员后,写回文件时出现了错误,原本添加的为其中一个结点的孩子,结果写回文件时却成了该结 点的孙子,也就是本是要添加为此结点的孩子的兄弟,结果却成了其孩子 的孩子。最后经过单步跟踪发现写入文件
14、的函数编写错误, 缺少判断条件, 经过修改后,此问题得到了解决。( 2)当选择功能 0(显示此家谱),没有按照事先存储在 txt 中的文件 显示,通过认真检查程序中显示成员的函数(按层遍历)、不断调试,发 现并不是该显示函数的错误,因为在功能 4(输出指定家庭的所有成员) 中,也是通过调用该函数实现输出功能,于是,检查 txt 文件中事先存储 的家谱成员,发现是由于“(”与“)”没有匹配好,导致没有按照预期 想法创建二叉树造成的错误,通过修改 txt 文件,使得错误得以解决。 五、课程设计总结通过本次课程设计,我觉得自己最大的收获就是:( 1) 学会了怎样将课堂所学知识运用到较为实际的应用中来 由于对二叉链表的存储比较感兴趣,我选做的是家谱,开始觉得无从下手,但是经过仔细分析后,渐渐找到一点思路(首先创建,然后分别实现 各个功能,最后利用菜单实现选择功能并输出结果) 。( 2) 锻炼提出问题、解决问题和自学的能力 家谱的实现要求读、写文件,于是“如何将文件从文档中读出”
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年企业合并协议(含资产负债表)
- 2024年人工智能技术服务协议
- 2024年个人健康信息管理与服务合同
- 2024年劳动合同模板:企业与员工
- 食品加工企业焊烟净化方案
- 青少年心理健康教育与干预方案
- 2024年个人液体货物运输合同
- 2024健康咨询服务合同
- 新型养老院智能化弱电系统施工方案
- 2024劳动合同及劳动关系制度
- 锦鲤的繁殖与选优技术
- 新版食品安全法行政处罚对照表
- 河北省承德市药品零售药店企业药房名单目录
- 《花样跳绳交互绳》教学设计
- 文书档案整理培训课件
- 透析饮食课件
- 绘画心理分析课件
- 妊娠期高血压护理查房医学课件
- 骨髓腔输液技术课件
- 检具验收检查表(涵盖样板)
- 乳腺癌患者生存质量测定量表(FACT-B)
评论
0/150
提交评论