交通咨询系统设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构课程设计》实验报告
编号实验五实验项目名称交通咨询系统设计
学时数3课时指导教师冯韵班
级
计科一班
学
号
33
姓
名
周兴
实验日期2010-10-16 成绩
一、实验目的:设计一个交通咨询系统能让旅客咨询从任意一个城市顶点到另一城市顶点之间的最短路径或最低花费或最少时间等问题。
二、内容与设计思想:(设计思想、主要数据结构、主要代码结构、主要代码段分析)
1.设计思想:一是用有向图的邻接矩阵建立交通网络图的存储结构;二是是用迪杰斯特拉(Dijkstra)算法解决源点到所有点的最短路径问题;三是用费罗伊德(Floyd)算法算出任意两点之间的最短路径。
2.主要数据结构:1.建立有向图的存储结构
2.迪杰斯特拉算法
3.费罗伊德算法
4.主框架函数的实现
3.主要代码结构:
{//采用邻接矩阵表示法构造有向图G,n,e表示图的当前顶点数和边数
int i,j,k,w;
for(i=1;i<=n;i++)
G->vexs[i]=(char)i;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
G->arcs[i][j]=Maxint;
printf("输入%d条边的i,j及w:\n",e);
for(k=1;k<=e;k++){
scanf("%d,%d,%d",&i,&j,&w);
G->arcs[i][j]=w;
}
printf("有向图的存储结构建立完毕!\n");
}
void Dijkstra(MGraph*G,int v1,int n)
{ int D2[MVNum],P2[MVNum];
int v,i,w,min;
enum boolean S[MVNum];
for(v=1;v<=n;v++){
S[v]=FALSE;
D2[v]=G->arcs[v1][v];
if(D2[v] P2[v]=v1; else P2[v]=0;} D2[v1]=0;S[v1]=TRUE; for(i=2;i min=Maxint; for(w=1;w<=n;w++) if(!S[w]&&D2[w] {v=w;min=D2[w];} S[v]=TRUE; for(w=1;w<=n;w++) if(!S[w]&&(D2[v]+G->arcs[v][w] D2[w]=D2[v]+G->arcs[v][w]; P2[w]=v;} } printf("路径长度路径\n"); for(i=1;i<=n;i++){ printf("%5d",D2[i]); printf("%5d",i);v=P2[i]; while(v!=0){ printf("<-%d",v); v=P2[v];} printf("\n");} } void Floyd(MGraph*G,int n) { int i,j,k,v,w; for(i=i;i<=n;i++) for(j=1;j<=n;j++) { if(G->arcs[i][j]!=Maxint) P[i][j]; else P[i][j]=0; D[i][j]=G->arcs[i][j];} for(k=1;k<=n;k++) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) {if(D[i][k]+D[k][j] D[i][j]=D[i][k]+D[k][j]; P[i][j]=P[i][k];} } } } void main() { MGraph*G; int n,e,v,w,k; int xz=1; G=(MGraph*)malloc(sizeof(MGraph)); printf("输入图中顶点个数和边数n,e:"); scanf("%d,%d",&n,&e); CreateMGraph(G,n,e); while(xz!=0){ printf("******求城市之间的最短路径******\n"); printf("===============================\n"); printf("1.求一个城市到所有城市的最短路径\n"); printf("2.求任意的两个城市之间的最短路径\n"); printf("===============================\n"); printf(" 请选择:1或2,选择0退出: \n"); scanf("%d",&xz); if(xz==2){ Floyd(G,n); printf("输入源点(或称起点)和终点:v,w:"); scanf("%d,%d",&v,&w); k=P[v][w]; if(k==0) printf("顶点%d到%d无路径!\n",v,w); else { printf("从顶点%d到%d的最短路径是:%d",v,w,v); while(k!=w){ printf("→%d",w); k=P[k][w]; } printf("→%d",w); printf(" 路径长度:%d\n",D[v][w]);} } else if(xz==1){ printf("求单源路径,输入源点v:"); scanf("%d",&v); Dijkstra(G,v,n); } } printf("结束求最短路径,再见!\n"); } 三、调试过程(测试数据设计与测试结果分析) 按要求输入图中的定点个数和边数n,e:4,5 i,j是图中边的顶点编号,w是边的权值 按要求输入: 按enter键选择1,求单源路径,输入1(求顶点1到其它点的最短路径)