数据结构课程设计报告用二叉树实现家谱管理系统内容摘要:

onalInfoDlg、 CRelationsDlg、 CSearchGenerationDlg 类实现用户窗口对于家谱的增加成员、按生日查找、初除 成员、文 件输入输出、修改成员信息、按名字查找、成员关系显示、按代数显示等各种操作。 纵上所示,本程序的两主要类为 CoperationFamilytree 类:所有对家谱的操作均由此类完成。 CFamilytreeDlg 类:所有对用户菜单命令的解释均由此类完成,然后调用 CoperationFamilytree 类的成员函数执行命令并显示结果。 四、重要函数分析 ,建立二叉树 int COperationFamilytree::ReadNode(FILE *fp, Person amp。 T,char* parentname) { //本函数从文件 fp 中读取信息到结点 T 中 ,并读取结点的父亲名字到字符数 组 parentname 中 //分别读取结点值 ,为 :姓名 ,出生日期 (年 ,月 ,日 ),婚否 ,地址 ,健在否 ,(如过世,还 有死亡日期 ) fscanf(fp,%s%d%d%d%d%s%d,T,amp。 T, amp。 T, amp。 T,amp。 T,T,amp。 T)。 if(T==0) fscanf(fp,%d%d%d,amp。 T,amp。 T, amp。 T)。 fscanf(fp,%s,parentname)。 if(!IsDateValid(T)) //出生日期合法性检查 return FILE_DATA_NOT_PRACTICAL。 if(T==0) //若过世 ,死亡日期合法性检查 if(!IsDateValid(T)) return FILE_DATA_NOT_PRACTICAL。 return OK。 } int COperationFamilytree::CreateFamilytree(CString filename) { //本函数建立一新家谱 DestroyFamilytree()。 //建立一新家谱之前,清空 原有家谱 FILE* fp。 if((fp=fopen(filename,r))==0) //打开文件 filename return READ_FILE_ERROR。 T=new PersonNode。 //定义根结点 if(!T) return NOT_ENOUGH_MEMORY。 Tchild=0。 Tsibling=0。 Tparent=0。 Person parentT, temp。 //定义两个临时结点 char parentname[MAX_CHARNUM]。 //定义一个临时字符串 数组 //读取根结点值 ,(姓名 ,出生日期 (年 ,月 ,日 ),婚否 ,地址 ,健在否 ,(如过世,还 有死 亡日期 )) int result。 result=ReadNode(fp,T,parentname)。 if(result==FILE_DATA_NOT_PRACTICAL){ delete T。 //若不合法,初除申请的堆空间 T=0。 return result。 } if(strcmp(T,parentname)==0){ //根结点名字与其父亲名字 相同,说明为空树 delete T。 T=0。 return PEDIGREE_EMPTY。 } temp=new PersonNode。 //申请一结点 if(!temp){ //申请失败 DestroyFamilytree()。 //释放申请空间 return NOT_ENOUGH_MEMORY。 } result=ReadNode(fp,temp,parentname)。 while(strcmp(temp,parentname)amp。 amp。 strcmp(temp,e nd)){ //读取信息结束的条件是两个人的名字同为 end if(result==FILE_DATA_NOT_PRACTICAL){ //若数据不合法,释放已 申请空间,然后返回 delete temp。 DestroyFamilytree()。 return result。 } parentT=0。 Find(T,parentT,parentname)。 //找到 parentname 所在结 点 parentT if(parentT){ // 如果 parentT 存在, 说明 parentname 在家谱中 //并且 parentname 为 temp 的父 亲 int cmp。 cmp=CompareDate(temp,parentT)。 if(cmp0){ //若孩子出生日期比父亲大,则 不对 delete temp。 DestroyFamilytree()。 return FILE_DATA_NOT_PRACTICAL。 } tempchild=tempsibling=0。 tempparent=parentT。 //temp 的父指针指向 parentT。 if(parentTchild){ //parentname 已经有孩子 InsertSibling(parentTchild,temp)。 }//if else //parentname 无孩子 ,则 temp 应为 parentTchild=temp。 //parentname 的第一个孩子 }//if else{ //parentT 不存在 ,说明家谱中不 存在 parentname 此人 DestroyFamilytree()。 //返回出错信息 return FILE_DATA_ERROR。 } temp=new PersonNode。 //申请一结点 if(!temp){ //申请 失败 DestroyFamilytree()。 //释放申请空间 return NOT_ENOUGH_MEMORY。 } result=ReadNode(fp,temp,parentname)。 //继续读取数据 }//while if(temp) delete temp。 fclose(fp)。 return OK。 } 2.由兄弟、孩子二叉树生成家谱文件 void SaveNode(FILE *fp, Person amp。 pNode) { //本函数向文件 fp 中存取一结点 pNode cha。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。