数据结构课程设计(家族关系查询系统) 下载本文

家族关系查询系统

都存在,对双亲的左孩子操作。若左孩子不是要查找的这个成员,则将结点信息输出。接下来查找左孩子的右兄弟,判断当前结点是否是要查找的这个成员,若不是,则将结点信息输出,继续查找当前结点的右兄弟,直到NULL为止。

/* 查找一个成员的兄弟*/

void Brothers(TriTree *t,DataType str[]) /* 查找兄弟*/ {

if(t->parent!=NULL) /* 若该结点是祖先,则无兄弟*/ { t=t->parent; /* 该结点的兄弟即为其双亲除该成员以外的所有孩子*/ if(t->lchild&&t->lchild->rchild) /* 当前结点的左孩子及其右孩子都存在*/ { printf(\的所有兄弟有:\,str); t=t->lchild; while(t) /* 遍历当前成员左孩子的右子树*/ { if(strcmp(t->data,str)!=0) /* 遍历右子树,选择输出*/ printf(\ \,t->data); /* 访问当前结点*/ t=t->rchild; } printf(\); } else printf(\无兄弟!\\n\,str); } else printf(\无兄弟!\\n\,str); }

2.6.6 查找一个成员的堂兄弟

一个成员的堂兄弟为其双亲的双亲结点的所有孩子的孩子(该成员除外).

17

家族关系查询系统

基本思想:如果结点t的双亲和双亲的双亲(爷爷)都存在,首先考虑爷爷的左孩子。如果爷爷的左孩子不是结点t的双亲,那么爷爷还有其他孩子。现对爷爷的左孩子的左孩子访问,如果不是结点t就输出。同样,对爷爷左孩子的左孩子的右孩子、右孩子的右孩子一直访问下去,直到无右孩子为止。如果爷爷还有其他孩子,那么就对爷爷的左孩子的右孩子、爷爷的左孩子的右孩子的右孩子------即对爷爷的其他孩子做相同的处理。

/* 查找一个成员的堂兄弟*/ void Consin(TriTree *t) {

int flag=0; TriTree *ch=t; TriTree *temp;

if(t->parent&&t->parent->parent)/* 当前结点的双亲及其双亲都存在*/ { t=t->parent->parent->lchild;/* 当前结点等于其祖先的第一个孩子*/ while(t) /* 存在则继续查找*/ { if(strcmp(t->data,ch->parent->data)!=0)/* 不是同一结点*/ { if(t->lchild) /* 当前结点存在左孩子*/ { temp=t->lchild; while(temp) /* 遍历当前结点左孩子的右子树*/ { if(strcmp(temp->data,ch->data)!=0) { if(!flag) /* 第一次输入时先输出下句*/ printf(\的所有堂兄弟有:\,ch->data); printf(\ \,temp->data);/* 访问当

18

家族关系查询系统

前成员*/ flag=1; } temp=temp->rchild; /* 继续遍历右孩子*/ } } } t=t->rchild; /* 继续遍历右孩子*/ } printf(\); }

if(!flag) /* 标志没有输出结点*/ printf(\无堂兄弟!\\n\,ch->data); }

2.6.7 查找一个成员的所有孩子

一个成员的所有孩子包括左孩子和左孩子的右孩子、左孩子的右孩子的右孩子----直到右孩子为空为止。

基本思想:首先判断结点t是否有左孩子,如果没有,输出没有孩子;如果有左孩子,输出左孩子的信息,然后判断左孩子的右孩子是否为空,若不为空(存在右孩子),输出左孩子的右孩子的信息,接着循环判断结点是否有右孩子,有就输出,直到右孩子为空。

/* 查找一个成员的所有孩子*/

void Children(TriTree *t) /* 遍历左孩子*/ {

if(t->lchild) /* 当前结点存在左孩子*/ { printf(\的所有孩子有:\,t->data); t=t->lchild; /* 遍历当前成员左孩子的右子树*/ while(t) /* 不空*/ { printf(\ \,t->data);/* 访问当前成员*/ t=t->rchild; }

19

家族关系查询系统

printf(\); } else printf(\无孩子!\\n\,t->data); }

/* 中序遍历一棵树*/

void InOrder(TriTree *t) {

if(t) /* 二叉树存在*/ { InOrder(t->lchild); /* 中序遍历左子树*/ printf(\ \,t->data);/* 访问成员*/ InOrder(t->rchild); /* 中序遍历右子树*/ } }

2.6.8 查找一个成员的子孙后代

一个成员的子孙后代就是其左子树上的所有结点,所以对其左子树进行中序遍历即可。

/* 查找一个成员的子孙后代*/

void Descendants(TriTree *t) /* 遍历左孩子*/ {

if(t->lchild) /* 当前结点存在左孩子*/ { printf(\的所有子孙后代有:\,t->data); InOrder(t->lchild); /* 中序遍历当前结点的左右子树*/ printf(\); } else printf(\无后代!\\n\,t->data); }

2.7 各软件之间的调用方式

该软件各个模块的调用主要是通过声明函数,和定义函数

20