图的深度优先遍历和广度优先遍历_图的深度优先遍历(DFS)与广度优先遍历(BFS)的c语言实现...
头文件
#pragma warning( disable : 4996)#pragma once#ifndef _GRAPH_H_#define _GRAPH_H_
#define MAX_VERTEX_NUM 20typedef int Graphkind;//有向图该值为1、无向图该值为0typedef int InfoType;typedef char VertexType;//弧节点表示typedef struct ArcNode { int adjvex;//弧的下一个顶点的位置 struct ArcNode* nextarc;//指向下一条弧的位置 InfoType info;//弧的相关信息};//表头结点typedef struct VNode{ VertexType data;//顶点的信息 ArcNode* firstarc;//指向顶点的第一条弧的位置}VNode,AdjList[MAX_VERTEX_NUM];typedef struct { AdjList vertices; int vexnum, arcnum;//图的顶点数目、弧数目 Graphkind kind;}Graph;extern int visisted[MAX_VERTEX_NUM];//标记节点还未访问Graph* creat_graph(Graph* g);//初始化图否被访问,0代表节点未被访问,1代表节点已被被访问void DFS(Graph* g, int i);//单个节点开始进行深度优先遍历void Graph_DFS(Graph* g);//整个图的深度优先遍历void BFS(Graph* g, int i);//单个节点开始进行广度优先遍历void Graph_BFS(Graph* g);//整个图的广度优先遍历#endif
头文件中相关函数的定义文件
#include#include#include"Graph.h"int visisted[MAX_VERTEX_NUM];//标记节点还未访问Graph* creat_graph(Graph* g) {//初始化图 g = (Graph*)malloc(sizeof(Graph)); if (g == NULL) { printf("内存分配不成功!\n"); exit(-1); } printf("请输入图的顶点数和弧数:\n"); printf("顶点数:"); scanf("%d", &g->vexnum); printf("弧数:"); scanf("%d", &g->arcnum); printf("请选择该图的种类:1为有向图;0为无向图\n"); scanf("%d", &g->kind); printf("\n"); printf("输入顶点的信息:\n"); //初始化表头结点 //fflush(stdin); getchar(); char c; for (int i = 0; i < g->vexnum; i++) { scanf("%c", &c); g->vertices[i].data = c; g->vertices[i].firstarc = NULL; } printf("初始化弧,并建立图:\n"); //初始化弧,并建立图 int i1, j1; ArcNode* temp; //fflush(stdin); getchar(); for (int j = 0; j < g->arcnum; j++) { printf("请输入弧(用(i1,j1)表示):"); scanf("%d %d", &i1, &j1); temp = (ArcNode*)malloc(sizeof(ArcNode)); if (temp == NULL) { printf("内存分配不成功!\n"); exit(-1); } temp->adjvex = j1; temp->nextarc = g->vertices[i1].firstarc; printf("该弧的权值:"); fflush(stdin); scanf("%d", &temp->info); g->vertices[i1].firstarc = temp; if (g->kind == 0) {//图为无向图 temp = (ArcNode*)malloc(sizeof(ArcNode)); if (temp == NULL) { printf("内存分配不成功!\n"); exit(-1); } temp->adjvex = i1; temp->nextarc = g->vertices[j1].firstarc; g->vertices[j1].firstarc = temp; } } return g;}//图的深度优先遍历void DFS(Graph* g, int i) {//单个节点开始进行深度优先遍历 ArcNode* t; printf("%c", g->vertices[i].data); visisted[i] = 1; t = g->vertices[i].firstarc; while (t) { if (!visisted[t->adjvex]) DFS(g, t->adjvex); t = t->nextarc; }}void Graph_DFS(Graph* g) {//整个图的深度优先遍历 int i; for (i = 0; i < g->vexnum; i++)//将所有结点定义为未访问 visisted[i] = 0; for (i = 0; i < g->vexnum; i++) { if (!visisted[i])//如果节点还未访问,则从该节点进行深度访问 DFS(g, i); }}void BFS(Graph* g, int i) {//单个节点开始进行广度优先遍历 int q[MAX_VERTEX_NUM];//用于模拟访问过结点的队列 int front, rear;//front为队列的头部,rear为队列的尾部 int temp;//该变量用于接受出队的元素 front = 0; rear = 0; printf("%c", g->vertices[i].data); visisted[i] = 1; q[rear++] = i;//模拟入队 ArcNode* p; while (rear > front) { temp = q[front++];//模拟出队 p = g->vertices[temp].firstarc; while (p) { if (!visisted[p->adjvex]) { printf("%c", g->vertices[p->adjvex].data); q[rear++] = p->adjvex; visisted[p->adjvex] = 1; } p = p->nextarc; } }}void Graph_BFS(Graph* g) {//整个图的广度优先遍历 int i; for (i = 0; i < g->vexnum; i++) visisted[i] = 0; for (i = 0; i < g->vexnum; i++) if (!visisted[i]) BFS(g, i);}
主程序文件
#include#include"Graph.h"int main() { Graph* G=NULL; G = creat_graph(G); printf("此图的深度优先遍历(DFS):\n"); Graph_DFS(G); printf("\n"); printf("此图的广度优先遍历(BFS):\n"); Graph_BFS(G); return 0;}
由于测试的图如下所示:
程序的运行结果如下所示:参考文献:
(1)《数据结构》——严蔚敏 吴伟民 编著
(2)参考的博文链接:[https://blog.csdn.net/Nicht_sehen/article/details/84306286
]
https://blog.csdn.net/weixin_44335707/article/details/104247072
图的深度优先遍历和广度优先遍历_图的深度优先遍历(DFS)与广度优先遍历(BFS)的c语言实现...相关推荐
- bfs广度优先搜索算法_图的广度优先搜索(BFS)
bfs广度优先搜索算法 What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先 ...
- C语言数据结构_图、图的深度优先遍历、广度优先遍历
图 图是一种多对多的关系,可以有零个或多个直接前驱,也可以有零个或多个直接后驱.相较于线性表和树,图的结点可以是任意的,而线性表有头结点,只要知道了头结点,那么整个线性表就可以直接访问,树有根结点,可 ...
- 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)
目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...
- 有向图的广度优先遍历_图的两种遍历方式
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...
- 深度优先遍历访问的边集合_数据结构与算法: 三十张图弄懂「图的两种遍历方式」...
1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...
- 图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现
遍历的定义: 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算. 一:深度优先遍历(DFS) 1,在访问图中某一起始顶点V后,由V ...
- 八数码宽度优先搜索python代码_图之遍历--广度优先遍历
何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...
- java实现二叉树广度优先遍历_二叉树之深度优先和广度优先遍历(Java)
tree.png 1. 二叉树结构定义 public static class Tree { int data; Tree left; Tree right; public Tree(int data ...
- 广度优先遍历类似于二叉树的_二叉树的各种遍历方法的简单解释
二叉树顾名思义,最多两个孩子. 一般规定一个二叉树,因为节点间有相互连接的原因,所以只要给定根节点,那么顺着寻找左孩子和右孩子便可以遍历到所有的节点,这就是遍历的直观解释. 而遍历分为深度遍历和广度遍 ...
最新文章
- Redis 过滤请求绝技 — 布隆过滤器与布谷鸟过滤器
- 利用SQLChiper对Android SQLite数据库加密
- python二维数组去重复_php二维数组去重,array_unique出除重复数据
- UDP打洞NAT大致分为下面四类 P2P
- Pytorch中 .numpy() .item() .cpu() 区别
- git merge用法_Git 基本命令 merge 和 rebase,你真的了解吗?
- Keil MDK编译器(V4.03)与J-LINK使用
- 手机壳送你指纹辨识功能,不怕另一半偷看手机了!
- cocos2d-x中使用可加密Sqlite存储玩家数据
- oracle中between函数用法,Oracle常用函数使用介绍
- WPS Office 2009 个人免费正版下载 【转载】
- C语言的基础实例应用——寻找符合条件的车牌
- slk文件(QQ or 微信) 转为 mp3
- Linux AHCI驱动分析之块设备层
- Python eval() 函数看这里就够了
- worldpress或zblog安装时建立数据库连接时出错
- php 中文 验证码,php 验证码 支持中文验证码
- 苹果宣布 2022 年 Apple 设计大奖得主
- jarsigner签名APK完整步骤
- Codeforces Round #808 (Div. 1)(A~C)
热门文章
- 大数据常见的处理方法有哪些
- 数据分析数据挖掘(二)
- TypeScript笔记(4)—— TypeScript中的类型注解
- mysql表的一列拆分成两列_将float值拆分成MySQL表的两列?
- mysql wait_timeout=_Mysql的wait_timeout解决_MySQL
- AcWing 901. 滑雪(记忆化搜索)
- android recyclerview添加头部,Android RecyclerView添加Header头部
- java闭包lambda,(lambda)函数闭包捕获了什么?
- 递归实现组合型枚举(搜索)
- Spark将数据写入Mysql