数据结构课程设计家族关系查询系统文档格式.docx
- 文档编号:14865940
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:28
- 大小:49.62KB
数据结构课程设计家族关系查询系统文档格式.docx
《数据结构课程设计家族关系查询系统文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计家族关系查询系统文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
树状结构采用三叉链表来实现,队列采用链式队列实现。
1.4功能分析说明图
家族关系查询系统
建立一个家族关系
打开一个家族关系
添加一个家庭成员
按关系查找各个家庭成员
退出系统
查找一个成员的祖先
查找成员的子孙后代
查找成员祖先路径
查找成员是第几代
查找一个成员双亲
查找一个成员的兄弟
查找成员的堂兄弟
查找一个成员的孩子
2分析与实现
2.1基本数据结构和栈队的操作
2.1.1结点基本数据结构和链队的定义
/*家族关系树实现*/
#include<
string.h>
malloc.h>
#include<
limits.h>
stdio.h>
stdlib.h>
io.h>
math.h>
process.h>
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR-1
#defineINFEASIBLE-1
typedefcharDataType;
#defineMAXNUM20
typedefstructTriTNode/*树的三叉链表存储结构*/
{
DataTypedata[MAXNUM];
structTriTNode*parent;
/*双亲*/
structTriTNode*lchild;
/*左孩子*/
structTriTNode*rchild;
/*右孩子*/
}TriTree;
typedefstructNode/*队列的结点结构*/
{
TriTree*info;
structNode*next;
}Node;
typedefstruct/*链接队列类型定义*/
{
structNode*front;
/*头指针*/
structNode*rear;
/*尾指针*/
}LinkQueue;
DataTypefname[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"
);
returnNULL;
}
returnplqu;
}
intLQueueIsEmpty(LinkQueue*plqu)/*判断链接表示队列是否为空队列*/
{
return(plqu->
front==NULL);
voidLQueueEnQueue(LinkQueue*plqu,TriTree*x)/*进队列*/
Node*p=(Node*)malloc(sizeof(Node));
if(p==NULL)
printf("
内存分配失败!
{
p->
info=x;
next=NULL;
if(plqu->
front==NULL)/*原来为空队*/
front=p;
rear->
next=p;
rear=p;
}
intLQueueDeQueue(LinkQueue*plqu,TriTree*x)/*出队列*/
Node*p;
front==NULL)
队列空!
returnERROR;
p=plqu->
front;
x=p->
info;
front->
next;
free(p);
returnOK;
TriTree*LQueueGetFront(LinkQueue*plqu)/*在非空队列中求队头元素*/
return(plqu->
info);
2.2建立家族关系
2.2.1建立家族关系并存入文件
基本思想:
首先输入家族关系的名称,以此名称为文件名,建立文本文件接下来按层次输入结点信息,输入一个在文件中写入一行同时将输入的信息保存
到二位字符数组family中。
字符数组family是全局变量,存储临时信息.注意,输入时每个结点信息占一行,一个结点有多个兄弟,以“@”作为兄弟结束标志,结点若无孩子,直接以“@”代替。
依次输入各节点信息,以“#”作为结束标志。
最后使用函数CreateTriTree建立家族关系树.
lixian
liguoyuliguojunliguoqiang
liyongzhiliyongruiliyongming
liwendeliwenjia
TriTree*Create(DataTypefamilyname[MAXNUM])/*建立家族关系并存入文件*/
inti=0;
/*i控制family数组下标*/
DataTypech,str[MAXNUM];
/*ch存储输入的y或n,str存储输入的字符串*/
TriTree*t;
FILE*fp;
strcpy(fname,familyname);
/*以家族名为文本文件名存储*/
strcat(fname,"
.txt"
fp=fopen(fname,"
r"
/*以读取方式打开文件*/
if(fp)/*文件已存在*/
fclose(fp);
%s的家族关系已存在!
重新建立请按“Y”,直接打开请按“N”\n"
familyname);
ch=getchar();
getchar();
/*接收回车*/
if(ch=='
N'
||ch=='
n'
)
{
t=Open(familyname);
/*直接打开*/
returnt;
}
if(!
fp||ch=='
Y'
y'
)/*重新建立,执行以下操作*/
fp=fopen(fname,"
w"
/*以写入方式打开文件,不存在则新建*/
请按层次输入结点,每个结点信息占一行\n"
兄弟输入结束以“@”为标志,结束标志为“#”\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('
strcpy(family[i],str);
/*将成员信息存储到字符数组中*/
i++;
/*关闭文件*/
t=TriTreeCreate();
/*根据family数组信息创建三叉树*/
家族关系已成功建立!
returnt;
/*返回树*/
2.2.2建立家族关系树
采用指针数组作为指针,保存输入的结点地址。
队列的尾指针指向当前结点。
头指针指向当前结点的双亲结点。
输入的结点信息已存储在字符数组family中。
将信息复制到字符串数组“ch”中,如果"
ch"
不是“@”,则建立一个新结点。
若新结点是第一个结点,则它是根结点,将其入队,指针tree指向这个根节点;
如果不是根结点,则将当前结点链接到双亲结点上,即当前结点的双亲指针就是队头元素,然后将当前结点入队列。
接着判断flag的值,如果flag=0,表示当前结点没有左孩子,那么当前结点就是双亲的左孩子。
否则,当前结点就是双亲的右孩子。
用指针root指向刚刚入队的结点。
继续复制数组family的下个元素。
如果“ch”是@。
则flag=0(因为“@”后面的第一个孩子为左孩子),同时判断“@”是否是第一次出现,如果是第一次,则令标志star=1;
如果不是第一次出现。
则出队列,root指向队头元素(实际上root总是指向双亲结点)。
继续复制family的下一个元素。
知道遇到“#”结束。
函数返回指针tree。
/*建立家族关系树*/
TriTree*TriTreeCreate()
TriTree*t,*x=NULL,*tree,*root=NULL;
LinkQueue*q=LQueueCreateEmpty();
/*建立一个空的队列,存储指向树的指针*/
inti=0,flag=0,start=0;
DataTypestr[MAXNUM];
/*存放family数组中信息*/
strcpy(str,family[i]);
/*复制*/
i++;
while(str[0]!
)/*没遇到结束标志继续循环*/
@'
)/*没遇到兄弟输入结束标志继续*/
if(root==NULL)/*空树*/
{
root=(TriTree*)malloc(sizeof(TriTree));
/*申请空间*/
strc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 家族 关系 查询 系统