数据结构家谱课程设计报告

发布 2022-10-05 19:41:28 阅读 3554

家谱(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 月。课程设计成绩评定表。一 数据结构课程设计目标。二 问题描述。三 需求分析。四 概要设计。五 详细设计。六 软件说明书 给出软件如何使用,使用...