数据结构(二叉树)家谱管理系统 下载本文

1 需求分析

1.1任务与分析

1.建立输入文件以存放最刜家谱中各成员的信息。

2.成员的信息中均应包含以下内容: 姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡) 也可附加其它信息、但不是必需的。

3.能对修改后的家谱存盘以备以后使用。

4.能从文件中读出已有的家谱,形成树状关系。 5.家谱建立好之后,以图形方式显示出来。 6.显示第n 代所有人的信息。

7.按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。 8.按照出生日期查询成员名单。 9.输入两人姓名,确定其关系。 10.给某人添加孩子。

11.删除某人(若其还有后代,则一并删除)。 12.修改某人信息。 13.用括号法输出家谱成员信息

1.2测试数据

1 徐朝嬴 m 1938-1-20 1 彭代芳 0 此人相当的热心 0 2 3 4 5 10000

2 徐廷文 m 1964-8-3 2 李太群 1 此人相当有责任心 0 6 7 10000

3 徐素华 w 1966-4-6 2 李奉光 1 此人很好 0 10000

4 徐军华 m 1969-7-8 2 曲舞 1 此人很有正义感 0 10000

5 徐廷国 m 1972-9-2 2 木玛 1 此人心的很善良 0 10000

6 徐光勇 m 1989-1-27 3 Nomarry 2 此人很牛逼 0 10000

7 徐光超 m 1992-9-5 3 Nomarry 2 此人亦很牛逼 0 10000

2 概要设计

2.1 ADT描述 1.ADT Person{

数据对象:D={Pj | Pj={姓名、出生日期、婚否、地址、健在否(如过世,还应有其死亡日 期)},j=0,1,2,…… n,其中n>=0}

数据关系:R={} 基本操作: 无。 }ADT Person

2.ADT FamilytreeFile{

数据对象:D={Aj | Aj 属于 Person,j=1,2,3,……,n 其中n>=1} 数据关系:D 中每个对象用换行符隔开, R={ | Aj 属于D,j=1,2,3,……,n 其中n>=1,String 属于字符串类型,为 Aj 父亲姓名(若String=-1,Aj 无父亲,若String=Aj 的姓名,表示家谱文件结束)}

基本操作: 1. 打开家谱类型文件,并建立兄弟、孩子二叉树。 2. 从内存中读取兄弟、孩子二叉树,并建立家谱类型文件。 }

ADT FamilytreeFlie

3.ADT Familytree{

数据对象:D={Aj | Aj 属于Person,j=1,2,3,……,n 其中n>=0} 数据关系:V={ | Aj-1,Aj 属于D,j=2,3,……,n 其中n>=2,且Aj-1 与Aj 为祖先与 后 代关系(parent)、后代与祖先关系(child)、兄弟之间关系(sibling)}

基本操作: 1. 显示某人信息。 2. 修改某人信息。 3. 增加某人孩子。 4. 删除某人。 5. 通过某人查找其双亲、孩子、兄弟。

}ADT Familytree

2.2程序模块结构

2.2.1 结构体定义

struct People //定义结构体People {

int num;

char name[20]; char sex;

char borndate[15]; int generation; char matename[20]; int parent;

char infor[100]; LinkList child; };

struct Node //{

int a;

struct Node * next; };

struct LinkList //{

NodePoint La; };

struct Tree //{

PeoplePoint Tr; int Length;

int TREE_INIT_SIZE; };

定义结构体Node 定义链表 定义树

2.3 各功能模块

全部功能模块 查找功能模块 添加成员模块 修改婚姻信息 退出程序模块 新建家谱模块 读取家谱模块 保件存读家取谱文模件块读 输出成员模块 void PrintPeople(PeoplePovoid AddPeople(Tree &TR)void MarryChange(Tree TR,cExit(1) void InitTree(Tree &TR)void Open(Tree &TR); void Save(Tree TR); void PrintTree(Tree TR); void InitTree(Tree &TR); //在树已定义的情况下,初始化树TR

LinkList InitLinkList(void); //在什么都没有的情况下,初始化一个带头结点的链表并返回链表L

void AddLinkList(LinkList p); //对带头结点的链表pl,添加一个节点为m的节点在表头 void CreatFamilyTree(Tree &TR); //在什么都没有的情况下,创建一个家谱TR。并返回TR void PrintPeople(PeoplePoint p); // 已知某节点的指针p,输出people p 的相关信息

void PrintLinkList(LinkList p); //已知链表p,输出链表p中的信息

int CompareNum(PeoplePoint p,int num); //已知某节点的指针p和一个编号num,比较p的num和num,如果相等返回1,否则返回0

int CompareName(PeoplePoint p,char a[]);//已知某节点的指针p和一个姓名a,比较p的name,如果两者相等返回1,否则返回0 void TraveTreePrint(Tree TR); //已知树TR,按规定输出节点信息,根据编号、姓名、孩子输出

void AddPeople(Tree &TR); //已知树TR,当有人出生时,添加一个节点