单源结点最短路径问题设计书Word格式文档下载.docx
《单源结点最短路径问题设计书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单源结点最短路径问题设计书Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
typedefcharDataType;
//定义顺序表的数据类型为char
#defineMaxSize10//定义顺序表数组的最大个数
#defineMaxVertices10//定义顶点的最大个数
#defineMaxWeight10000//定义权值的具体最大值
#include"
AdjMGraph.h"
//包含AdjMGraph.h头文件
AdjMGraphCreate.h"
//包含AdjMGraphCreate.h头文件
Dijkstra.h"
//包含Dijkstra.h函数的文件
voidmain(void)
{
AdjMGraphg;
chara[]={'
A'
'
B'
C'
D'
E'
F'
};
RowColWeightrcw[]={{0,1,10},{0,2,12},{1,3,16},{1,4,25},{2,0,4},{2,1,3},{2,3,12},
{2,5,8},{3,4,7},{5,3,2},{5,4,10}};
inti,n=6,e=11;
intdistance[6],path[6];
CreatGraph(&
g,a,n,rcw,e);
Dijkstra(g,0,distance,path);
printf("
\n\t从顶点%c到其余各顶点的最短路径值分别为:
\n"
g.Vertices.list[0]);
for(i=1;
i<
n;
i++)
\t%c到%c的最短路径值为:
%d\n"
g.Vertices.list[0],g.Vertices.list[i],distance[i]);
\n\t从顶点%c到其余各顶点的最短路径的前一顶点为:
if(path[i]!
=-1)
\t%c到%c的最短路径的前一顶点为%c\n"
g.Vertices.list[0],
g.Vertices.list[i],g.Vertices.list[path[i]]);
}
4算法测试及结果
从程序的运行结果,再结合测试数据的有向带权图,可以得出,从顶点A到其余各顶点的最短路径及距离如下。
A到B:
最短路径为(A,B),其距离为10
A到C:
最短路径为(A,C),其距离为12
A到D:
最短路径为(A,C,F,D),其距离为22
A到E:
最短路径为(A,C,F,D,E),其距离为29
A到F:
最短路径为(A,C,F),其距离为20
5总结
课程设计对学生而言是其对所学课程容掌握情况的一次自我验证,从而有着极其重要的意义。
通过课程设计能提高学生对所学知识的综合应用能力,能全面检查并掌握所学容;
《数据结构》从课程性质上讲是一门专业基础课,它的目的和任务就是训练学生对计算机加工的数据对象进行分析的能力,选择适当的数据结构及相应算法的能力,训练学生的编码以及调试能力,进而增加其对学习和应用相关专业课的兴趣。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,将结论用于实践,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中当然遇到了问题,可以说得是困难重重,毕竟这是不可避免的,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
由于编程水平有限,其中头文件和狄杰斯特拉算法的函数设计等是参考书上资料,我想在以后的学习中,要更注重实践这一环节。
在设计的过程中遇到种种问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。
从设计过程看,在整整半个月的日子里,做到精益求精,学到了很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
从设计结果看,设计要求完成任务,达到了预期的目的,设计、演示效果较好。
最主要是从中学到了知识。
参考资料
[1]朱战立.数据结构-使用C语言[M].:
电子工业,2009.
[2]CliffordAshaffer.数据结构与算法分析[M].:
电子工业,2006
[3]SartajSahni.数据结构、算法与应用[M].小,译.:
机械工业,2006.
[4]梁田贵,鹏.算法设计与分析[M]:
冶金工业,2004.
[5]广树健.C语言程序设计[M].:
华南理工大学,2008.
[6]胡学刚.算法与数据结构算法设计指导[M].:
清华大学,2000
[7]许卓群,冬青,唐世渭,铭.数据结构与算法[M].:
高等教育,2004.
附件:
AdjMGraph.h头文件
SeqList.h"
//包含顺序表头文件
typedefstruct
SeqListVertices;
//存放顶点的顺序表
intedge[MaxVertices][MaxVertices];
//存放边的邻接矩阵
intnumOfEdges;
//边的条数
}AdjMGraph;
//图的结构体定义
voidInitiate(AdjMGraph*G,intn)//初始化
inti,j;
for(i=0;
for(j=0;
j<
j++)
{
if(i==j)G->
edge[i][j]=0;
elseG->
edge[i][j]=MaxWeight;
//MaxWeight表示无穷大
}
G->
numOfEdges=0;
//边的条数置为0
ListInitiate(&
G->
Vertices);
//顺序表初始化
voidInsertVertex(AdjMGraph*G,DataTypevertex)//在图G中插入顶点vertex
ListInsert(&
Vertices,G->
Vertices.size,vertex);
//顺序表尾插入
voidInsertEdge(AdjMGraph*G,intv1,intv2,intweight)
//在图G中插入边<
v1,v2>
边<
的权为weight
if(v1<
0||v1>
Vertices.size||v2<
0||v2>
Vertices.size)
{
printf("
参数v1或v2越界出错!
);
return;
}
edge[v1][v2]=weight;
numOfEdges++;
voidDeleteEdge(AdjMGraph*G,intv1,intv2)
//在图G中删除边<
Vertices.size||v1==v2)
if(G->
edge[v1][v2]==MaxWeight||v1==v2)
该边不存在!
edge[v1][v2]=MaxWeight;
numOfEdges--;
intGetFirstVex(AdjMGraphG,intv)
//在图G中寻找序号为V的顶点的第一个邻接顶点
//如果这样的邻接顶点存在,则返回该邻接顶点的序号;
否则返回-1
intcol;
if(v<
0||v>
G.Vertices.size)
参数v1越界出错!
return-1;
for(col=0;
col<
=G.Vertices.size;
col++)
if(G.edge[v][col]>
0&
&
G.edge[v][col]<
MaxWeight)returncol;
intGetNextVex(AdjMGraphG,intv1,intv2)
//在图G中寻找v1顶点的邻接顶点v2的下一个邻接顶点
//v1和v2都是相应顶点的序号
G.Vertices.size||v2<
for(col=v2+1;
if(G.edge[v1][col]>
G.edge[v1][col]<
return-1;
AdjMGraphCreate.h头文件
introw;
//行下标
//列下标
intweight;
//权值
}RowColWeight;
//边信息结构体定义
voidCreatGraph(AdjMGraph*G,DataTypeV[],intn,RowColWeightE[],inte)
//在图G中插入n个顶点信息V和e条边信息E
inti,k;
Initiate(G,n);
//顶点顺序表初始化
InsertVertex(G,V[i]);
//插入顶点
for(k=0;
k<
e;
k++)
InsertEdge(G,E[k].row,E[k].col,E[k].weight);
//插入边
Dijkstra.h头文件
voidDijkstra(AdjMGraphG,intv1,intdistance[],intpath[])
//带权图G从下标v0顶点到其他顶点的最短距离distance和最短路径下标path
intn=G.Vertices.size;
int*s=(int*)malloc(sizeof(in