数据结构交通指南系统Word文档格式.docx
《数据结构交通指南系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构交通指南系统Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![数据结构交通指南系统Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/25/352de67f-b61f-4980-981a-3fd38c91b684/352de67f-b61f-4980-981a-3fd38c91b6841.gif)
structnode*next;
}edgenode;
typedefstruct
{charvtx;
edgenode*link;
}vexnode;
typedefvexnodeGraph[n];
;
voidFloyd(GraphG,floatA[n][n],intp[n][n])
{inti,j,k;
for(i=0;
i<
n;
i++)
fot(j=0;
j<
j++)
{A[i][j]=G[i][j];
P[i][j]=-1;
}
for(k=0;
k<
k++)
for(i=0;
for(j=0;
if(A[i][k]+A[k][j]<
A[i][j])
{p[i][j]=k;
A[i][j]=A[i][k]+A[k][j];
}
}
(2)算法提示
采用任意两点最短路径的相关算法。
4.算法设计
(1)结点类型:
structArcCell
{
intadj;
//存放弧长
bool*info;
//是否用过该弧
};
struct_MGraph
charvexs[20];
//存放站点
ArcCellarcs[20][20];
//<
i,j>
intvexnum;
intarcnum;
(2)类定义:
classMGraph//没用私有成员
{
public:
_MGraphmgraph;
//
voidDestroyGraph();
//析构函数销毁图
intLocateVex(charu);
//返回顶点在图中的位置
boolCreateDN();
//构造有向网
voidShortestPath_FLOYD(Path&
P,Distanc&
D);
(3)构造有向网:
boolMGraph:
:
CreateDN()//构造有向网
inti,j,w;
charv1,v2;
cout<
<
"
请输入站点个数,直接线路的条数:
"
cin>
>
mgraph.vexnum>
mgraph.arcnum;
\n请输入各站点名:
for(i=0;
mgraph.vexnum;
i++)//构造顶点向量
{
cin>
mgraph.vexs[i];
i++)//初始化邻接矩阵
for(j=0;
{
if(i==j)
mgraph.arcs[i][j].adj=0;
else
mgraph.arcs[i][j].adj=20000;
//infinity;
mgraph.arcs[i][j].info=false;
}
mgraph.arcnum;
i++)//构造邻接矩阵
cout<
\n请输入一条线路的起点,终点,距离(公里):
v1>
v2>
w;
intm=LocateVex(v1);
intn=LocateVex(v2);
mgraph.arcs[m][n].adj=w;
//<
v1,v2>
的权值
returntrue;
}
(4)销毁有向图:
voidMGraph:
DestroyGraph()
for(inti=0;
for(intj=0;
if(mgraph.arcs[i][j].info)
{
delete[]mgraph.arcs[i][j].info;
mgraph.arcs[i][j].info=false;
}
mgraph.vexnum=0;
mgraph.arcnum=0;
(5)定位点:
intMGraph:
LocateVex(charu)
20;
if(u==mgraph.vexs[i])
{returni;
return-1;
(6)最短路径
ShortestPath_FLOYD(Path&
D)//求每对顶点间的最短路径
//用Floyd算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w]
//若P[v][w][u]为TRUE,则u是从v到w当前求得最短路径上的顶点。
intu,v,w,i;
for(v=0;
v<
v++)
for(w=0;
w<
w++)
D[v][w]=mgraph.arcs[v][w].adj;
//顶点v到顶点w的直接距离
for(u=0;
u<
u++)
P[v][w][u]=false;
//路径矩阵初值
if(D[v][w]<
20000)//从v到w有直接路径
P[v][w][v]=P[v][w][w]=true;
//由v到w的路径经过v和w两点
for(u=0;
for(v=0;
for(w=0;
if(D[v][u]+D[u][w]<
D[v][w])
//从v经u到w的一条路径更短
{
D[v][w]=D[v][u]+D[u][w];
//更新最短距离
for(i=0;
P[v][w][i]=P[v][u][i]||P[u][w][i];
//从v到w的路径经过从v到u和从u到w的所有路径
5.源代码
#include<
iostream>
usingnamespacestd;
typedefintPath[20][20][20];
typedefintDistanc[20][20];
请输入站点个数,直接可达线路的条数:
\n请输入其中一条线路的起点站点名,终点站点名,需要时间(分钟):
returni;
P[v][w][i]=P[v][u][i]||P[u][w][i];
voidmain()
{
MGraphg;
Pathp;
//3维数组
Distancd;
//2维数组
ints,t,k;
charv1,v2;
floatsum=0;
\n***************欢迎使用交通指南系统**************\n"
endl;
g.CreateDN();
cout<
\n请依次输入您的出发站和目的站站点名称:
v2;
s=g.LocateVex(v1);
t=g.LocateVex(v2);
g.ShortestPath_FLOYD(p,d);
if(s!
=t)
{
inta=s;
cout<
\n由站点"
g.mgraph.vexs[s]<
到站点"
g.mgraph.vexs[t]<
途中经过站点:
for(k=0;
g.mgraph.vexnum;
if(p[s][t][k]==1)
{cout<
g.mgraph.vexs[k]<
sum=sum+g.mgraph.arcs[a][k].adj;
a=k;
}
最短时间:
sum<
分钟"
\n\n***************感谢您的使用!
*****************"
\n\n***************祝您旅途愉快!
g.DestroyGraph();
6.举例测试及运行结果
例:
7.收获与体会
这是一个实际应用题。
本实验的核心代码是用FLOYD算法求有向网G中各对顶点v和w之间的最短路径P[v][w]及其带权长度D[v][w],其中利用到了一些稍许繁琐的数据存储结构。
通过本实验,我觉得熟练掌握所学的算法对于编程解决实际问题非常有效。
我们应该在平时多用我们所学的数据结构知识编写程序,尝试解决实际的问题。
刚开始的时候,根据书上的提示自己编写好程序输入电脑,然后编译的时候,出现了许许多多各种各样的问题,回头查看程序,自己却很难找到问题所在,于是查阅各种资料,问了身边很多同学,终于将程序顺利调试出来了。
通过这个系统的实现,我从输入代码跟运行调试的整个过程中学习到了很多东西,也了解到系统出现问题的时候的各种错误应该如何解决。
这次的实验使我了解到,平时对知识的积累相当重要,同时也要注重课上老师的讲解,老师在课上的延伸是课本上所没有的,这些知识对于我们对程序的编写有很大的作用,同时,编程也要求我们有足够的耐心,细细推敲。
越着急可能就越无法得到我们想要的结果,遇到不会的问题要多多请教,知识是在实践与向别人请教的过程中积累的,所以问是至关重要的,只要肯下功夫很多东西都是可以完成的。
数据结构这门课程更加注重设计灵活、巧妙的算法,提高程序运行效率,这对我逻辑思维能力的提高有相当大的帮助。
虽然这学期学完了这门课程,但我在以后的学习中不会放下数据结构,而是经常回顾温习,并多从生活中寻找和发现问题,进而尝试用数据结构的知识设计算法,并进行简单的实现。
相信这样的积累过程对我今后的学习生活大有帮助,让我受益终生。