数据结构与算法课程设计城市公共交通最短线路Word格式.docx
《数据结构与算法课程设计城市公共交通最短线路Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构与算法课程设计城市公共交通最短线路Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
本系统采用图结构类型(mgraph)存储抽象交通图的信息。
其中:
各站点间的邻接关系用图的邻接矩阵类型存储;
图的顶点个数及边的个数由分量n、e表示,它们是整型数据。
数据结构如下:
intno;
typedefstruct
//顶点编号
的权值
查询站点间的最短路程距离和路径
该功能是查询站点的最短路径,包括距离和线路,有Floyd()函数
实现。
输出邻接矩阵
该功能即输出图的邻接矩阵的值,由函数DispMat(g)实现
4.算法设计
分析实现功能的几个主要函数的代码构成和实现方式
(1).输出邻接矩阵
通过循环嵌套,即双重循环,打印矩阵数据
时间复杂度由站点数n确定T=O(n^2)
voidDispMat(MGraphg)//输出邻接矩阵g
{
inti,j;
for(i=0;
i<
g.n;
i++)
for(j=O;
j<
g.n;
j++)
if©
edges[i][j]==INF)
printf("
%3s"
"
乂"
);
//表示两站点间不可达
else
%3d"
g.edges[i][j]);
\n"
(2).求最短路线
通过自递归,逐个输出最短路径所经过的站点编号
Ppath()函数在path中递归输出从站点i到站点j的最短路径
voidppath(intpath[][MAXV],inti,intj)//输入各条最短路
经
intk;
k=path[i][j];
if(k==-1)return;
ppath(path,i,k);
//递归
%3d,"
k);
//输出站点编号
ppath(path,k,j);
}
(3).求最短路线的距离
Path二维数组保存最短路径,它与当前的迭代的次数有关。
求A[i][j]时,path[i][j]存放从顶点i到j的中间编号大于k的最
短路径上前一个结点的编号。
在算法结束时,有二维数组path的值追
溯,可以得到从i到j的最短路径,若path[i][j]=-1.则没有中间站
点。
voidFloyd(MGraphg)//弗洛伊德算法从每对顶点
之间的最短路径
intA[MAXV][MAXV],path[MAXV][MAXV];
inti,j,k,f,r,n=g.n;
n;
i++)//给A数组置初值
for(j=0;
j<
n;
A[i][j]=g.edges[i][j];
path[i][j]=-1;
for(k=0;
k<
k++)//计算Ak
i<
if(A[i][j]>
(A[i][k]+A[k][j]))
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
printf("
\n输出需要查找的两个站点:
起点:
"
scanf("
&
f);
while(f>
二n)
该点不存在,请重新输入!
\n"
起点:
};
终点:
&
r);
while(r>
=n){
while(r==f){
不能等于起点,请重新输入!
\n”);
\n输出最短路径:
if(A[f][r]==INF){if(f!
=r)printf("
从%3d到%3d没有路径
f,r);
从%3d到%3d路径为:
f);
ppath(path,f,r);
r);
\t路径长度为:
%3d\n"
A[f][r]);
四、环境和工具、用户手册
1.环境与工具
VC++6.0
2•用户手册
本程序只能对程序原有的结点进行输入查找最短距离等基础功能,
不能用于对其它的邻接矩阵的查找操作。
五、详细设计(源程序清单)
#inelude<
stdio.h>
#defineMAXV100
〃最大顶点个数
#defineINF32767
//用32767表示乂
typedefintInfoType;
//假设InfoType为int类型
//以下定义邻接矩阵类型
{intno;
InfoTypeinfo;
//顶点其他信息,这里用于存放边的权值
}VertexType;
//顶点类型
〃图的定义
{intedges[MAXV][MAXV];
//邻接矩阵
intn,e;
//顶点数,弧数
VertexTypevexs[MAXV];
//存放顶点信息
}MGraph;
〃图的邻接矩阵类型
voidDispMat(MGraphg)
〃输出邻接矩阵g
{inti,j;
14;
{for(j=0;
oo"
}}
voidppath(intpath[][MAXV],inti,intj)//输入各条最短路经
{intk;
voidFloyd(MGraphg)//弗洛伊德算法从每对顶点之间的最短路径
{intA[MAXV][MAXV],path[MAXV][MAXV];
inti,j,k,f,r,n=14;
i++)//给A数组置初值
{A[i][j]=g.edges[i][j];
//计算Ak
for(k=O;
n;
k++)
{for(i=0;
{A[i][j]=A[i][k]+A[k][j];
}}
\n输出需要查找的两个站点(站点编号为0-13):
scanf("
{printf(”该点不存在,请重新输入!
};
终点:
该点不存在,请重新输入!
不能等于起点,请重新输入!
\n输出最短路径:
二r)printf("
从%3d到%3d没有路径\n"
{printf("
从%3d到%3d路径为:
}}
voidmain()
交通网路的邻接矩阵为\n"
MGraphg;
int
A[14][14]={{32767,32767,32767,32767,32767,32767,32767,8,32767,32767,
32767,32767,32767,32767},{32767,32767,32767,32767,32767,32767,32767
6,32767,8,32767,32767,32767,32767},{32767,32767,32767,32767,32767,3
2767,32767,32767,32767,7,32767,32767,32767,32767},{32767,32767,3276
7,32767,32767,32767,32767,32767,5,32767,7,32767,32767,32767},{32767,
32767,32767,32767,32767,32767,32767,32767,32767,32767,6,32767,32767,
9},{32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,327
67,6,32767,8},{32767,32767,32767,32767,32767,32767,32767,32767,32767
32767,32767,32767,6,32767},{32767,6,32767,32767,32767,32767,32767,3
2767,32767,32767,32767,32767,32767,32767},{8,32767,32767,5,32767,327
67,32767,32767,32767,32767,32767,32767,32767,32767},{32767,8,7,32767
32767,32767,32767,32767,32767,32767,32767,32767,32767,32767},{3276
7,32767,32767,7,6,32767,32767,32767,32767,32767,32767,32767,32767,32
767},{32767,32767,32767,32767,32767,6,32767,32767,32767,32767,32767,
32767,1,32767},{32767,32767,32767,32767,32767,32767,6,32767,32767,32
767,32767,1,32767,32767},{32767,32767,32767,32767,9,8,32767,32767,32
767,32767,32767,32767,32767,32767}};
g.edges[i][j]=A[i][j];
DispMat(g);
Floyd(g);
六、结果分析及算法评价
程序主界面及输入起点:
输入起点终点输出最短路径:
』"
D\vc60\MSDev9B\MyProject$\Sdf\Debug\safnexe"
—
屮巨*x
■■■I
交通网路的邻接矩阵为
Q
CO
g
S
co
oo
co-
OO
OD
6
a
CSC
OG
0O
?
cx>
oo-
8
5
□O
&
9
eo
1oo
OQ
DO
s
OQ-
oc-
7
G
€O
1
cs?
输出需要查找的两个站点(站点编号为42);
起点;
3
输出最短路径:
地3到嚼径为
3,
8,
0,
7,
‘9
路径长度为:
詰
Pressanu
key
1to
continue-
'
V
总结分析
此次算法的编辑过程,使我熟练的掌握了邻接矩阵存储结构的使用,从另一面了解到迪克斯拉算法,更深刻的意识到清晰的思路能够使程序简单明了。
经过多次的调试与编译,最终程序的运行结果达到自己的要求。
通过课程设计的练习,强化自己对所学知识的掌握及对问题分析和任务定义的理解,对每到题目作出了相应的逻辑分析和数据结构的选择,通过对任务的分析,为操作对象定义相应的数据结构,以过程化程序设计的思想方法为原则划分各个模块,定义数据的抽象数据类型。
通过程序的编译掌握对程序的调试方法及思想,并且让自己学会使用一些编程技巧。