校园导游系统数据结构图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安郵電學院
数据结构实验报告
题目:校园导游系统
院系名称:计算机学院
专业名称:计算机科学与技术
班级:1006
学生姓名:****
学号(8位):*****
指导教师:******
设计起止时间:2011年12月12日~2011年12月16日
一.题目要求
1、设计学校的校园平面图,
地点(地点名称、地点介绍)不少于10个。
2、提供图中任意地点相关信息的查询。
3、提供图中任意地点的问路查询:
1)任意两个地点之间的一条最短(中转最少)的简单路径;
2)任意两个景点的最佳访问路线(带权)查询;
3)任意两个地点之间的所有路径。
4、地点和道路的扩充以及撤销;
地点基本信息的文件存储。(附加:加分题)
二.概要设计
1.功能模块的调用关系图
2.各个模块详细的功能描述。
1.首先,main()函数调用loge()函数,输出欢迎界面,然后调用showmenu()函数来选择用户所要进行的操作。其中showmenu()函数就是一个菜单供使用者来选择他所要进行的相关操作,比如信息的查询,最短路径查询之类。
2.browser()函数,用于输出校园平面图,给用户提供校园的景点分布状况,方便用户选择景点参观。
3.Search()函数,用于查询用户所选的景点信息,用户需要输入要查询的景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出该景点的相关信息,包括景点名字,景点的相关介绍,否则返回重新输入。
4.SearchAllpath()函数,用于查询用户所选的任意两个景点间的所有路径,用户需要输入要查询的起始景点编号,函数会对编号进行判断,如果是合法输入,用户需要输入要查询的终点景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出输查询的两个景点间的所有路径,否则返回重新输入。函数使用深度遍历DeepFirstSeach()查找路径。
5.Wellway()函数,用于查询用户所选的任意两个景点间的最短路径,用户需要输入要查询的起始景点
编号,函数会对编号进行判断,如果是合法输入,用户需要输入要查询的终点景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出输查询的两个景点间的最短路径,否则返回重新输入。函数的生成主体是迪杰斯特拉算法来计算出起点到终点之间的最短路径。
6.minway()函数,用于查询用户所选的任意两个景点间的最佳路径(即中转最少),用户需要输入要查询的起始景点编号,函数会对编号进行判断,如果是合法输入,用户需要输入要查询的终点景点编号,函数会对编号进行判断,如果是合法输入,则在屏幕上输出输查询的两个景点间的最短路径,否则返回重新输入。
7.CreatUDN()函数,创建的图,它是MGraph型,G->vexnum表示顶点的个数;G->arcnum表示边数。CreatUDN()函数的功能就是实现图的创建,将已知的景点的一些信息,转换成图的信息,并进行存储。
三.详细设计(主要函数的程序流程图)
1.任意两个地点之间的一条最短(中转最少)的简单路径
利用遍历的思想,遍历图找出一条最佳最佳的的路径,让它遍历所有景点。往下遍历,访问标志位,若访问过在下次就不用访问。若找完一个分支在下次重新遍历。
zz[0]->zhi=m;
zz[0]->front=NULL;
flag[m]=1;
for(top=0;top<20;top++)
{
for(i=0;i<20;i++)
{
if(G->arcs[zz[top]->zhi][i].adj!=INFINITY&&i==n)
{
printf("%s\n",G->vexs[n].name);
printf("%s\n",G->vexs[zz[top]->zhi].name);
zz[top]=zz[top]->front;
while(zz[top]!=NULL)
{
printf("%s\n",G->vexs[zz[top]->zhi].name);
zz[top]=zz[top]->front;
}
getch();
return;
}
else if(G->arcs[zz[top]->zhi][i].adj!=INFINITY&&flag[i]==0)
{
zz[++j]->zhi=i;
zz[j]->front=zz[top];
flag[i]=1;
}
}
}
2.任意两个景点的最佳访问路线(带权)查询
利用迪杰特斯拉算法,求v0到其余顶点的最短路径D[],p [][]是用来存放各路径的权值,借助辅助数组final[]标志,是否当前顶点属于final(1,属于)。for(v=0;v
final[v]=0;
D[v]=G->arcs[v0][v].adj;
for(w=0;w
p[v][w]=0;
if(D[v] { p[v][v0]=1;p[v][v]=1; } } D[v0]=0;final[v0]=1; for(i=1;i { min=INFINITY; for(w=0;w if(!final[w]) if(D[w] final[v]=1; for(w=0;w if(!final[w]&&(min+G->arcs[v][w].adj { D[w]=min+G->arcs[v][w].adj;