交通咨询系统设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息学院课程设计
题目:交通资询系统
姓名:郑伟
学号: 201112110138 班级:本科一班
课程:数据结构
指导教师:杨振
2012年12月24日
课程设计任务书及成绩评定
目录
1.目的与要求 (1)
1.1设计目的 (1)
1.2设计内容 (1)
1.3设计思想 (1)
1. 4设计要求 (2)
2程序流程图 (2)
3程序源代码 (3)
4编译与运行 (8)
5课程总结 (9)
1 目的与要求
1.1设计目的:掌握图的存储结构;掌握求图的顶点的度及各种邻接结点的操作;掌握迪杰斯特拉算法和弗洛伊德算法。
1.2设计内容:在交通网络非常发达,交通工具和交通方式不断更新的今天,人们在出差、旅游或做其它出行时,不仅关心节省费用,而且对里程和所需时间等问题也感兴趣。对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。图中顶点表示城市之间的交通关系。这个交通系统可以回答旅客提出的各种问题。比如任意一个城市到其他城市的最短路径,任意两个城市之间的最短路径问题。
本次设计的交通咨询系统主要是运用C语言来完成交通图的存储、图中顶点的单源最短路径和任意一对顶点间的最短路径问题。设计一个交通咨询系统,能让旅客咨询任一个城市到另一个城市之间的最短里程或最低花费或最少时间等问题。对于不同咨询要求,可输入城市间的路程或所需费用或所需时间。该交通咨询系统设计共三部分,一是建立交通网络图的存储结构;二是解决单源路径问题;最后再实现两个城市之间的最短路径问题。
1.3设计思想:用邻接矩阵来存储交通网络图的信息,运用迪杰斯特拉算法实现图上单源最短路径问题,然后运用费洛伊德算法实现图中任意一对顶点间最短路径问题,这样就会实现旅客所要咨询的问题。
1.4设计要求:该交通咨询系统要完成城市网络图的存储,并要实现求任意一个城市顶点到其他城市顶点的最短路径问题,还要实现任意两个城市顶点间的最短路径问题。故设计要分成三部分,一是建立交通网络图的存储结构;二是解决单源路径问题;最后再实现两个城市之间的最短路径问题。
2程序流程图:
3程序源代码:
#include
#include
#define MVNum 100 //最大顶点数
#define Maxint 35000
enum boolean{FALSE,TRUE};
typedef char Vertextype;
typedef int Adjmatrix;
typedef struct
{
Vertextype vexs[MVNum]; //顶点数组,类型假定为char型
Adjmatrix arcs[MVNum] [MVNum]; // 邻接矩阵,假定为int型} MGraph;
int D1[MVNum], p1[MVNum];
int D[MVNum][MVNum],p[MVNum][MVNum];
//文件名save.c
void CreateMGraph(MGraph *G,int n,int e)
{ //采用邻接矩阵表示法构造有向图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++)
{ //读入e条边,建立邻接矩阵
scanf("%d,%d,%d",&i,&j,&w);
G->arcs[i][j]=w;
}
printf ("有向图的存储结构建立完毕!\n");
}
//文件名:dijkstra.c(迪杰斯特拉算法)
void Dijkstra(MGraph *G, int v1,int n)
{ //用Dijkstra算法求有向图G的v1顶点到其他顶点v的最短路径p[v]及其权D[v] //设G是有向图的邻接矩阵,若边不存在,则G[i][j]=Maxint
//S[v]为真当且仅当v属于S,及以求的从v1到v的最短路径
int D2[MVNum], p2[MVNum];
int v,i,w,min;
enum boolean S[MVNum];
for(v=1;v<=n;v++)
{ // 初始化S和D
S[v]=FALSE; //置空最短路径终点集
D2[v]=G->arcs[v1][v]; //置初始的最短路径值
if(D2[v]< Maxint)
p2[v]=v1; //v1是的前趋(双亲)
else
p2[v]=0; //v 无前趋
} // End_for
D2[v1]=0;S[v1]=TRUE; //S集初始时只有源点,源点到源点的距离为0 //开始循环,每次求的V1到某个V顶点的最短路径,并加V到S集中
for(i=2;i { //其余n-1个顶点 min=Maxint; // 当前所知离v1顶点的最近距离,设初值为∞ for(w=1;w<=n;w++) //对所有顶点检查 if(!S[w] && D2[w] { //找离v1最近的顶点w,并将其赋给v,距离赋给min v=w; //在S集之外的离v1最近的顶点序号