沈阳大学
课程设计报告
课程设计名称:数据结构课程设计课程设计题目:最短路径算法
院(系):信息工程学院
专业:通信工程专业
班级:12级通信2班
学号:F1258212
姓名:刘维成
指导教师:
目录
1 课程设计介绍 (1)
1.1课程设计内容 (1)
1.2课程设计要求 (1)
2 课程设计原理 (2)
2.1课设题目粗略分析 (2)
2.2原理图介绍 (3)
2.2.1 功能模块图 (3)
2.2.2 流程图分析 (3)
3 数据结构分析 (8)
3.1存储结构 (8)
3.2算法描述 (8)
4 调试与分析 (9)
4.1调试过程 (9)
4.2程序执行过程 (9)
参考文献 (11)
附录(关键部分程序清单) (12)
1 课程设计介绍
1.1 课程设计内容
设计程序,实现最短路径的求法,系统主要功能如下:
1.编写算法能够建立带权图,并能够用Dijkstra算法求该图的最短路径。
2.能够选择图上的任意一顶点做为开始节点。
最短路径输出不必采用图形方式,可顶点序列方式输出。
1.2 课程设计要求
1.带权图的顶点信息用字符串,数据可自定。
2.参考相应的资料,独立完成课程设计任务。
3.较规范课程设计报告和软件代码。
2 课程设计原理
2.1 课设题目粗略分析
根据课设题目要求,拟将整体程序分为三大模块。
两个子模块相互独立,没有嵌套调用的情况,在主模块中调用上面两个子模块以下是三个模块的大体分析:
1.建立有向图的存储结构.
2.应用Dijkstra算法求出该有向图的最短路径。
3.在主函数中调用上面两个子函数,完成求最短路径的程序设计。
4.
2.2 原理图介绍
2.2.1 功能模块图
图2.1 功能模块图 2.2.2 流程图分析
1. 主函数
2.2主函数流程图
2. Create 函数
2.3Create函数流程图
3.Dijkstra函数
2.4Dijkstra函数流程图
3 数据结构分析
3.1 存储结构
一个图的邻接矩阵表示是唯一的。
图的邻接矩阵表示,除了需要用一个二维数组存储顶点之间相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组存储顶点信息,其中下标为i的元素存储顶点vi的信息。
因此,图的邻接矩阵的存储结构定义如下:
#define MVNum 50
typedef struct {
VertexType vexs[MVNum];
Adjmatrix arcs[MVNum][MVNum];
}Mgraph;
3.2 算法描述
1. Dijkstra算法核心是贪心,实质是按路径长度递增产生诸顶点的最短路径算法。
迪杰斯特拉算法可用自然语言描述如下:
初始化S和D,置空最短路径终点集,置初始的最短路径值;
S[v1]=TRUE;D[v1]=0;
While(S集中的顶点数<n)
{
开始循环,每次求的v1到某个v顶点的最短路径,并将v加到S集中;
S[v]=TRUE; 更新当前最短路径及距离。
}
2Dijkstra算法结束后,通过设置一个数组记录下一个节点的前趋节点,然后通过倒叙的方式输出该最短路径。
4 调试与分析
4.1 调试过程
在调试程序是主要遇到一下几类问题:
1.程序完成后,调试时没有发现问题,但是当输入开始节点后,运行框却不停的
出现”<-a”,后来重新检查程序时发现for循环的括号后面多了一个”;”,去掉该分号之后,程序可以运行。
2.程序可以运行,但是输出结果不是有序的,解决方法,设立一个前驱数组,用
以记录节点的双亲节点,然后按照倒叙的方式读出该条最短路径的有向序列。
4.2程序执行过程
4.1程序执行过程
4.2程序执行过程
参考文献
[1] 《数据结构》(用面向对象方法与C++描述),殷人昆等,清华大学出版社, 2010年3月。
[2] 《算法与数据结构习题精解和实验指导》,宁正元等,清华大学出版社,
2009年6月。
[3] 《数据结构课程设计》,苏仕华等,机械工业出版社,2010年3月。
[4]《C程序设计》,谭浩强编,清华大学出版社,2006年6月。
附录(关键部分程序清单)程序代码
#include<stdio.h>
#include<stdlib.h>
#define MVNum 100
#define Maxint 32767
typedef char VertexType;
typedef int Adjmatrix;
typedef enum {FALSE,TRUE}boolean;
typedef struct {
VertexType vexs[MVNum];
Adjmatrix arcs[MVNum][MVNum];
}MGraph;
int D1[MVNum],P1[MVNum];
int D[MVNum][MVNum],P[MVNum][MVNum];
void CreateMGraph(MGraph *G,int n,int e)
{
int i,j,k,w;
char a,b;
for(i=1;i<=n;i++)
G->vexs[i]=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++)
{
fflush(stdin);
scanf("%c,%c,%d",&a,&b,&w);
i=a-'a'+1;
j=b-'a'+1;
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;
boolean S[MVNum];
for(v=1;v<=n;v++)
{
S[v]=FALSE;
D2[v]=G.arcs[v1][v];
if(D2[v]<Maxint)
P2[v]=v1;
else
P2[v]=0;
}
D2[v1]=0;S[v1]=TRUE;
for(i=2;i<=n;i++)
{
min=Maxint;
for(w=1;w<=n;w++)
if(!S[w]&&D2[w]<min)
{
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[w]=D2[v]+G.arcs[v][w];
P2[w]=v;
}
}
printf("路径长度路径\n");
for(i=1;i<=n;i++)
{
printf("%5d",D2[i]);
printf("%5c",i-1+'a');v=P2[i];
while(v!=0)
{
printf("<-%c",v-1+'a');
v=P2[v];
}
printf("\n");
}
}
void main()
{
MGraph G;
int n,e,v;
char ch;
printf("输入图中顶点个数和边数n,e:");
scanf("%d,%d",&n,&e);
CreateMGraph(&G,n,e);
while(1)
{
printf("求最短路径,输入开始点v:");
fflush(stdin);
scanf("%c",&ch);
v=ch-'a'+1;
Dijkstra(G,v,n);
}
}
沈阳航空航天大学课程设计报告。