先说思路:
DFS两种方法实现:递归和非递归。【不难,看下面代码即可】。

试实现邻接矩阵存储图的深度优先遍历。

函数接口定义:

void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );

其中MGraph是邻接矩阵存储的图,定义如下:

typedef struct GNode *PtrToGNode;
struct GNode{int Nv;  /* 顶点数 */int Ne;  /* 边数   */WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */

函数DFS应从第V个顶点出发递归地深度优先遍历图Graph,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按序号递增的顺序。题目保证V是图中的合法顶点。

裁判测试程序样例:

#include <stdio.h>typedef enum {false, true} bool;
#define MaxVertexNum 10  /* 最大顶点数设为10 */
#define INFINITY 65535   /* ∞设为双字节无符号整数的最大值65535*/
typedef int Vertex;      /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;  /* 边的权值设为整型 */typedef struct GNode *PtrToGNode;
struct GNode{int Nv;  /* 顶点数 */int Ne;  /* 边数   */WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
bool Visited[MaxVertexNum]; /* 顶点的访问标记 */MGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */void Visit( Vertex V )
{printf(" %d", V);
}void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );int main()
{MGraph G;Vertex V;G = CreateGraph();scanf("%d", &V);printf("DFS from %d:", V);DFS(G, V, Visit);return 0;
}/* 你的代码将被嵌在这里 */

输入样例:给定图如下

5

输出样例:

DFS from 5: 5 1 3 0 2 4 6
/*递归
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) )//void (*Visit)(Vertex)是把函数作为参数,可以不用管
{int i;Visit(V);Visited[V]=true;//注意:改标记!!!for(i=0;i<Graph->Nv;i++){if(Graph->G[V][i]<INFINITY && Visited[i]==false){//注意:直接相连(权值小于无穷)&& 没有被访问过,两者需要同时成立DFS(Graph,i,Visit);}}
}*/
/*非递归------为了降重我选这个自己写的非递归的,递归的太常用,嘿嘿*/
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) )
{int i;Vertex stack[MaxVertexNum];int top=-1;//定义栈Vertex p;Visit(V);Visited[V]=true;stack[++top]=V;while(top!=-1){for(i=0;i<Graph->Nv;i++){if(Graph->G[V][i]<INFINITY && Visited[i]==false){Visit(i);Visited[i]=true;stack[++top]=i;V=stack[top];break;//深度查找 :找到一个,就结束当前循环;然后以找到的i为V进行下一次循环}}if(i==Graph->Nv){V=stack[--top];//注意:出栈的条件:找了一圈都没有找到符合输出的,就出栈--后退}}
}

6-1 邻接矩阵存储图的深度优先遍历 (20 分)(C语言版)相关推荐

  1. 邻接矩阵存储图的深度优先遍历

    练习6.1 邻接矩阵存储图的深度优先遍历 (20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visi ...

  2. 超详细C语言版数据结构:图的深度优先遍历(推荐收藏)

    文章目录 一.邻接矩阵存储图的深度优先遍历过程分析 二.结果分析 三.C语言编程实现图的深度优先遍历 四.图的遍历及其应用 一.邻接矩阵存储图的深度优先遍历过程分析 对图1这样的无向图,要写成邻接矩阵 ...

  3. C++实现图的深度优先遍历和广度优先遍历

    图的深度和广度优先遍历 图的深度优先遍历 1.算法思想 2.邻接矩阵构造图 3.邻接表构造图 图的广度优先遍历 1.算法思想 2.邻接矩阵构造图 图的深度优先遍历 1.算法思想 (1)从图中的某个初始 ...

  4. 邻接矩阵存储图并进行深度优先遍历

    内容: 采用邻接矩阵的形式存储图,进行图的深度优先遍历 步骤: 算法分析: 首先,图的邻接矩阵存储结构,就是用一维数组存储图中顶点的信息,用矩阵表示图中各顶点之间的邻接关系.假设图G=(V,E)有n个 ...

  5. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...

    图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...

  6. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索

    线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...

  7. java语言实现图的深度优先遍历

    java语言实现图的深度优先遍历: 图的存储采用的是邻接矩阵存储的方式,对下面的无向图进行遍历 代码如下: public class Deep {int count=0;public static v ...

  8. 树与图的深度优先遍历

    树与图的深度优先遍历*: 树其实也是图的一种 图: 分为有向图和无向图 图的储存: 第一种:邻接矩阵,就是一个二维数组,缺点:当点和边特别多的时候,存不下,一般用的比较少,而且非常浪费空间 第二种:邻 ...

  9. 图的深度优先遍历(Depth First Search)

    图的深度优先遍历(Depth First Search) 基本思想 类似于二叉树的先序遍历 假设图中所有结点均未被访问,从初始结点访问,访问其第一个邻接结点,接着以被访问的邻接结点作为初始结点,访问它 ...

最新文章

  1. 移动界面控件Essential Studio for Mobile MVC网格控件解析
  2. 2. Python3输入与输出
  3. [Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性
  4. boost::mp11::mp_replace_at相关用法的测试程序
  5. 【机器视觉】 dev_show_tool算子
  6. Android底部导航栏实现(一)之BottomNavigationBar
  7. html离线地图,离线地图三维开发-添加HTML
  8. 股票交易数据下载 | 下载股票历史交易数据到本地Excel
  9. 南方CASS11.0.0.8下载安装教程附视频(日更)
  10. 数字功放芯片品牌大全
  11. python web 开发从入门到精通 pdf_Python Web开发从入门到精通
  12. 小程序 房租水电费记录管理_长租公寓管理系统-智慧公寓小程序
  13. 网站导航 - 网址大全
  14. 计算机网络之应用层图解,秒解应用层HTTP,期末考试不担心!!
  15. 春招旺季提前,北上深杭平均招聘月薪过万
  16. JS中的click事件无反应
  17. python在windows 比linux 慢,为什么Windows上的python套接字扫描比在linux上慢很多?
  18. 已经30岁了,现在学编程还晚不晚
  19. boos里的AHCI RAID_DNF:预热真安徒恩Raid,常见炸团点回顾
  20. ESP8266 快速对接小爱同学 语音控制

热门文章

  1. Linux环境搭建记录——Jenkins安装
  2. 静态类型与动态类型语言
  3. 值得珍藏一辈子的80句话(经典语句)
  4. 班尼机器人维修方法_ABB机器人九大常见故障维修
  5. Python、Anaconda和PyCharm的概念
  6. 计算机系保研专家推荐信,大学生保研导师推荐信
  7. Linux内核开发_1_编译LInux内核
  8. vue获取屏幕高度并赋值给盒子
  9. “fatal error C1014:包含文件太多:深度 = 1024”的原因与解决办法
  10. 2.5D风格场景插画立体图案一键生成PS插件_安装教程