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

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

家族关系查询系统

root->parent=NULL; root->lchild=NULL; root->rchild=NULL; LQueueEnQueue(q,root); /* 将root存入队列*/ tree=root; } else /* 不为空树*/ { t=(TriTree *)malloc(sizeof(TriTree)); /* 申请空间*/ strcpy(t->data,str); t->lchild=NULL; t->rchild=NULL; t->parent=LQueueGetFront(q); /* 当前结点的双亲为队头元素*/ LQueueEnQueue(q,t); /* 入队*/ if(!flag) /* flag为,当前结点没有左孩子*/ root->lchild=t; else /* flag为,当前结点已有左孩子*/ root->rchild=t; root=t; /* root指向新的结点t */ } flag=1; /* 标记当前结点已有左孩子*/ strcpy(str,family[i]); i++; } if(start!=0) /* 标记不是第一次出现“@”*/ { LQueueDeQueue(q,x); /* 出队*/ if(q->front!=NULL) root=LQueueGetFront(q);/* root为队头元素*/ } start=1; /* 标记已出现过“@”*/ flag=0; /* “@”后面的结点一定为左孩子*/ strcpy(str,family[i]);

9

家族关系查询系统

i++; }

return tree; /* 返回树*/ }

2.3打开一个家族关系

首先输入家族关系名,以家族名为文件名打开文件,如果家族关系不存在,返回空;如果存在,文件打开,读取文件。将文件的每行信息依次存储在数组family【】中。 /* 打开一个家族关系*/

TriTree *Open(DataType familyname[MAXNUM]) {

int i=0,j=0; DataType ch; FILE *fp; TriTree *t;

strcpy(fname,familyname); /* 以家族名为文本文件名存储*/ strcat(fname,\);

fp=fopen(fname,\); /* 以读取方式打开文件*/ if(fp==NULL) /* 文件不存在*/ { printf(\的家族关系不存在!\\n\,familyname); return NULL; } else { ch=fgetc(fp); /* 按字符读取文件*/ while(ch!=EOF) /* 读到文件尾结束*/ { if(ch!='\\n') /* ch不为一个结点信息的结尾*/ { family[i][j]=ch; /* 将文件信息存储到family数组中*/ j++; } else {

10

家族关系查询系统

}

}

family[i][j]='\\0'; /* 字符串结束标志*/ i++; /* family数组行下标后移*/ j=0; /* family数组列下标归零*/ } ch=fgetc(fp); /* 继续读取文件信息*/ }

fclose(fp); /* 关闭文件*/

t=TriTreeCreate(family); /* 调用函数建立三叉链表*/ printf(\家族关系已成功打开!\\n\); return t;

2.4在家族关系中查找一个成员是否存在

用递归算法实现。如果树空,返回NULL。如果根节点就是要查找的成员,返回根节点;否则,递归查找它的左右子树。

/* 查找一个成员是否存在*/

TriTree *Search(TriTree *t,DataType str[]) {

TriTree *temp;

if(t==NULL) /* 如果树空则返回NULL */ return NULL;

else if(strcmp(t->data,str)==0) /* 如果找到返回该成员指针*/ return t;

else /* 如果没找到遍历左右子树进行查找*/ { temp=Search(t->lchild,str); /* 递归查找*/ if(temp) /* 结点不空则查找*/ return(Search(t->lchild,str)); else return(Search(t->rchild,str)); } }

2.5 向家族中添加一个新成员

11

家族关系查询系统

基本思想:添加的新成员要根据其双亲确定其在家族中的位置。首先判断该双亲是否在此家族关系中,若存在则查找其双亲,将新结点插入其双亲的最后一个孩子之后;若没有孩子,则直接作为左孩子插入。以写入的方式打开文件,如果成功打开,则更新family数组中的信息,并查找新成员的双亲所在位置和其对应的“@”个数,如果“@”个数小于双亲位置,则添加“@”实质相等,新成员不插入到最后“@”之前。最后将family数组中信息写入文件保存,关闭文件。

/* 添加一个新成员*/ void Append(TriTree *t) {

int i=0,j,parpos=1,curpos,num,end=0,count=-1;

DataType chi[MAXNUM],par[MAXNUM];/* 存储输入的孩子和其双亲结点*/

TriTree *tpar,*temp; FILE *fp;

printf(\请输入要添加的成员和其父亲,以回车分隔!\\n. \); gets(chi);

printf(\); /* 以点提示符提示继续输入*/ gets(par);

tpar=Search(t,par); /* 查找双亲结点是否存在*/ if(!tpar) printf(\该成员不存在!\\n\);

else /* 存在则添加其孩子*/ { temp=(TriTree *)malloc(sizeof(TriTree));/* 申请空间*/ temp->parent=tpar; strcpy(temp->data,chi); temp->lchild=NULL; /* 新结点左右孩子置空*/ temp->rchild=NULL; if(tpar->lchild) /* 成员存在左孩子*/ { tpar=tpar->lchild; /* 遍历当前成员左孩子的右子树*/ while(tpar->rchild) /* 当前结点右孩子存在*/ tpar=tpar->rchild; /* 继续遍历右孩子*/ tpar->rchild=temp; /* 将新结点添

12