家谱(3-1)
一、题目要求。
基本要求:从文件中读入家庭成员建立家谱,以孩子兄弟表示法存储。
基本功能:家谱管理,如:
1) 在家谱中添加新成员,并追加到文件中。
2) 输出指定家庭的所有成员。
3) 确定指定成员在家族中的辈份(第几代)。
等等。二.概要设计。
1)功能部分:
本程序共实现了6个功能分别为:
1. 读出家谱并显示
2. 确定指定成员在家族中的辈份。
3. 输出指定辈的所有成员。
4. 在家谱中添加新成员,并追加到文件中。
5. 输出指定家庭的所有成员。
6. 退出本系统。
2)各功能的算法思想:
1. 读出家谱并显示。
存储结构用栈,按照先显示双亲,然后显示其所有孩子的顺序显示所有的家庭成员。
2. 确定指定成员在家族中的辈份。
用求成员所在的二叉树中的层数(按层遍历二叉树)来确定,这里采用的是递归算法。
3. 输出指定辈的所有成员。
此处定义了一个新的结构体类型(增加存储节点所在的层数),定义如下:
struct
btnode *q;
int loc; /存结点所在的层数。
qu[10];
并用一个队列来比较显示同辈分的所有成员。
4. 在家谱中添加新成员,并追加到文件中。
首先,输入一个新成员的名字;
然后,输入其双亲;
之后,再添加到整个存储二叉链表中。
然后,再将新的存储结构写回到文件中。
二叉链表的结点类型为:typedef struct node
elemtype data[10]; 存放成员的名字。
struct node *child; /其孩子指针。
struct node *brother; /其兄弟指针。
btnode;
5. 输出指定家庭的所有成员。
首先,设一个栈,并设一个标记位,先置1;
然后,找到输入的要待显示的成员,将标记位置0;
再次,显示其孩子和兄弟,依次下去直到显示完其所有的亲戚。
6. 退出本系统。
通过一个输入字符q来控制,每完成一个功能,系统提示是否要继续操作:
当q为“y”或者“y”时,显示菜单,程序继续执行;
当 q为其他字符时,程序执行结束,退出本系统。
三、详细设计:
通过一个do-while语句来控制各个模块的选择和实现。
1. 读出家谱并显示。
void display(btnode *b)
btnode *q[10定义一个栈。
int front,rear;
int k;
btnode *p;
p=b;k=0;
front=-1;rear=0;
q[rear]=p头结点先入栈。
while(front
if(p->brother!=null) /显示其兄弟。
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 layer(btnode *t,int m)
struct //定义一个新的结点类型,在孩子兄弟存储结构的基础上添加一个数据域存其所在层数。
qu[10];
int front,rear;
btnode *p;
p=t;k=0;
front=-1;rear=0;
qu[rear].q=p;
qu[rear].loc=1;
if( qu[rear].loc==m) /找到m辈的即输出。
printf("%c",p->data);
while(front
if(p->brother!=null)
4.在家谱中添加新成员,并追加到文件中。
void add(btnode *&b,elemtype y,elemtype x)
char filename[20]="
file *fp;
btnode *p,*q;
int i;
p=findnode(b,y);
q=(btnode *)malloc(sizeof(btnode));
for(i=0;x[i]!=0';i++)
q->data[i]=x[i];
q->data[i]='0';
q->child=q->brother=null;
if(p->child ==null)
p->child=q;
elsedisplay(b);
printf("向文件中读入新家谱");
printf(" input a filename:")
scanf("%s",&filename);
if((fp=fopen(filename,"w"))null)
elsedispbtnode(b,fp);
fclose (fp);
void dispbtnode(btnode *b,file *fp)
char a[10];
int i=0;
if(b!=null)
5.输出指定家庭的所有成员。
void dispfamily(btnode *b,elemtype x)
btnode *p;
btnode *q[maxsize];
int top=-1,tap=1;
if(b!=null)
top++;
q[top]=b;
while(top>-1)
if(p->child!=null)
if(p->brother!=null)
6.退出本系统。
此处通过一个输入字符q来控制,当q为“y”或者“y”时,显示菜单,程序继续执行,当 q为其他字符时,程序执行结束,退出本系统。此时q=‘n’。
四:调试分析。
1.首先,将已有家谱存储文件写在一个txt文档里,内容为:wuwu(wuchang(wuxin(wujia,wuhua),wuli))
输出结果为:
2.调试时遇到的问题:
1)当选择功能3(添加新成员),添加完成员后,写回文件时出现了错误,原本添加的为其中一个结点的孩子,结果写回文件时却成了该结点的孙子,也就是本是要添加为此结点的孩子的兄弟,结果却成了其孩子的孩子。最后经过单步跟踪发现写入文件的函数编写错误,缺少判断条件,经过修改后,此问题得到了解决。
数据结构课程设计报告
东莞理工学院城市学院。题目 二叉排序树 专业 计算机科学与技术 本 年级 2010级计算机科学与技术专业 1 班。个人姓名 何振江。指导教师 张娟老师 时间 2010至2011第二学期第18周 地点 实验楼615机房 东莞理工学院城市学院计算机与信息科学系制。2011年 6月。实习报告的内容。一 问...
数据结构课程设计报告
设计一个校园导游程序,为来访的客人提供信息查询服务。1 设计学校的校园平面图。选取若干个有代表性的景点抽象成一个无向带权图 无向网 以图中顶点表示校内各景点,边上的权值表示两景点之间的距离。2 存放景点代号 名称 简介等信息供用户查询。3 为来访客人提供图中任意景点相关信息的查询。4 为来访客人提供...
数据结构课程设计报告
河北科技大学。课程设计报告。学生姓名学号。专业班级。课程名称数据结构。学年学期 2 012 2 013学年第 2 学期指导教师 黄春茹。2 0 13年 6 月。课程设计成绩评定表。一 数据结构课程设计目标。二 问题描述。三 需求分析。四 概要设计。五 详细设计。六 软件说明书 给出软件如何使用,使用...