
数据结构课程设计(家族关系查询系统).doc
28页家族关系查询系统1 课程设计介绍 1.1课程设计项目简介 家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书载体家谱是中国特有的文化遗产,是中华民族的三大文献之一,属珍贵的人文资料,对于历史学,民俗学,人口学,社会学和经济学的深入研究,均有不可替代的重要功能本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息 、插入家族成员等功能 1.2课设题目分析本程序的实质是完成对家谱成员信息的建立、查找、插入等功能可以首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果本程序包含以下几个模块(1) 建立家族关系树此模块将构建一个家族关系,对数据初始化,构造关系树并录入数据一遍后续程序使用2) 添加新成员此模块将添加一个新成员,实现对家族关系的修改3) 家族关系的查询此模块将实现对家族不同关系的查询(4) 主程序模块此模块实现整个程序的进入和进出,以及各种初始化处理5)1.3课程题目原理与数据结构 因为家族的成员之间存在一个对多个的层次结构关系,所以不能用线性表来表示和实现家谱从形状上看像一颗倒长的树,所以用树结构来表示比较合适。
树形结构是一类非常重要的非线性数据结构,直观看来树是以分支关系定义的层次结构 因此本课程设计可以采用的数据结构有树状结构和队列树状结构采用三叉链表来实现,队列采用链式队列实现1.4功能分析说明图家族关系查询系统退出系统打开一个家族关系按关系查找各个家庭成员建立一个家族关系添加一个家庭成员 查找一个成员的兄弟查找一个成员的祖先查找成员的子孙后代查找一个成员的孩子查找成员的堂兄弟查找成员祖先路径查找成员是第几代查找一个成员双亲2 分析与实现 2.1 基本数据结构和栈队的操作2.1.1 结点基本数据结构和链队的定义/*家族关系树实现*/#include
字符数组family是全局变量,存储临时信息 . 注意,输入时每个结点信息占一行,一个结点有多个兄弟,以“@”作为兄弟结束标志,结点若无孩子,直接以“@”代替依次输入各节点信息,以“#” 作为结束标志最后使用函数CreateTriTree建立家族关系树.lixianliguoyu liguojun liguoqiangliyongzhi liyongrui liyongmingliwende liwenjia TriTree *Create(DataType familyname[MAXNUM])/* 建立家族关系并存入文件*/{ int i=0; /* i控制family数组下标*/ DataType ch,str[MAXNUM]; /* ch存储输入的y或n,str存储输入的字符串*/ TriTree *t; FILE *fp; strcpy(fname,familyname); /* 以家族名为文本文件名存储*/ strcat(fname,".txt"); fp=fopen(fname,"r"); /* 以读取方式打开文件*/ if(fp) /* 文件已存在*/ { fclose(fp); printf("%s 的家族关系已存在!重新建立请按“Y”,直接打开请按“N”\n",familyname); ch=getchar(); getchar(); /* 接收回车*/ if(ch=='N'||ch=='n') { t=Open(familyname);/* 直接打开*/ return t; } } if(!fp||ch=='Y'||ch=='y') /* 重新建立,执行以下操作*/ { fp=fopen(fname,"w"); /* 以写入方式打开文件,不存在则新建*/ printf("请按层次输入结点,每个结点信息占一行\n"); printf("兄弟输入结束以“@”为标志,结束标志为“#”\n. "); gets(str); fputs(str,fp); fputc('\n',fp); strcpy(family[i],str); /* 将成员信息存储到字符数组中*/ i++; /* family数组下标后移*/ while(str[0]!='#') { printf(". "); /* 以点提示符提示继续输入*/ gets(str); fputs(str,fp); /* 写到文件中,每个信息占一行*/ fputc('\n',fp); strcpy(family[i],str);/* 将成员信息存储到字符数组中*/ i++; /* family数组下标后移*/ } fclose(fp); /* 关闭文件*/ t=TriTreeCreate(); /* 根据family数组信息创建三叉树*/ printf("家族关系已成功建立!\n"); return t; /* 返回树*/ }}2.2.2建立家族关系树基本思想:采用指针数组作为指针,保存输入的结点地址。
队列的尾指针指向当前结点头指针指向当前结点的双亲结点输入的结点信息已存储在字符数组family中将信息复制到字符串数组“ch”中 ,如果"ch"不是“@”,则建立一个新结点若新结点是第一个结点,则它是根结点,将其入队,指针tree指向这个根节点;如果不是根结点,则将当前结点链接到双亲结点上,即当前结点的双亲指针就是队头元素,然后将当前结点入队列接着判断flag的值,如果flag=0,表示当前结点没有左孩子,那么当前结点就是双亲的左孩子否则,当前结点就是双亲的右孩子用指针root指向刚刚入队的结点继续复制数组family的下个元素如果“ch” 是@则flag=0(因为。
