数据结构课程设计报告用二叉树实现家谱管理系统内容摘要:
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。数据结构课程设计报告用二叉树实现家谱管理系统
相关推荐
主探究 、 团结 协作、爱岗敬业的意识。 (四) 项目重点: G73 指令格式、编程方法及应用; 项目计划的制定、项目的实施。 (五) 项目难点: 学生综合运用知识来解决实际问题的能力。 分工合作完成整个项目。 零件加工中的创意与创新。 四 . 项目实施 (一) 项目实施计划与时间分配 项目 任务 知识、技能 学生活动 教师活动 学时 读 图 机械制图基本知识 、 机械制造技术 ;
发的非本所主管业务但要贯彻执行的文件材料 ,下级单位报送的总结、报告和统计报表等文件材料。 根据本所各职能部门管理工作实际 ,文书档案按问题归纳为六大类 :⑴ 综合管理类 , ⑵ 党群工作类 , ⑶ 人事教育类 , ⑷ 科研管理类 , ⑸ 基建资财类 , ⑹ 后 勤企业类。 六、文书档案整理要求 1.整理原则 39 归档文件整理应遵循文件形成规律,保持文件之间的有机联系,区分不同价值
12 { PR(\n\n\n\n\n\t\t 请输入要查询的货物名 :)。 /*按货物名查询数据 */ SC(%s,temp2)。 system(cls)。 for(i=0。 in。 i++) { if(strcmp(temp2,goods[i].name)==0) { PR(\n)。 PR(\n\t 货物编号 货物名 货物类别 货物数量 货物价格 )。 PR(\n\t %5ld %5s %5s
me)。 scanf(%d,amp。 [i].bn1)。 [i].bn2=0。 //将已借书数置 0 for(int j=1。 ji。 j++) if(strcmp([i].rno,[j].rno)==0amp。 amp。 strcmp([i].name,c[j].name)==0) {cout已有该读者的信息 ,请重新输入 !endl。 i=。 break。 } cout继续输入吗 ?y/n: