校园导游系统数据结构图

校园导游系统数据结构图
校园导游系统数据结构图

郵電學院

数据结构实验报告题目:校园导游系统

院系名称:计算机学院

专业名称:计算机科学与技术

班级: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;vvexnum;v++)

{

final[v]=0;

D[v]=G->arcs[v0][v].adj;

for(w=0;wvexnum;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;ivexnum;i++)

{

min=INFINITY;

for(w=0;wvexnum;w++)

if(!final[w])

if(D[w]

final[v]=1;

for(w=0;wvexnum;w++)

if(!final[w]&&(min+G->arcs[v][w].adj

D[w]=min+G->arcs[v][w].adj;

for(x=0;xvexnum;x++)

p[w][x]=p[v][x];

p[w][w]=1;

}

}

v=v1;

w1=v0;

printf("%s",G->vexs[v0].name);

do

{

flag=0;min=INFINITY;

for(w=0;wvexnum;w++)

{

if(p[v][w]&&w!=v0)

{

flag=1;

if(D[w]

{

j=w;

min=D[w];

}

}

}

3.任意两个地点之间的所有路径

利用深度优先的思想,遍历图找出所有的路径,让它遍历所有景点。利用递归的思想,往下历,访问标志位,若访问过在下次就不用访问。{

int s;

if(v[k]==j)/*找到一条路径*/

{

count++;/*路径的条数值加1*/

printf("第%d条:",count);

for(s=1;s

printf("%s->",G->vexs[v[s]].name);

printf("%s\n",G->vexs[v[s]].name);

}

for(s = 1;svexnum;s++)

{

if(s!=i)/*保证找到的是简单路径*/

{

if(G->arcs[v[k]][s].adj!=INFINITY&&visited[s]==0)

/*当vk与vs之间有边存在且vs未被访问过*/

{

visited[s]=1; /*置访问标志位为1,即已访问的*/

v[k+1]=s; /*将顶点s加入到v数组中*/

DeepFirstSeach(G,i,j,k+1); /*递归调用之*/

visited[s]=0; /*重置访问标志位为0,即未访问的,以便该顶点能被重新使用*/

}

}

}

}若找完一个分支在下次重新遍历。

相关主题
相关文档
最新文档