头文件

#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语言实现...相关推荐

  1. bfs广度优先搜索算法_图的广度优先搜索(BFS)

    bfs广度优先搜索算法 What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先 ...

  2. C语言数据结构_图、图的深度优先遍历、广度优先遍历

    图 图是一种多对多的关系,可以有零个或多个直接前驱,也可以有零个或多个直接后驱.相较于线性表和树,图的结点可以是任意的,而线性表有头结点,只要知道了头结点,那么整个线性表就可以直接访问,树有根结点,可 ...

  3. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  4. 有向图的广度优先遍历_图的两种遍历方式

    1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...

  5. 深度优先遍历访问的边集合_数据结构与算法: 三十张图弄懂「图的两种遍历方式」...

    1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...

  6. 图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

    遍历的定义: 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算. 一:深度优先遍历(DFS) 1,在访问图中某一起始顶点V后,由V ...

  7. 八数码宽度优先搜索python代码_图之遍历--广度优先遍历

    何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...

  8. java实现二叉树广度优先遍历_二叉树之深度优先和广度优先遍历(Java)

    tree.png 1. 二叉树结构定义 public static class Tree { int data; Tree left; Tree right; public Tree(int data ...

  9. 广度优先遍历类似于二叉树的_二叉树的各种遍历方法的简单解释

    二叉树顾名思义,最多两个孩子. 一般规定一个二叉树,因为节点间有相互连接的原因,所以只要给定根节点,那么顺着寻找左孩子和右孩子便可以遍历到所有的节点,这就是遍历的直观解释. 而遍历分为深度遍历和广度遍 ...

最新文章

  1. Redis 过滤请求绝技 — 布隆过滤器与布谷鸟过滤器
  2. 利用SQLChiper对Android SQLite数据库加密
  3. python二维数组去重复_php二维数组去重,array_unique出除重复数据
  4. UDP打洞NAT大致分为下面四类 P2P
  5. Pytorch中 .numpy() .item() .cpu() 区别
  6. git merge用法_Git 基本命令 merge 和 rebase,你真的了解吗?
  7. Keil MDK编译器(V4.03)与J-LINK使用
  8. 手机壳送你指纹辨识功能,不怕另一半偷看手机了!
  9. cocos2d-x中使用可加密Sqlite存储玩家数据
  10. oracle中between函数用法,Oracle常用函数使用介绍
  11. WPS Office 2009 个人免费正版下载 【转载】
  12. C语言的基础实例应用——寻找符合条件的车牌
  13. slk文件(QQ or 微信) 转为 mp3
  14. Linux AHCI驱动分析之块设备层
  15. Python eval() 函数看这里就够了
  16. worldpress或zblog安装时建立数据库连接时出错
  17. php 中文 验证码,php 验证码 支持中文验证码
  18. 苹果宣布 2022 年 Apple 设计大奖得主
  19. jarsigner签名APK完整步骤
  20. Codeforces Round #808 (Div. 1)(A~C)

热门文章

  1. 大数据常见的处理方法有哪些
  2. 数据分析数据挖掘(二)
  3. TypeScript笔记(4)—— TypeScript中的类型注解
  4. mysql表的一列拆分成两列_将float值拆分成MySQL表的两列?
  5. mysql wait_timeout=_Mysql的wait_timeout解决_MySQL
  6. AcWing 901. 滑雪(记忆化搜索)
  7. android recyclerview添加头部,Android RecyclerView添加Header头部
  8. java闭包lambda,(lambda)函数闭包捕获了什么?
  9. 递归实现组合型枚举(搜索)
  10. Spark将数据写入Mysql