数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(9页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/8/2650ccbe-ca83-43fa-9f16-b0ad10f31cc2/2650ccbe-ca83-43fa-9f16-b0ad10f31cc21.gif)
数据结构课程设计报告
课程设计报告
数据结构课程设计:
DIJKSTRA算法
学院
计算机与通信工程
专业名称
物联网工程
班级学号
学生姓名
指导教师
2014年07月08日
目录
DIJKSTRA算法
1基本功能描述
1.1题目:
对任意图,选择合适的数据结构表示图,在此基础上实现求解最短路径的Dijkstra算法。
1.2要求:
对所设计的图的数据结构,提供必要的基本功能。
1.3具体任务:
建立图的表示模块;
在建立图之后从单源点开始求最短路径,并显示出最短路径长度及路径途径!
2设计思路
2.1数据存储结构
(1)本次课设参考用图如下
(2)图的存储方式以邻接矩阵存储无向图,表示如下
(3)达成目的如下,找到V0到V8的最短路径
2.2DIJKSTREA算法思想
(1)贪心选择性质
Dijkstra算法是应用贪心算法设计策略的一个典型例子。
它所做的贪心选择是从V-S中选择具有特殊路径顶点u,从而确定从源到u的最短路径长度Dist[u]。
(2)最优子结构性质
算法中确定的dist[u]确实是当前从源到顶点u的最短特殊路径长度。
(3)计算复杂性
对于一个具有n个顶点和e条边的带权有向图,如果用带权临接矩阵表示这个图,那么Dijkstra算法的主循环体需要O(n)时间。
这个循环需要执行n-1次,所以完成循环需要O(n*n)。
3软件设计
4结论与心得体会
此次数据结构课程设计,我们学会了。
5参考文献
《计算机算法设计与分析》
《算法导论》
《大话数据结构》
6附录
6.1调试结果
6.2源代码
#include"stdio.h"
#include"stdlib.h"
#defineMAXEDGE20
#defineMAXVEX20
#defineINIT65535
typedefstruct
{
intvexs[MAXVEX];
intarc[MAXVEX][MAXVEX];
intnumVertexes,numEdges;
}MGraph;
typedefintPatharc[MAXVEX];/*用于存储最短路径下标的数组*/
typedefintShortPathTable[MAXVEX];/*用于存储到各点最短路径的权值和*/
/*构件图*/
voidCreateMGraph(MGraph*G)
{
inti,j;
/*printf("请输入边数和顶点数:
");*/
G->numEdges=16;
G->numVertexes=9;
for(i=0;inumVertexes;i++)/*初始化图*/
{
G->vexs[i]=i;
}
for(i=0;inumVertexes;i++)/*初始化图*/
{
for(j=0;jnumVertexes;j++)
{
if(i==j)
G->arc[i][j]=0;
else
G->arc[i][j]=G->arc[j][i]=INIT;
}
}
G->arc[0][1]=1;
G->arc[0][2]=5;
G->arc[1][2]=3;
G->arc[1][3]=7;
G->arc[1][4]=5;
G->arc[2][4]=1;
G->arc[2][5]=7;
G->arc[3][4]=2;
G->arc[3][6]=3;
G->arc[4][5]=3;
G->arc[4][6]=6;
G->arc[4][7]=9;
G->arc[5][7]=5;
G->arc[6][7]=2;
G->arc[6][8]=7;
G->arc[7][8]=4;
for(i=0;inumVertexes;i++)
{
for(j=i;jnumVertexes;j++)
{
G->arc[j][i]=G->arc[i][j];
}
}
}
/*Dijkstra算法,求有向网G的v0顶点到其余顶点v的最短路径P[v]及带权长度D[v]*/
/*P[v]的值为前驱顶点下标,D[v]表示v0到v的最短路径长度和*/
voidShortestPath_Dijkstra(MGraphG,intv0,Patharc*P,ShortPathTable*D)
{
intv,w,k,min;
intfinal[MAXVEX];/*final[w]=1表示求得顶点v0至vw的最短路径*/
for(v=0;v{
final[v]=0;/*全部顶点初始化为未知最短路径状态*/
(*D)[v]=G.arc[v0][v];/*将与v0点有连线的顶点加上权值*/
(*P)[v]=-1;/*初始化路径数组P为-1*/
}
(*D)[v0]=0;/*v0至v0路径为0*/
final[v0]=1;/*v0至v0不需要求路径*/
/*开始主循环,每次求得v0到某个v顶点的最短路径*/
for(v=1;v{
min=INIT;/*当前所知离v0顶点的最近距离*/
for(w=0;w{
if(!
final[w]&&(*D)[w]{
k=w;
min=(*D)[w];/*w顶点离v0顶点更近*/
}
}
final[k]=1;/*将目前找到的最近的顶点置为1*/
for(w=0;w{
/*如果经过v顶点的路径比现在这条路径的长度短的话*/
if(!
final[w]&&(min+G.arc[k][w]<(*D)[w]))
{/*说明找到了更短的路径,修改D[w]和P[w]*/
(*D)[w]=min+G.arc[k][w];/*修改当前路径长度*/
(*P)[w]=k;
}
}
}
}
intmain(void)
{
inti,j,v0;
MGraphG;
PatharcP;
ShortPathTableD;/*求某点到其余各点的最短路径*/
v0=0;
CreateMGraph(&G);
ShortestPath_Dijkstra(G,v0,&P,&D);
printf("最短路径倒序如下:
\n");
for(i=1;i{
printf("v%d-v%d:
",v0,i);
j=i;
while(P[j]!
=-1)
{
printf("%d",P[j]);
j=P[j];
}
printf("\n");
}
printf("\n源点到各顶点的最短路径长度为:
\n");
for(i=1;iprintf("v%d-v%d:
%d\n",G.vexs[0],G.vexs[i],D[i]);
return0;
}