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

  • 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)

1亿VIP精品文档

相关文档