数据结构家谱课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 ;