数据结构课程设计

发布 2022-10-05 01:37:28 阅读 9619

信息科学与工程学院。

课程设计任务书。

题目: 交通咨询系统设计。

学号: 201112220141

姓名。年级:

专业: 计算机应用与技术。

课程: 数据结构。

指导教师: 职称。

完成时间。课程设计任务书及成绩评定。

一、需求分析。

设计一个交通咨询系统,能让旅客咨询从任一个城市顶点到另一城市顶点之间的最短路径(里程)或最低花费或最少时间等问题。对于不同的咨询要求,可输入城市间的路程或所需时间或所需费用。

本设计共分三部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;三是实现任两个城市顶点之间的最短路径问题。

1.1.1建立图的存储结构。

邻接矩阵是表示图形中顶点之间相邻关系的矩阵。图的邻接矩阵是定义如下的n阶方阵:

设g=(v,e)是一个图,结点集为。

g的邻接矩阵。

当邻接矩阵的行表头、列表头顺序一定时,一个图的邻接矩阵表示是唯一的。

图的邻接矩阵表示,除了需用一个二维数组存储顶点之间的相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组来存储顶点信息,其中下标为i的元素存储顶点i的信息。因此,图的邻接矩阵的存储结构定义如下:

1.1.2 单源最短路径。

最短路径的提法很多。在这里先讨论单源最短路径问题:即已知有向图(带权),我们希望找出从某个源点sv到g中其余各顶点的最短路径。

为了叙述方便,我们把路径上的开始点称为源点,路径的最后一个顶点为终点。那么,如何求得给定有向图的单源最短路径呢?迪杰斯特拉(dijkstra)提出按路径长度递增产生诸点的最短路径算法,称之为迪杰斯特拉算法。

迪杰斯特拉算法求最短路径的实现思想是:设g=(v,e)是一个有向图,结点集为,,cost是表示g的邻接矩阵,cost[i][j]表示有向边的权。若不存在有向边,则cost[i][j]的权为无穷大(这里取值为32767)。

设s是一个集合,其中的每个元素表示一个顶点,从源点到这些顶点的最短距离已经求出。设顶点v1为源点,集合s的初态只包含一个元素,即顶点v1。数组dist记录从源点到其他顶点当前的最短距离,其初值为dist[i]=cost[v1][i],i=1,2,……n。

从s之外的顶点集合v-s中选出一个顶点w,使dist[w]的值最小。于是从源点到达w只通过s中顶点,把w加入集合s中,调整dist中记录的从源点到v-s中每个顶点v的距离:从原来的dist[v]和dist[w]+cost[w][v]中选择较小的值作为新的dist[v]。

重复上述过程,直到v-s为空。

最终结果是:s记录了从源点到该顶点存在最短路径的顶点集合,数组dist记录了源点到v中其余各顶点之间的最短路径,path是最短路径的路径数组,其中path[i]表示从源点到顶点i之间的最短路径的前驱顶点。

因此,迪杰斯特拉算法可用自然语言描述如下:

1.1.3 任意一对顶点间最短路径。

任意一对顶点间最短路径问题,是对于给定的有向网络图g=(v,e),要对g中任意一对顶点有序对“v,w(vw)”,找出v到w的最短路径。

要解决这个问题,我们可以依次把有向网络图中每个顶点作为源点,重复执行前面讨论的迪杰斯特拉算法n次,即可以求得每对顶点之间的最短路径。

这里还可以用另外一种方法,称作费洛伊德(floyd)算法。

费洛伊德(floyd)算法算法的基本思想是:假设求从顶点 vi到vj的最短路径。如果从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,还需要进行n次试探。

首先考虑路径和是否存在。如果存在,则比较和< vi,v1,vj >的路径长度,取长度较短者为当前所求得的最短路径。该路径是中间顶点序号不大于1的最短路径。

其次,考虑从vi到vj是否包含有顶点v2为中间顶点的路径,若没有,则说明从vi到vj的当前最短路径就是前一步求出的;若有,那么可分解为和,而这两条路径是前一次找到的中间顶点序号不大于1的最短路径,将这两条路径长度相加就得到路径的长度。将该长度与前一次中求出的从vi到vj的中间顶点序号不大于1的最短路径比较,取其长度较短者作为当前求得的从vi到vj的中间顶点序号不大于2的最短路径。依此类推,直到顶点vn加入当前从vi到vj的最短路径后,选出从vi到vj的中间顶点序号不大于n的最短路径为止。

由于图g中顶点序号不大于n,所以vi到vj的中间顶点序号不大于n的最短路径,已考虑了所有顶点作为中间顶点的可能性,因此,它就是vi到vj的最短路径。

1.2 程序流程图。

二、详细设计。

2.1 建立有向图的存储结构

void createmgraph(mgraph * g,int n,int 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:",e);

for(k=1;k<=e;k++)

printf("有向图建立完毕");

2.2迪杰斯特拉算法。

void dijkstra(mgraph *g,int v1,int n)

int d2[mvnum],p2[mvnum];

int v,i,w,min;

enum boolean s[mvnum];

for(v=1;v<=n;v++)

d2[v1]=0;s[v1]=true;

for(i=2;i

s[v]=true;

for(w=1;w<=n;w++)

if(!s[w]&&d2[v]+g->arcs[v][w]

printf("路径长度路径");

for(i=1;i<=n;i++)

printf("");

2.3 费洛伊德算法。

void floyd(mgraph *g,int n)

int i,j,k,v,w;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

for(k=1;k<=n;k++)

2.4 运行主控程序。

void main()

mgraph *g;

int m,n,e,v,w,k;

int xz=1;

g=(mgraph *)malloc(sizeof(mgraph));

printf("输入图中顶点个数和边数n,e:")

scanf("%d,%d",&n,&e);

createmgraph(g,n,e);

while (xz!=0)

{ printf("*求城市间的最短路径***n");

数据结构课程设计

课程设计说明书 题目哈夫曼编码问题的设计和实现。课程名称数据结构课程设计。院 系 部 中心。专业。班级。学生姓名。学号。设计地点。指导教师。设计起止时间 2008 年6月 2日至 2008 年 6月 6 日。目录。1 问题描述 2 1.1 题目内容 2 1.2 基本要求 2 1.3 测试数据 2 2...

数据结构课程设计

数据结构 课程设计。实验报告。学院 信息工程学院。班级 姓名 学号 指导老师 题目2 一元多项式的计算。1 实验目的。1 掌握链表的灵活运用 2 学习链表初始化和建立一个新的链表 3 知道怎样去实现链表删除结点操作与插入结点 4 理解链表的基本操作 包括数据域数据的相加 并能灵活运用。2 实验内容。...

数据结构课程设计

班级 信计 1102 姓名 李娜娜。学号 1108060209 设计日期 2013.07.15 西安科技大学计算机学院 1.实验题目 编制一个演绎扫雷游戏的程序。2.问题描述。做一个n x m的扫雷游戏,每个方格包含两种状态 关闭 closed 和打开 opened 初始化时每个方格都是关闭的,一个...