武汉工商学院信息工程学院项目名称:家谱管理系统学生姓名:周光波学号:14401034班级:14计科本1指导教师:刘莹2015年6月23日目录1引言...............................................................................................................................................12系统需求分析...............................................................................................................................22.1系统功能概述....................................................................................................................22.2系统模块............................................................................................................................23系统存储结构说明.......................................................................................................................33.1系统存储信息说明............................................................................................................33.2系统存储结构设计............................................................................................................34系统功能设计及实现...................................................................................................................44.1输入家庭成员信息............................................................................................................44.2输出所有成员....................................................................................................................44.3查找某人的所有孩子........................................................................................................54.4查找某人的双亲................................................................................................................64.5查找某人的所有祖先........................................................................................................74.6查找某人的所有兄弟........................................................................................................85系统测试........................................................................................................................................95.1主菜单................................................................................................................................95.2录入家庭成员信息............................................................................................................95.3输出家谱中的所有成员....................................................................................................95.4查找相应的家族成员......................................................................................................106体会............................................................................................................................................13参考文献.........................................................................................................................................14附录:代码.....................................................................................................................................15数据结构课程设计11引言树形结构是区别于线性结构的另一大类数据结构,它具有分支性和层次性,在计算机科学的许多领域和日程生活中都具有十分广泛的应用,是数据表示、信息组织和程序设计的基础和有力工具,下面我们将通过树与二叉树的转换来制作家谱管理系统。数据结构课程设计22系统需求分析2.1系统功能概述家谱管理系统将树形结构转换为二叉树结构,通过二叉树链表储存家谱信息,需要初始录入家谱信息,然后即可显示出全面的人员关系,还可查找某人的双亲、孩子、祖先、兄弟。充分利用二叉树的方便性和简洁性。2.2系统模块家谱管理系统录入家庭信息输出所有家庭成员查找某人的所有孩子查找某人的双亲查找某人的祖先查找某人的所有兄弟退出图2-1系统功能模块图(1)录入家庭信息模块用来初次输入家庭成员姓名,按照提示的亲缘关系来输入相应的人的姓名,没有对应的成员就会提示输入#,输入的家庭成员信息将保存在二叉树链表中,输入完所有信息后将返回主菜单,让用户选择下一步操作。(2)输出所有家庭成员进入此功能后会将家谱姓名按代数关系和亲子关系罗列出来,方便用户全面观察整个家谱。(3)查找相应的家庭成员进入要查找的成员类型,按提示输入成员姓名,查找到对应亲属会罗列出来,如果没查找到会有相应的提示,然后返回主菜单。如果没有用户输入的那个人,将提示输入错误,返回主菜单。数据结构课程设计33系统存储结构说明3.1系统存储信息说明系统采用二叉链表来保存家庭成员姓名信息。将树形成员关系转化为二叉树结构保存。用队列辅助暂时储存一些家庭成员。3.2系统存储结构设计typedefchardatatype;typedefstructnode{//定义二叉树结构datatypedata[10];structnode*lchild,*rchild;}bintnode;typedefbintnode*bintree;//定义二叉树指针typedefstruct{//队列定义bintreea[MAXSIZE];intfront;intrear;intn;//队列元素个数intdepth;//家谱代数}queue;数据结构课程设计44系统功能设计及实现4.1输入家庭成员信息先在调用此函数前给出提示先输入根节点,保存在变量ch中,然后在函数中输入姓名,如果姓名为#则执行t=NULL,否则建立空节点t,将ch的值赋给t-data,然后提示输入ch的孩子,并执行t-lchild=input()来递归调用此函数,调用完成后下一步操作为给出提示输入ch的兄弟,并执行t-rchild=input()来递归调用,调用完成后就完成了else语句,最后返回节点指针t。输入姓名chch==#?t=NULL建立新节点tt-data=ch提示输入ch的孩子开始t-lchild=input()提示输入ch的兄弟t-rchild=input()returntYN图4-1录入家谱成员信息4.2输出所有成员先输出提示显示出下面输出的是第一代人,然后调用postorder()函数输出第一代的成员,并将它们入队,然后定义两个控制循环的变量i,然后进入for(intx=2;x=sq-depth;x++)循环中,循环完成后结束函数,循环中先输出格式划分语句“第x代”,然后让i=sq-n,再进入while(i!=0)循环,循环结束回到for循环中,循环中先定义一个节点指针变量a并初始化为出队节点,判断a-lchild是否存在,存在就调用postorder()函数输出a节点的所有孩子,并将这些孩子入队,判断完成后让i--。数据结构课程设计5输出提示“第一代”调用postorder()函数输出第一代所有成员inti,x=2;x=sq-depth?输出提示“第x代”i=sq-ni!=0?x++bintreea=get(sq)a-lchild!=0?调用postorder()函数输出a-data的孩子i++结束NYNYYN开始图4-2输出全部家谱成员4.3查找某人的所有孩子先判断节点t是否存在,如果存在再判断t-data是否等于x,等于的话判断t-lchild是否为空,空的话输出“没有孩子”,不为空就调用getbrother(t-lchild,x)函数输出所有孩子。如果t-data!=x就递归调用遍历左指针和右指针。根节点不存在就结束函数。数据结构课程设计6t!=0?t-data==x?t-lchild==NULL?输出t-data没有孩子调用getbrother(t-lchild,x)输出所有的孩子getchild(t-lchild,x)getchild(t-rchild,x)结束结束NYYYNN开始图4-3查找孩子4.4查找某人的双亲先判断根节点是否存在,不存在就函数结束,存在就再判断t-data==x?满足条件就m=NULL,否则判断t-lchild!=NULL&&strcmp(t-lchild-data,x)==0满足条件就m=t,否则就再判断t-rchild!=NULL&&strcmp(t-rchild-data,x)