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

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

家谱管理系统

姓名:田鑫磊

学号:1514020421

(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

{ 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 //定义一个新的结点类型,在孩子兄弟存储结构的基础上添加一个数据域存其所在层数

{

B TNode *q;

int loc;

}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

{ 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[])

{

char filename[20]=" ";

FILE *fp;

BTNode *p,*q;

int i;

相关文档
最新文档