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