数据结构课程设计(家族关系查询系统) 联系客服

发布时间 : 星期日 文章数据结构课程设计(家族关系查询系统)更新完毕开始阅读a21a23a7afaad1f34693daef5ef7ba0d4b736d43

家族关系查询系统

加到所有孩子之后*/ } else /* 没有孩子则直接添加*/ tpar->lchild=temp; fp=fopen(fname,\); /* 以写入方式打开文件*/ if(fp) { while(strcmp(par,family[i])!=0&&family[i][0]!='#') { if(family[i][0]!='@') /* 查找双亲在数组中位置*/ parpos++; /* parpos计数*/ i++; /* family数组行下标后移*/ } i=0; /* family数组行下标归*/ while(family[i][0]!='#') { if(family[i][0]=='@') /* 查找“@”的个数,第一个不计*/ count++; /* count累加个数*/ if(count==parpos) /* 说明此“@”与其前一个“@”之前为par的孩子*/ curpos=i; /* curpos计当前位置*/ i++; /* family数组行下标后移*/ } if(count

13

家族关系查询系统

{ for(j=i;j>=curpos;j--) /* 当前位置到数组最后的全部信息后移一行*/ strcpy(family[j+1],family[j]); strcpy(family[curpos],chi); /* 将新结点存储到“@”的前一行*/ } if(end==1) /* 若end为,则数组末尾下标后移num位*/ i=i+num; for(j=0;j<=i+1;j++) /* 将数组所有信息写入文件*/ { fputs(family[j],fp); fputc('\\n',fp); /* 一个信息存一行*/ } fclose(fp); /* 关闭文件*/ printf(\添加新成员成功!\\n\); } else printf(\添加新成员失败!\\n\); } }

2.6 家族成员关系的相关查询

2.6.1 查找一个家族的鼻祖

判断输入的姓名是否在该家族中存在,如果存在,则返回该家族的根节点信息。

/* 查找一个家族的祖先*/

void Ancesstor(TriTree *t) /* 返回树的根结点信息*/ {

printf(\该家族的祖先为%s\\n\,t->data); }

14

家族关系查询系统

2.6.2 查找一个成员的所有祖先路径

查找一个成员的所有祖先路径,需要从它的双亲一直向上查找到根结点。

基本思想:对与结点t,先判断它是否是根结点(根节点的双亲是NULL),如果是根结点,直接输出它本身;如果不是,查找它的双亲指针指向的结点,将双亲信息输出。继续查找,直到找到根结点。

/* 查找一个成员的所有祖先*/ void AncesstorPath(TriTree *t) {

if(t->parent==NULL) /* 若该成员为祖先,则直接输出*/ printf(\无祖先!\\n\,t->data);

else /* 否则继续查找祖先*/ { printf(\所有祖先路径:%s\,t->data,t->data); while(t->parent!=NULL)/* 若当前成员的双亲不是祖先,则继续查找*/ { printf(\,t->parent->data); /* 访问当前成员的双亲*/ t=t->parent; /* 继续循环查找*/ } printf(\); } }

2.6.3 查找一个成员的双亲

基本思想:先判断结点t是否是根结点,过不是根结点,

直接输出该结点双亲指针的结点信息;若是根结点,输出提示信息,结点无双亲。

15

家族关系查询系统

/* 查找一个成员的双亲*/ void Parent(TriTree *t) {

if(t->parent!=NULL) /* 若该成员为祖先,则无双亲*/ printf(\的双亲为%s\\n\,t->data,t->parent->data); else printf(\无双亲!\\n\,t->data); }

2.6.4 确定一个成员是第几代

确定一个成员是第几代,只要知道从它本身到根结点包括的祖先个数就可。因而对于跟结点t,从它本身开始一直向上查找到根结点,查找的过程中用变量count(初值为1)计数,最后输出 count。

/* 确定一个成员是第几代*/ void Generation(TriTree *t) {

int count=1; /* 计数*/ DataType str[MAXNUM];

strcpy(str,t->data); /* 存储当前信息*/ while(t->parent!=NULL)/* 查找其双亲*/ {

count++; /* 累加计数*/ t=t->parent; }

printf(\是第%d 代!\\n\,str,count); }

2.6.5 查找一个成员的兄弟

一个成员的为其双亲除了该成员以外的所有孩子。 基本思想:对于结点t,先判断它是否是跟结点,若是根结点,则无兄弟;若不是根结点,则找到结点t的双亲。接着判断双亲的左孩子和左孩子的兄弟是否都存在(若只有左孩子,左孩子就是要查找的这个成员),如果都不存在,则无兄弟;如果

16