(完整word版)数据结构课程设计(家族关系查询系统)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 课程设计介绍
1.1课程设计项目简介
家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世系繁衍和重要人物事迹的特殊图书载体。家谱是中国特有的文化遗产,是中华民族的三大文献之一,属珍贵的人文资料,对于历史学,民俗学,人口学,社会学和经济学的深入研究,均有不可替代的重要功能。本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息、插入家族成员等功能。
1.2课设题目分析
本程序的实质是完成对家谱成员信息的建立、查找、插入等功能。可以首先定义家族成员的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
本程序包含以下几个模块
(1)建立家族关系树。此模块将构建一个家族关系,对数据初始化,构造关系树并录入数据一遍后续程序使用。
(2)添加新成员。此模块将添加一个新成员,实现对家族关系的修改。
(3)家族关系的查询。此模块将实现对家族不同关系的查询(4)主程序模块。此模块实现整个程序的进入和进出,以及各种初始化处理。
(5)
1.3课程题目原理与数据结构
因为家族的成员之间存在一个对多个的层次结构关系,所以不能用线性表来表示和实现。家谱从形状上看像一颗倒长的树,所以用树结构来表示比较合适。树形结构是一类非常重要的非线性数据结构,直观看来树是以分支关系定义的层次结构。
因此本课程设计可以采用的数据结构有树状结构和队列。树状结构采用三叉链表来实现,队列采用链式队列实现。
1.4功能分析说明图
家族关系查询系统
建立一个
家族关系打
开
一
个
家
族
关
系
添
加
一
个
家
庭
成
员
按
关
系
查
找
各
个
家
庭
成
员
退
出
系
统
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; /* 头指针*/
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;
}
}
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)/* 在非空队列中求队头元素*/
{