图的遍历-深度优先遍历与广度优先遍历(C语言)

这篇具有很好参考价值的文章主要介绍了图的遍历-深度优先遍历与广度优先遍历(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


图的遍历
概念:指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。

邻接矩阵及邻接表的创建

邻接矩阵及邻接表的创建
图的存储结构-无向邻接矩阵与无向邻接表(C语言).文章来源地址https://www.toymoban.com/news/detail-460466.html

深度优先遍历(DFS)

邻接矩阵的深度优先遍历

结构定义

#include<stdio.h>
#include<stdlib.h>
#include <stdbool.h> //提供_Bool 类型

typedef char VertexType;
typedef int EdgeType;
#define MAXVEX 100
#define INFINITY 65535
_Bool visited[MAXVEX];  //访问标志的数组

typedef struct {
	VertexType vexts[MAXVEX];
	EdgeType arc[MAXVEX][MAXVEX];
	int numNodes, numEdges;
} MGraph;

邻接矩阵的深度优先遍历操作

/* 邻接矩阵的深度优先遍历操作 */
void DFSTraverse(MGraph G)
{
	for (int i = 0; i < G.numNodes; i++)  //初始化所有顶点状态为未访问
		visited[i] = false;
	for (int i = 0; i < G.numNodes; i++)
		if (!visited[i])   //对未访问邻接顶点递归调用DFS,如果为连通图仅访问一次
			DFS(G, i);
}

邻接矩阵的深度优先递归算法

/* 邻接矩阵的深度优先递归算法 */
void DFS(MGraph G, int i)
{
	visited[i] = true;     //赋值为真
	printf("%c ", G.vexts[i]);
	for (int j = 0; j < G.numNodes; j++)
		if (G.arc[i][j]= INFINITY && !visited[j]) //对未访问邻接顶点递归调用
			DFS(G, j);
}

邻接表的深度优先遍历

结构定义

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h> 
typedef char VertexType;  //顶点类型
typedef int EdgeType;    //边上权值
#define MAXVEX 100 // 最大顶点数
#define MAXVEX 9
_Bool visited[MAXVEX];  //访问标志的数组

typedef struct EdgeNode {      //边表结点
	int adjvex;                //领接点域,存储对应下标
	EdgeType info;             //存储权值,如果是非网图可以省略
	struct EdgeNode* next;    //指向下一个邻接点
}EdgeNode;

typedef struct VertexNode {    //顶点结点
	VertexType data;           //顶点域
	EdgeNode* firstedge;      //边表头指针
}VertexNode;
typedef struct VertexNode AdjList[MAXVEX];  //邻接表类型

typedef struct {
	AdjList adjList;
	int numNodes, numEdges;   //图当前顶点数与边数
}GraphAdjList;

void CreateALGRAph(GraphAdjList*); //建立图的邻接表结构
int LocateVex(GraphAdjList, VertexType);  //查找顶点

void DFSTraverse(GraphAdjList G);
void DFS(GraphAdjList, int);  //邻接表的深度优先递归算法

邻接表的深度优先遍历操作

/* 邻接表的深度优先遍历操作 */
void DFSTraverse(GraphAdjList G)
{
	for (int i = 0; i < G.numNodes; i++)  //初始化所有顶点状态为未访问
		visited[i] = false;
	for (int i = 0; i < G.numNodes; i++)
		if (!visited[i])   //对未访问邻接顶点递归调用DFS,如果为连通图仅访问一次
			DFS(G, i);
}

邻接表的深度优先递归算法

/* 邻接表的深度优先递归算法 */
void DFS(GraphAdjList G, int i)
{
	EdgeNode* p;
	visited[i] = true;
	printf("%c", G.adjList[i].data);
	p = G.adjList[i].firstedge;
	while (p)
	{
		if (!visited[p->adjvex])  //对未访问邻接顶点递归调用
			DFS(G, p->adjvex);
		p = p->next;
	}
}

广度优先遍历(BFS)

邻接矩阵的广度遍历

结构定义

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef char VertexType;  //顶点类型
typedef int EdgeType;  //边的权值类型
#define MAXVEX 100
#define INFINITY 65535  //表示无穷大
#define MAXSIZE 9   //队列最大长度
_Bool visited[MAXVEX];  //访问标志的数组

typedef struct {
	VertexType vexts[MAXVEX];   //顶点表
	EdgeType arc[MAXVEX][MAXVEX];   //邻接矩阵
	int numNodes, numEdges;     //图当前顶点数与边数
}MGraph;

邻接矩阵的广度遍历算法

/* 邻接矩阵的广度遍历算法 */
void BFSTraverse(MGraph G)
{
	int i, j;

	Queue Q;
	Q.front = Q.rear = 0;   //初始化
	for (i = 0; i < G.numNodes; i++)
		visited[i] = false;
	for (i = 0; i < G.numNodes; i++)  //对每个顶点做循环
	{
		if (!visited[i])  //如果未访问过
		{
			visited[i] = true;  //访问
			printf("%c ", G.vexts[i]);
			EnQueue(&Q, i);     //入队
			while (Q.front != Q.rear)  //队不为空
			{
				DeQueue(&Q, &i);       //队首元素出队
				for (j = 0; j < G.numNodes; j++)
				{
					if (G.arc[i][j] !=INFINITY && !visited[j]) //此顶点存在且边未访问过
					{
						visited[j] = true;
						printf("%c ", G.vexts[j]);
						EnQueue(&Q, j);  //将此顶点入队
					}
				}
			}
		}
	}
}

邻接表的广度优先遍历

结构定义

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef char VertexType;  //顶点类型
typedef int EdgeType;    //边上权值
#define MAXVEX 100 // 最大顶点数
#define MAXSIZE 9   //队列最大长度
_Bool visited[MAXVEX];  //访问标志的数组


typedef struct EdgeNode {      //边表结点
	int adjvex;                //领接点域,存储对应下标
	EdgeType info;             //存储权值,如果是非网图可以省略
	struct EdgeNode* next;    //指向下一个邻接点
}EdgeNode;

typedef struct VertexNode {    //顶点结点
	VertexType data;           //顶点域
	EdgeNode* firstedge;      //边表头指针
}VertexNode;
typedef struct VertexNode AdjList[MAXVEX];  //邻接表类型

typedef struct {
	AdjList adjList;
	int numNodes, numEdges;   //图当前顶点数与边数
}GraphAdjList;

邻接表的遍历算法

/* 邻接表的遍历算法 */
void BFSTraverse(GraphAdjList G)
{
	int i;
	EdgeNode* p;
	Queue Q;
	Q.front = Q.rear = 0;   //初始化
	for (i = 0; i < G.numNodes; i++)
		visited[i] = false;
	for (i = 0; i < G.numNodes; i++)  //对每个顶点做循环
	{
		if (!visited[i])  //如果未访问过
		{
			visited[i] = true;  //访问
			printf("%c ", G.adjList[i].data);
			EnQueue(&Q, i);     //入队
			while (Q.front != Q.rear)  //队不为空
			{
				DeQueue(&Q, &i);
				p = G.adjList[i].firstedge;
				while (p)
				{
					if (!visited[p->adjvex])
					{
						visited[p->adjvex] = true;
						printf("%c ", G.adjList[p->adjvex].data);
						EnQueue(&Q, p->adjvex);
					}
					p = p->next;
				}
			}
		}
	}
}

广度优先遍历所需队列代码

/* 循环队列顺序储存*/
typedef struct {
	int data[MAXVEX];
	int front;   //头指针
	int rear;   //尾指针,如果队列不空,指向队列尾元素的下一个位置
}Queue;

/* 入队列 */
void EnQueue(Queue* Q, int e)
{
	if ((Q->rear + 1) % MAXSIZE == Q->front)  //队满
		exit(-1);
	Q->data[Q->rear] = e;
	Q->rear = (Q->rear + 1) % MAXSIZE;
}

/* 删除头元素,用e返回 */
void DeQueue(Queue* Q, int* e)
{
	if (Q->front == Q->rear)  //如果为空
		exit(-1);
	*e = Q->data[Q->front];
	Q->front = (Q->front + 1) % MAXSIZE;
}



到了这里,关于图的遍历-深度优先遍历与广度优先遍历(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 图的两种遍历:深度优先遍历+广度优先遍历

    图的两种遍历:深度优先遍历+广度优先遍历

    深度优先遍历 是指按照 深度方向 搜索,它类似于树的先根遍历,是树的先根遍历的推广。 基本思想(通俗) 选一条路走到 底 ,直到 走不通 ,就 原路返回 看看 是否还有路 可走,如果返回到起点还无路可走,说明深度优先遍历已完成。 这是要深度遍历的 无向图 :    深

    2024年02月06日
    浏览(9)
  • 图的二种遍历-广度优先遍历和深度优先遍历

    图的二种遍历-广度优先遍历和深度优先遍历

    1.树的广度优先遍历 这样一个图中,是如何实现广度优先遍历的呢,首先,从1遍历完成之后,在去遍历2,3,4,最后遍历5 ,6 , 7  , 8。这也就是为什么叫做广度优先遍历,是一层一层的往广的遍历 不存在“回路”,搜索相邻的结点时,不可能搜到已经访问过的结点 树的广度优

    2024年02月02日
    浏览(11)
  • 图的遍历(广度优先遍历BFS,深度优先遍历DFS)

    图的遍历(广度优先遍历BFS,深度优先遍历DFS)

    目录 图的遍历概念: 图的广度优先遍历(BFS): 代码实现如下: 测试如下: 注意: 图的深度优先遍历(DFS): 代码实现如下: 测试如下: 总代码: 结语: 给定一个图G和其中任意一个顶点v0,从v0出发,沿着图中各边访问图中的所有顶点,且每个顶点仅被遍历一次。\\\"遍

    2024年02月21日
    浏览(9)
  • 大话数据结构-图的深度优先遍历和广度优先遍历

    大话数据结构-图的深度优先遍历和广度优先遍历

      图的遍历分为深度优先遍历和广度优先遍历两种。   深度优先遍历(Depth First Search),也称为深度优先搜索,简称DFS,深度优先遍历,是指从某一个顶点开始,按照一定的规则,访问并记录下一个未访问顶点。对于非连通图,则是按连通分量,采用同一规则进行深度优

    2024年02月04日
    浏览(11)
  • 图的遍历之 深度优先搜索和广度优先搜索

    图的遍历之 深度优先搜索和广度优先搜索

    深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至

    2024年02月13日
    浏览(8)
  • 蛮力算法之深度优先遍历和广度优先遍历——图的深度优先遍历和广度优先遍历,附带案例:迷宫问题及矩阵中传染性传播问题

    蛮力算法之深度优先遍历和广度优先遍历——图的深度优先遍历和广度优先遍历,附带案例:迷宫问题及矩阵中传染性传播问题

    这两种搜索方法本质上都是基于蛮力法思路 这两种搜索方法对有向图和无向图都适用 1.1 邻接矩阵 邻接矩阵示意图: 1.2 邻接表 注意:边结点代表的是图中的边,而并非图中的结点;头结点才表示图中的结点;头结点身后所连接的为边结点 邻接表示意图:(一般默认为出边

    2024年02月05日
    浏览(8)
  • (超详细)C++图的深度优先遍历、广度优先遍历(数据结构)

    (超详细)C++图的深度优先遍历、广度优先遍历(数据结构)

            根据下图,编写代码实现图的深度优先遍历和广度优先遍历。          按照英文字母顺序,以邻接表为存储结构,实现图的深度优先和广度优先遍历。遍历的顺序从顶点a开始。 以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。   (1)从顶点a,

    2024年02月08日
    浏览(14)
  • 图详解第二篇:图的遍历(广度优先+深度优先)

    图详解第二篇:图的遍历(广度优先+深度优先)

    所谓图的遍历: 即从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。 给定一个图G和其中任意一个顶点v0,从v0出发,沿着图中各边访问图中的所有顶点,且每个顶点仅被遍历一次。 ps: 我们后面讲解这些图相关的算法默认都针对邻接矩阵结构的图去讲解,

    2024年02月08日
    浏览(9)
  • 【数据结构与算法】图的深度优先和广度优先遍历

    【数据结构与算法】图的深度优先和广度优先遍历

    😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页 ✨✨座右铭✨✨ : 坚持到底,决不放弃,是成功的保证,只要你不放弃,你就有机会,只要放弃的人,他肯定是不会成功的人。 图是一

    2024年02月02日
    浏览(12)
  • 【数据结构】图的遍历:广度优先(BFS),深度优先(DFS)

    【数据结构】图的遍历:广度优先(BFS),深度优先(DFS)

    目录 1、广度优先(BFS) 算法思想  广度优先生成树  知识树  代码实现  2、深度优先(DFS) 算法思想  深度优先生成树 知识树  代码实现           图的广度优先遍历(BFS)是一种遍历图的算法,其思想是从起始顶点开始遍历图,先访问起始顶点的所有直接邻居,然

    2024年02月04日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包