校园导游系统_C语言实现_Dijkstra(迪杰斯特拉算法)_数据结构

西京学院导游系统

摘要

  要完成对整个导游图系统的功能实现,需要对每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现和需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确调试运行,有以下设计思路:
(1)结合本校的实际情况,选出17个景点;
(2)人为手工为选出17个景点赋上相关信息(名称、代号、简介信息、以及路径等等);
(3)根据选出来的17个景点用邻接矩阵存储西京校园图。
(4)依照景点的相关信息创建西京校园图。
(5)把纸质上的内容,利用Devcpp编程语言编写查找景点相关信息的程序。
(6)根据人为赋值的路径,利用迪杰斯特拉算法计算任意两点之间的最短路径。
(7)综上所述,用一个主函数把这些末班合成,生产一个菜单界面呈现在用户面前。
  关键字:图,最短路径,增删改,迪杰斯特拉算法。

1 详细设计

1.1 图的初始化

  辅助数组dist[n]:元素dist[i]表示当前找到的从源点到终点vi的最短路径的长度。

1.2 求最短路径

  基于本程序中图的存储是邻接矩阵结构存储的图结构,因而采用适合该存储结构的迪杰斯特拉算法用于解决最短路径的问题。
  迪杰斯特拉提出了一个按路径长度递增的持续产生最短路径的算法、其基本思想是:设置一个集合S存放已找到最短路径的顶点,S的初始状态只包含源点v,对于vi∈V-S,假设从源点v到vi的有向边为最短路径。以后每求得一条最短路径v,……vk,就将vk加入集合S中,并将路径v,……vk,vi,与原来的假设相比较,取路径长度较小者为最短路径。重复上述过程,直到集合V中全部顶点加入到集合S中。

1.3 迪杰斯特拉算法在课题中的应用

在这里插入图片描述

1.4 总体函数实现设计模块图

在这里插入图片描述
  用此图表示我们组对西京学院导游图的准备流程图设计过程,我们前期建立一些基本函数,后期再进行所有简单函数的整合,从而使得整个系统的建立成功。

2 设计结果及分析

2.1 设计系统功能

1.输出所有经典及其介绍
欢迎界面
景点及介绍
2.查询某一景点及其介绍
欢迎界面
查询一个景点
3.增加一个景点
欢迎界面
增加一个景点
4.删除一个景点
欢迎界面
删除一个景点
5.更新一个景点
欢迎界面
更新一个景点
6.增加一条路
欢迎界面
增加一条路
7.删除一条路
欢迎界面
删除一条路
8.更新一条路
欢迎界面
更新一条路
9.查询某一景点到其他所有景点的最短路径
查询某一景点到其他景点最短路径
10.查询某两个景点之间的最短路径
查询某两个景点之间的最短路径
11.查看所有景点及其介绍
查看所有景点
查看所有景点介绍

2.2 调试结果

调试结果

2.3 两景点之间最短路径测试

  本功能模块要求按照在景点信息列表中提示的信息用户输入起点编号和终点编号后输出最短路径,经测试后该功能能够实现,没有任何错误。测试结果如下图所示:
查询最短路径

3 收获与体会

  通过6天30课时的数据结构课程设计实训,我们小组学习到了好多东西。期间的学习准备以及这一段时间对课程设计的学习开发,校园导游系统已经基本完成,能够实现系统所要求的基本功能。完成后的系统能够根据用户的输入实现一系列查询功能,根据管理人员的输入完成添加、删除、修改等功能。俗话说“万事开头难”,我们小组在程序设计过程中遇到了很多的困难,但我们不惧艰难,依然一路向前的克服了困难。
我们在制作校园导游系统的过程中遇到了许多的问题,例如:
  1.在绘制校园地图中,我们无法在VC++中得到直线以及圆形图案。
  2.增加一个景点会导致图中的路线改变,无法得到理想地图。
  3.删除一个景点同样会导致图中的路线改变,无法得到理想地图。
  但经过我们小组的不懈努力,参考不同的文献,查阅不同的资料。我们成功的想出了解决这些问题的办法。
  1.当我们无法在VC++中绘制直线和圆形图案时,我们忽略了图形库的安装,安装图形库后,顺利的解决了这一问题。
  2.当增加或删除一个景点导致图中的路线改变时,应采用再次遍历,得到增加或删除后的地图。
  心得:数据结构是一门实践和理论很强的学科,我们不能忽略一些微小的知识点,不能眼高手低,必须在掌握理论的同时加强上机实验操作。
  以上是我们小组对于本次实验课程设计中遇到的问题以及解决办法,最终从中获得了一些心得。
  组长靳文杰带领大家了所有头文件的书写和大量子函数的书写,运行中最短路径函数调试出现了一部分问题,回到宿舍后,小组在群聊中相互讨论,最终通过组长靳文杰的不懈努力和小组成员的互相协作,最终最短路径调试成功。
  体会:实验课程不仅仅是一门课程,他更考验团队合作能力和动手能力,以及理论知识的发挥,不是一个人可以完成的,需要通过大家的努力去完成,在本次实验中我们小组增强了团队凝聚力,始终信服,只要大家一起努力,没有克服不了的困难。上机实习是对学生全面综合素质进行训练的一种最基本的方法,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。上机实习一方面能使书本上的知识变“活”,起到深化理解和灵活掌握教学内容的目的;另一方面,上机实习是对学生软件设计的综合能力的训练,包括问题分析,总体结构设计,程序设计基本技能和技巧的训练。还有更重要的一点是:机器是比任何教师更严厉的检查者。因此,在“数据结构”的学习过程中,必须严格按照老师的要求,主动地、积极地、认真地做好每一个实验,以不断提高自己的编程能力与专业素质。

4 参考文献

  严蔚敏,吴伟民,数据结构(c语言版),北京:清华大学出版社,1997
  李云清,杨庆红 揭安全数据结构(c语言版)(课本)

5 代码查看

代码查看

6 完整资料下载

下载地址

  • 9
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Dijkstra算法是一种用于求解最短路径的算法,以下是使用C语言实现的示例代码: ```c #include <stdio.h> #include <limits.h> #define VERTICES 6 int minDistance(int dist[], int visited[]) { int min = INT_MAX, min_index; for (int v = 0; v < VERTICES; v++) { if (visited[v] == 0 && dist[v] <= min) { min = dist[v]; min_index = v; } } return min_index; } void dijkstra(int graph[VERTICES][VERTICES], int start) { int dist[VERTICES]; int visited[VERTICES]; for (int i = 0; i < VERTICES; i++) { dist[i] = INT_MAX; visited[i] = 0; } dist[start] = 0; for (int count = 0; count < VERTICES - 1; count++) { int u = minDistance(dist, visited); visited[u] = 1; for (int v = 0; v < VERTICES; v++) { if (!visited[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; } } } printf("Vertex \t Distance from Source\n"); for (int i = 0; i < VERTICES; i++) { printf("%d \t\t %d\n", i, dist[i]); } } int main() { int graph[VERTICES][VERTICES] = {{0, 1, 4, 0, 0, 0}, {1, 0, 2, 5, 7, 0}, {4, 2, 0, 1, 0, 0}, {0, 5, 1, 0, 3, 8}, {0, 7, 0, 3, 0, 1}, {0, 0, 0, 8, 1, 0}}; dijkstra(graph, 0); return 0; } ``` 在这个示例中,我们使用了邻接矩阵来表示图,其中`graph[i][j]`表示从顶点`i`到顶点`j`的边的权重。`dijkstra`函数实现Dijkstra算法,其中`dist`数组存储从源顶点到每个顶点的距离,`visited`数组用于标记已经访问过的顶点。`minDistance`函数用于查找距离源顶点最近的未访问过的顶点,该顶点将会成为下一个被访问的顶点。最后,`main`函数中构建了一个示例图,并将源顶点设置为0,然后调用`dijkstra`函数来求解最短路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

return str=xi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值