家族关系查询系统
1 课程设计介绍
1.1课程设计项目简介
家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世
系繁衍和重要人物事迹的特殊图书载体。家谱是中国特有的文化遗产,是中华民族的三大文献之一,属珍贵的人文资料,对于历史学,民俗学,人口学,社会学和经济学的深入研究,均有不可替代的重要功能。本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息 、插入家族成员等功能。
1.2课设题目分析
本程序的实质是完成对家谱成员信息的建立、查找、插入等功能。可以首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。 本程序包含以下几个模块 (1)建立家族关系树。此模块将构建一个家族关系,对数据初始化,构造关系树并录入数据一遍后续程序使用。 (2)添加新成员。此模块将添加一个新成员,实现对家族关系的修改。
(3)家族关系的查询。此模块将实现对家族不同关系的查询 (4)主程序模块。此模块实现整个程序的进入和进出,以及各种初始化处理。 (5)
1.3课程题目原理与数据结构
因为家族的成员之间存在一个对多个的层次结构关系,所以不能用线性表来表示和实现。家谱从形状上看像一颗倒长的树,所以用树结构来表示比较合适。树形结构是一类非常重要的非线性数据结构,直观看来树是以分支关系定义的层次结构。
因此本课程设计可以采用的数据结构有树状结构和队列。树状结构采用三叉链表来实现,队列采用链式队列实现。
1
家族关系查询系统
1.4功能分析说明图 家族关系查询系统 建 查
2
立一个家族关系打开一个家族关系添加一个家庭成员员按关系查找各个家庭成退出系统找一个成员的祖先查找成员祖先路径查找成员是第几代查找一个成员双亲查找一个成员的兄弟查找成员的堂兄弟查找一个成员的孩子查找成员的子孙后代 家族关系查询系统
2 分析与实现
2.1 基本数据结构和栈队的操作
2.1.1 结点基本数据结构和链队的定义
/*家族关系树实现*/ #include
#define ERROR -1
#define INFEASIBLE -1 typedef char DataType; #define MAXNUM 20
typedef struct TriTNode/* 树的三叉链表存储结构*/ {
DataType data[MAXNUM];
struct TriTNode *parent;/* 双亲*/ struct TriTNode *lchild;/* 左孩子*/ struct TriTNode *rchild;/* 右孩子*/ }TriTree;
typedef struct Node/* 队列的结点结构*/ {
TriTree *info; struct Node *next; }Node;
typedef struct/* 链接队列类型定义*/ {
struct Node *front; /* 头指针*/
3
家族关系查询系统
struct Node *rear; /* 尾指针*/ }LinkQueue;
DataType fname[MAXNUM],family[50][MAXNUM];/* 全局变量*/
2.1.2 链队的基本操作
LinkQueue *LQueueCreateEmpty( )/* 建立一个空队列*/ {
LinkQueue *plqu=(LinkQueue *)malloc(sizeof(LinkQueue)); if (plqu!=NULL)
plqu->front=plqu->rear=NULL; else { printf(\内存不足!\\n\); return NULL; }
return plqu; }
int LQueueIsEmpty(LinkQueue *plqu)/* 判断链接表示队列是否为空队列*/ {
return(plqu->front==NULL); }
void LQueueEnQueue(LinkQueue *plqu,TriTree *x)/* 进队列*/ {
Node *p=(Node *)malloc(sizeof(Node)); if(p==NULL)
printf(\内存分配失败!\\n\); else {
p->info=x;
p->next=NULL;
if(plqu->front==NULL)/* 原来为空队*/ plqu->front=p; else
plqu->rear->next=p; plqu->rear=p;
4
家族关系查询系统
} }
int LQueueDeQueue(LinkQueue *plqu,TriTree *x)/* 出队列*/ {
Node *p;
if(plqu->front==NULL) { printf(\队列空!\\n\); return ERROR; } else {
p=plqu->front; x=p->info;
plqu->front=plqu->front->next; free(p); return OK; } }
TriTree *LQueueGetFront(LinkQueue *plqu)/* 在非空队列中求队头元素*/ {
return(plqu->front->info); }
2.2建立家族关系
2.2.1 建立家族关系并存入文件
基本思想:首先输入家族关系的名称,以此名称为文件
名,建立文本文件接下来按层次输入结点信息,输入一个在文件中写入一行同时将输入的信息保存
到二位字符数组family中。字符数组family是全局变量,存储临时信息 . 注意,输入时每个结点信息占一行,一个结点有多个
5