- 152
- 0
- 约4.83千字
- 约 7页
- 2020-07-27 发布于江西
- 举报
家谱管理系统
姓名:田鑫磊
学号:1514020421
(1)功能部分:
本程序共实现了6个功能分别为:
读出家谱并显示
确定指定成员在家族中的辈份
输出指定辈的所有成员
在家谱中添加新成员,并追加到文件中
输出指定家庭的所有成员
6. 退出本系统
(2)各功能的算法思想:
读出家谱并显示
存储结构用栈,按照先显示双亲,然后显示其所有孩子的顺序显示所有的家庭成员。
确定指定成员在家族中的辈份
用求成员所在的二叉树中的层数(按层遍历二叉树)来确定,这里采用的是递归算法
输出指定辈的所有成员
此处定义了一个新的结构体类型(增加存储节点所在的层数),定义如下:
struct
{ BTNode *q;
int loc; //存结点所在的层数
}qu[10];
并用一个队列来比较显示同辈分的所有成员。
在家谱中添加新成员,并追加到文件中
首先,输入一个新成员的名字;
然后,输入其双亲;
之后,再添加到整个存储二叉链表中。
然后,再将新的存储结构写回到文件中。
二叉链表的结点类型为:typedef struct node
{
ElemType data[10]; //存放成员的名字
struct node *child; //其孩子指针
struct node *brother; //其兄弟指针
}BTNode;
输出指定家庭的所有成员
首先,设一个栈,并设一个标记位,先置1;
然后,找到输入的要待显示的成员,将标记位置0;
再次,显示其孩子和兄弟,依次下去直到显示完其所有的亲戚。
退出本系统
通过一个输入字符q来控制,每完成一个功能,系统提示是否要继续操作:
当q为“Y”或者“y”时,显示菜单,程序继续执行;
当 q为其他字符时,程序执行结束,退出本系统。
三、详细设计:
通过一个do-while语句来控制各个模块的选择和实现。
读出家谱并显示
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(frontrear)
{ 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;
}
}
}
确定指定成员在家族中的辈分
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 //定义一个新的结点类型,在孩子兄弟存储结构的基础上添加一个数据域存其所在层数
{
BTNode *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(f
原创力文档

文档评论(0)