iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构与算法图的遍历分析
  • 483
分享到

C语言数据结构与算法图的遍历分析

2023-06-22 02:06:34 483人浏览 独家记忆
摘要

这篇文章主要介绍“C语言数据结构与算法图的遍历分析”,在日常操作中,相信很多人在C语言数据结构与算法图的遍历分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据结构与算法图的遍历分析”的疑惑有所帮助!

这篇文章主要介绍“C语言数据结构与算法图的遍历分析”,在日常操作中,相信很多人在C语言数据结构算法图的遍历分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据结构与算法图的遍历分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

引入 

在数据结构中常见的有深度优先搜索和广度优先搜索。为什么叫深度和广度呢?其实是针对图的遍历而言的,请看下面这个图:

C语言数据结构与算法图的遍历分析

图是由一些小圆点(称为顶点) 和 连接这些点的直线 (称为边)组成的。

例如上图就是由5个顶点(编号为 1,2,3,4,5) 和5条边(1-2,1-3,1-4,2-4)组成。

现在我们从1号顶点开始遍历这个图,遍历就是把图的每一个顶点都访问一次。使用深度优先搜索将会得到如下的结果。

C语言数据结构与算法图的遍历分析

图中每个顶点旁边的数表示这个顶点是第几个被访问到的,我们称之为 —— 时间戳 

深度优先搜索

使用深度优先搜索来遍历这个图的过程:

首先从一个未走过的顶点作为起始顶点,比如以1号顶点作为起点。沿1号顶点的边去尝试其他它未走过的顶点,首先发现的是2号顶点还没被走过,于是来到了2号顶点。

再以2号顶点作为出发点继续尝试访问其他未走到过的顶点,这样又来到了4号顶点。

再以4号顶点作为出发点继续尝试访问其他未走过的顶点。但是,此时在4号顶点的周围已经没有其他的顶点了,所以需要返回到2号顶点。返回到2号顶点后,发现沿2号顶点也不能在访问到其他未走到的点了,此时又需要返回到1号顶点。

继续以1号顶点尝试访问其他顶点,我们来到了3号点。以此类推,我们最后来到了5号点。到此,所以的顶点都走过了,遍历结束

深度优先搜索的主要思想是:

首先以一个未被访问的顶点作为起始顶点,沿当前顶点的边走到未被访问过的顶点

当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。

显然,深度优先搜索是沿着图的某一条分支遍历直至末端,然后回溯,再沿另一条实现相同的遍历,直到所以的顶点都被访问完为止。

代码实现 

C语言数据结构与算法图的遍历分析

上面的二维数组中 第i行第j列就是表示顶点i到顶点j是否有边。

1表示有边,x表示没有边,0表示顶点自己到自己。

我们将这种方法称为 ——  图的邻接矩阵储存法。 

细心的朋友可能会发现这张图沿着对角线全部是0,因为上面这张图是 无向图。 

所谓无向图就是指图的边没有方向。例如边 1 - 5 表示 1号顶点可以到 5号顶点,5号顶点也可以到1号顶点。

接下来就是解决怎么用深度优先搜索来实现遍历了:

void dfs(int cur)//cur是当前所在的顶点编号{printf("%d", cur);sum++;//每访问一个点就sum++if (sum == n) return;//所有的顶点都访问过了for (i = 1; i <= n; i++)//从1到n的顶点依次尝试,看看有哪些顶点与当前顶点cur有边相连{//判断当前顶点cur到顶点i是否有边,并判断顶点i是否已被访问过{if (e[cur][i] == 1 && book[i] == 0){book[i] = 1;//标记顶点i已经访问过dfs(i);//从顶点i出发继续遍历}}}return;}

在上面的代码中 变量 cur 存储的是当前正在遍历的点,二维数组e存储的就是图的边(邻接矩阵),数组book用来标记哪些顶点已经访问过,变量sum用来记录已经访问多少个顶点,变量你存储的是图的顶点总个数。

完整代码  

#include <stdio.h>int book[101], sum, n, e[101][101];void dfs(int cur)//cur是当前所在的顶点编号{printf("%d", cur);sum++;//每访问一个点就sum++if (sum == n) return;//所有的顶点都访问过了for (i = 1; i <= n; i++)//从1到n的顶点依次尝试,看看有哪些顶点与当前顶点cur有边相连{//判断当前顶点cur到顶点i是否有边,并判断顶点i是否已被访问过{if (e[cur][i] == 1 && book[i] == 0){book[i] = 1;//标记顶点i已经访问过dfs(i);//从顶点i出发继续遍历}}}return;} int main(){int i, j, m, a, b;scanf("%d %d", &n, &m);//初始化二维矩阵for (i = 1; i <= n; i++)for (j = 1; j <= n; j++)if (i == j) e[i][j] = 0;else e[i][j] = 99999999;//我们假设99999999为x //读入顶点之间的边for (i = 1; i <= n; i++){scanf("%d %d", &a, &b);e[a][b] = 1;e[b][a] = 1;//因为该图为无向图} //从1号顶点出发book[1] = 1;  //标记1号顶点已经访问dfs(1);  //从1号顶点开始遍历 return 0;}

到此,关于“C语言数据结构与算法图的遍历分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C语言数据结构与算法图的遍历分析

本文链接: https://www.lsjlt.com/news/301769.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数据结构与算法图的遍历分析
    这篇文章主要介绍“C语言数据结构与算法图的遍历分析”,在日常操作中,相信很多人在C语言数据结构与算法图的遍历分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言数据结构与算法图的遍历分析”的疑惑有所帮助!...
    99+
    2023-06-22
  • C语言数据结构与算法之图的遍历(二)
    目录前言 广度优先搜索过程主要思想 代码实现  前言  在上一章的内容中我们使用了深度优先搜索来进行遍历,这一章我们选择使用广度优先搜索来完成这个图的遍历 --> 结果如下:...
    99+
    2024-04-02
  • C语言数据结构与算法之图的遍历(一)
    目录引入 深度优先搜索代码实现 完整代码  引入  在数据结构中常见的有深度优先搜索和广度优先搜索。为什么叫深度和广度呢?其实是针对图的遍历而言的,请看下面这个图: 图是由一些小圆...
    99+
    2024-04-02
  • C语言数据结构与算法中怎样完成图的遍历
    C语言数据结构与算法中怎样完成图的遍历,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言 我们选择使用广度优先搜索来完成这个图的遍历 --> 结果如下:广度...
    99+
    2023-06-22
  • C语言数据结构图如何创建与遍历
    本篇内容介绍了“C语言数据结构图如何创建与遍历”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、 实验目的理解图的基本概念,掌握图的存储结构...
    99+
    2023-07-01
  • C语言数据结构图的创建与遍历实验示例
    目录一、 实验目的二、 实验内容三、 实验工具四、 实验代码五、 实验结果六、总结与思考一、 实验目的 理解图的基本概念,掌握图的存储结构,实现图的深度优先搜索遍历算法与广度优先搜索...
    99+
    2024-04-02
  • PHP数据结构中图遍历的示例分析
    这篇文章将为大家详细讲解有关PHP数据结构中图遍历的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。图的遍历:深度优先与广度优先树的遍历演化到图的遍历还记得在树的学习中,我们讲到过先序、中序、后序以...
    99+
    2023-06-20
  • C语言数据结构系列篇二叉树的遍历
    目录前言:Ⅰ.  定义二叉树0x00 二叉树的概念(回顾)0x00 定义二叉树0x01 手动创建二叉树Ⅱ.  二叉树的遍历...
    99+
    2024-04-02
  • C语言数据结构创建及遍历十字链表
    目录一、十字链表是什么?二、十字链表的存储结构三、代码实现 1.引入头文件并定义结构体2.建立十字链表3.遍历十字链表4.调用函数本文需要读者有一定的代码基础,了解指针,链...
    99+
    2024-04-02
  • json中结构与遍历方法的示例分析
    这篇文章给大家分享的是有关json中结构与遍历方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:第一种json结构:var jsongood&nbs...
    99+
    2024-04-02
  • 分析Java数据结构与算法
    本篇内容主要讲解“分析Java数据结构与算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析Java数据结构与算法”吧!1.什么是二叉树二叉树:就是每个节点都...
    99+
    2024-04-02
  • C语言数据结构与算法之单链表
    目录基本概念读取数据元素获取第i个结点的数据元素插入数据元素 初始化链表打印链表顺序表查空顺序表的删除 删除第i个结点及其数据元素情况1:当删除的是第一个元素情况2:除第一个结点外完...
    99+
    2024-04-02
  • C语言数据结构与算法之链表(二)
    目录引入模拟链表介绍插入代码实现代码实现  引入 在上一节的学习中我们介绍了C语言如何实现链表,但是,在这一章,我们将抛开令人头秃的指针和结构体,我们将另外使用一种数组来实现的方式,...
    99+
    2024-04-02
  • C语言数据结构与算法之链表(一)
    目录引言链表的相关思考链表结点结构建立链表实现插入操作完整代码引言 在存储一大波数的时候,我们通常使用的是数组,但是数组有时候又会显得不够灵活,比如下面这个例子: 有一串已经排序好的...
    99+
    2024-04-02
  • C语言数据结构与算法之排序总结(一)
    目录一、前言二、基本概念1.排序2.排序方法的稳定性3.内部和外部排序三、插入类排序1.直接插入排序2.折半插入排序3.希尔排序四、交换类排序1.冒泡排序2.快速排序五、总结比较一、...
    99+
    2024-04-02
  • C语言数据结构与算法之排序总结(二)
    目录一、前言二、选择类排序1.简单选择排序2.树形选择排序3.堆选择排序三、归并排序四、分配类排序1.多关键字排序2.链式基数排序五、总结归纳一、前言 之前的排序总结(一)对插入类和...
    99+
    2024-04-02
  • C语言数据结构与算法时间空间复杂度实例分析
    这篇文章主要介绍“C语言数据结构与算法时间空间复杂度实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言数据结构与算法时间空间复杂度实例分析”文章能帮助大家解决问题。时间复杂度来看第一个:l...
    99+
    2023-06-29
  • Python数据结构树与算法分析
    目录1.示例2.术语及定义3.实现3.1 列表之列表3.2节点与引用4.二叉树的应用4.1解析树4.2树的遍历5.利用二叉堆实现优先级队列6.二叉搜索树6.1搜索树的实现7.平衡二叉...
    99+
    2024-04-02
  • C语言数据结构经典10大排序算法实例分析
    今天小编给大家分享一下C语言数据结构经典10大排序算法实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、冒泡排序//...
    99+
    2023-06-29
  • C语言数据结构之算法的时间复杂度实例分析
    这篇文章主要讲解了“C语言数据结构之算法的时间复杂度实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言数据结构之算法的时间复杂度实例分析”吧!1、算法的复杂度算法在编写成可执行程序...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作