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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

家谱(3-1)

一、题目要求

基本要求:

从文件中读入家庭成员建立家谱,以孩子兄弟表示法存储。基本功能:

家谱管理,如:

(1)在家谱中添加新成员,并追加到文件中。

(2)输出指定家庭的所有成员。

(3)确定指定成员在家族中的辈份(第几代)。

等等。

二.概要设计

(1)功能部分:

本程序共实现了6个功能分别为:

1.读出家谱并显示

2.确定指定成员在家族中的辈份

3.输出指定辈的所有成员

4.在家谱中添加新成员,并追加到文件中

5.输出指定家庭的所有成员

6.退出本系统

(2)各功能的算法思想:

1.读出家谱并显示

存储结构用栈,按照先显示双亲,然后显示其所有孩子的顺序显示所有的家庭成员。

2.确定指定成员在家族中的辈份

用求成员所在的二叉树中的层数(按层遍历二叉树)来确定,这里采用的是递归算法

3.输出指定辈的所有成员

此处定义了一个新的结构体类型(增加存储节点所在的层数),定义如下:

struct

{BTNode *q;

intloc;//存结点所在的层数

}qu[10];

并用一个队列来比较显示同辈分的所有成员。

4.在家谱中添加新成员,并追加到文件中

首先,输入一个新成员的名字;

然后,输入其双亲;

之后,再添加到整个存储二叉链表中。

然后,再将新的存储结构写回到文件中。

二叉链表的结点类型为:

typedefstruct node{ElemType data[10];//存放成员的名字

struct node *child;//其孩子指针

struct node *brother;//其兄弟指针

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

p=q[front];

printf("%s",p->data ); //头结点出栈,并显示

printf("(");

disbr(p->child);

printf(")\n");

if(p->child!=NULL) //显示其孩子

{rear++;q[rear]=p->child;}if(p->brother!=NULL) //显示其兄弟{rear++;q[rear]=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 layer(BTNode *t,int m)

{ struct //定义一个新的结点类型,在孩子兄弟存储结构的基础上添加一个数据域存其所在层数{int loc;

}qu[10];

BTNode *q;

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

{ front++;

p=qu[front].q;

if(p->child!=NULL){rear++;qu[rear].q=p->child;

qu[rear].loc=qu[front].loc+1;

if(m== qu[rear].loc)

printf("%s

",p->child->data);}if(p->brother!=NULL){rear++;qu[rear].q=p->brother;

qu[rear].loc=qu[front].loc;

if( qu[rear].loc==m)

printf("%s ",p->brother->data);}}}

4.在家谱中添加新成员,并追加到文件中

void add(BTNode *&b,ElemType y[],ElemType x[]){} void DispBTNode(BTNode *b,FILE *fp){char a[10]; int i=0;

if(b!=NULL){while(b->data[i]!='\0'){a[i]=b->data[i]; i++;

char filename[20]=" ";

FILE *fp;

BTNode *p,*q;

int i;

p=FindNode(b,y);

q=(BTNode *)malloc(sizeof(BTNode));

else

{ p=p->child;}printf("向文件中读入新家谱\n"); scanf("%s",&filename);

if((fp=fopen(filename,"w"))==NULL)

else

fclose (fp);while(p->brother!=NULL)

p=p->brother ;

相关文档
最新文档