- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构上机报告 狄克斯特拉
《数据结构》
---使用C语言
实验报告
姓 名:
学 号:
专业班号:
实验日期: 2012.11.22
问题描述:在一个带权图中,从一个结点到另一个结点存在的路径上所经过的边的权值之和为路径的长度,求一个结点到另一个结点最短路径的问题,用狄克斯特拉算法实现。
基本要求:
(1)、测试数据和结点顺序表最大数据限制MaxSize,最大结点限制MaxVertice,最大权值MaxWeight在程序中确定;
(2)、图的存储结构是邻接矩阵存储结构;
(3)、初始状态时结点集合S中只包含源点记为v0。
(4)、集合S中每加入一个新的结点u都要修改从源点到另一个结点集合T中剩余结点的当前最短路径长度值。
(5)、集合T中的结点全部加入到集合S中停止。
测试数据:
Char a[ ]={ A,B,C,D,E,F};
RowColWeightrcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},
{2,5,7},{4,3,4},{5,3,10},{5,4,18}};
算法思想:
设置两个结点的集合S和T,集合S中存放已找到最短路径的结点,集合T中存放当前还未找到最短路径的结点。初始状态时,集合S中只包含源点,设为v0,然后不断从集合T中选择到源点v0路径长度最短的结点u加入到集合S中,集合S中每加入一个新的结点u都要修改从源点v0到集合T中剩余节点的当前最短路径长度值,集合T中各结点的新的当前最短路径长度值,为原来的最短路径长度值与从源点过结点u到达该结点的路径长度中的较小者。此过程不断重复,直到集合T中的结点全部加入到集合S中为止。
模块划分:
(1)“AdjMG..h”邻接矩阵存储结构存贮所需要的图的数据操作,“AdjMGC.h”创建所需要的图,图的创建函数void CreatGraph( );
(2)“Dijkstra.h”狄克斯特拉算法函数求最短路径;
(3)main.cpp为主函数,直接利用四个头文件中的操作函数实现最短路径的查找。
数据结构:
数据类型Datatype定义如下:
typedef struct
{
DataType list[MaxSize];
int size;
}SeqList;
图的结构体定义如下:
typedef struct
{
SeqList Vertices;
int edge[MaxVertices][MaxVertices];
int numOfEdges;
}AdjMGraph;
边信息结构体定义如下:
typedef struct
{
int row;
int col;
int weight;
}RowColWeight;
源程序:
/////////////////////////////SeqList.h////////////////////////////
typedef struct
{
DtaType list[MaxSize];
int size;
}SeqList;
//初始化顺序表L
void ListInitiate(SeqList *L)
{
L-size=0; //定义初始数据元素个数
}
//求当前元素个数
int ListLength(SeqList L) //返回顺序表L的当前数据元素个数
{
return L.size;
}
//插入数据元素
int ListInsert(SeqList *L,int i,DataType x)
//在顺序表L的第i(0=i=size)个位置前插入数据元素值x
//插入成功返回1,插入失败返回0
{
int j;
if(L-size=MaxSize)
{
printf(顺序表已满无法插入!\n);
return 0;
}
else if(i0||iL-size)
{
printf(参数i不合法!\n);
return 0;
}
else
{
//为插入做准备
for(j=L-size;ji;j--)L-list[j]=L-list[j-1];
L-list[i]=x; //插入x
L-size++; //元素个数加1
return 1;
}
}
//删除数据元素
int ListDelete(SeqList *L,int i,DataType *x)
//删除顺序表L中位置为i(0=i=size-1)的数据元素并存放到x中
//删除成功返回1,删除失败返回0
{
int j;
if(L-si
文档评论(0)