fp=fopen(filename,"w"))==0) // 打开文件 filename return WRITE_FILE_ERROR; PreOrderTraverse(fp,T,SaveNode); // 从根结点开始存储家谱数据// 置家谱数据结束标记( 一结点的名字与其父结点的名字同为 end) fprintf(fp,"%s %d %d %d %d %s %d %s","end",1999,12, 2,1,"end",1,"end"); fclose(fp); return OK; } void COperationFamilytree::PreOrderTraverse(FILE* fp,Person &T, void (__cdecl *Visit)(FILE* fp,Person &)) { // 本函数把所有以 T 结点为根结点的结点值存到文件 fp中 if(T){ (*Visit)(fp,T); PreOrderTraverse(fp,T->child,Visit); PreOrderTraverse(fp,T->sibling,Visit); }} 3 .按照姓名、出生日期查找家谱成员 void COperationFamilytree::Find(Person& T,Person& Tname,char* name) { // 本函数以 T 为根结点开始, 搜索结点信息中名字等于 name 的结点 if(T){ //如果 T存在 if(strcmp(T->info.name,name)==0) //T 结点姓名和 name 相同,把 T结点指针传给 Tname Tname=T; else{ Find(T->sibling,Tname,name); //对T 的兄弟递归搜索 Find(T->child,Tname,name); //对T 的孩子递归搜索