个字符串,以回车键结束。打开一个家族关系。在界面输入选项名,以家族关系名为文件名打开文件,如果家族关系不存在,返回空;如果存在,打开文件,读取文件。向家族中添加一个新成员,添加的新成员要根据其父亲确定其在家族中的位置。首先判断该父亲是否在此家族关系中,若存在,则查找其父亲,将新节点插入其父亲的最后一个孩子之后;若没有孩子,直接作为左孩子插入。以写入的方式打开文件,更新数组中的信息,然后将数组中的信息写入文件保存,关闭文件。查找功能模块,查找一个成员的所有祖先及其兄弟,查找一个成员的所有祖先路径,需要从它的父亲一直向上查找带根结点。查找一个成员的兄弟,一个成员的兄弟为其父亲除了该结点以外的所有孩子。对于要操作的结点,先判断它是否是根结点,若是根结点,则无兄弟;若不是根结点,则找到该结点的父亲。接着判断父亲的兄弟是否都存在,如果都不存在,则无兄弟;如果都存在,对父亲的孩子操作。
六、源代码
#include
typedefint status; typedefstructBiTPNode{ TElemTypedata[10];
structBiTPNode *parent,*lchild,*rchild; //父亲及左右孩子指针
}BiTPNode,*BiPTree; BiPTree P; BiPTree T;
//家谱的创建 intCre() {
system(\
FILE *fp; //声明指向文件的指针 char filename[40],str[10]; printf(\请输入家谱名称:\ getchar();
gets(filename); //输入家谱名称 while(filename[0]==NULL) {
printf(\家谱名不能为空,请重新输入:\ gets(filename);
}
if((fp=fopen(filename,\ {
printf(\家谱创建失败!\\n\ return 0; }
printf(\请输入家谱内容:\\n\ while (strlen(gets(str))>0) {
fputs(str,fp); //向文件写入字符串 putc('\\n',fp); }
fclose(fp); //关闭文件 printf(\按任一键继续!\ getch(); return 1; }
statusloc(BiPTreeT,BiPTree&P,TElemType name[10]){ if(T)
{
P=T; //字符串的比较
if(!strcmp(name,T->data)) return 1; if(loc(T->lchild,P,name)) return 1; if(loc(T->rchild,P,name)) return 1; }
else }
//构造二叉树
statusinittree(BiPTree&T){
T=(BiTPNode *)malloc(sizeof(BiTPNode)); if(T)
return 0;
return 0;
T->lchild=NULL; T->rchild=NULL; T->parent=NULL; return 1; }
//载入家谱
statusCrt(BiPTree&T){ FILE *fp; BiPTree Q,R,M,N;
char filename[40],name[10]; system(\清屏
R=(BiTPNode *)malloc(sizeof(BiTPNode)); //分配存储空间
M=(BiTPNode *)malloc(sizeof(BiTPNode)); N=(BiTPNode *)malloc(sizeof(BiTPNode)); printf(\请输入家谱名:\ getchar(); gets(filename);
while(filename[0]==NULL) {
printf(\家谱名不能为空,请重新输入:\ gets(filename); }
if((fp=fopen(filename,\ {
printf(\家谱打开失败!\\n\