[数据结构]:25-图深度优先遍历(邻接矩阵)(C语言实现)

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

目录

前言

已完成内容

图深度优先遍历实现

01-开发环境

02-文件布局

03-代码

01-主函数

02-头文件

03-AdjMatrixFunction.cpp

04-DFS.cpp

结语


前言

        此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的出现。

已完成内容

[数据结构]:01-顺序表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:02-单链表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:03-栈(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:04-循环队列(数组)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:05-循环队列(链表)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:06-队列(链表带头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:07-二叉树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:08-顺序查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:09-二分查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:10-二叉排序树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:11-冒泡排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:14-选择排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:15-堆排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:16-归并排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:17-双链表(带头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:18-链栈(不带头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:19-串KMP模式匹配(数组)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:20-线索二叉树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:21-并查集(数组)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:22-图(邻接矩阵)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:23-图(邻接表)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:24-图广度优先遍历(邻接矩阵)(C语言实现)_Chandni.的博客-CSDN博客

图深度优先遍历实现

01-开发环境

        语言:C/C++14

        编译器:MinGW64

        集成开发环境:CLion2022.1.3

02-文件布局

        请在CLion集成开发环境中创建C++可执行程序,否则无法运行,原因上面已解释。

                        [数据结构]:25-图深度优先遍历(邻接矩阵)(C语言实现)​​​​​                 

03-代码

01-主函数

        用于测试。

// 默认为无向图,若为有向图或网,请适当修改
#include "./Head/AdjMatrix.h"
#include "./Source/AdjMatrixFunction.cpp"
#include "./Source/DFS.cpp"

int main() {
    // 初始化
    AdjMGraph Graph;
    InitGraph(Graph);
    CreateGraph(Graph);
    PrintGraph(Graph);
    printf("VertexNum = %d,EdgeNum = %d\n", Graph.VexNum, Graph.EdgeNum);
    printf("-----------------------------------\n");

    // 深度优先遍历
    //   0  1  4  5  2  6  3  7
//    DFSTraverse(Graph);

    // 删除0号结点插入8号结点
    DeleteVertex(Graph, 0);
    InsertVertex(Graph, 8);
    AddEdge(Graph, 8, 2);
    AddEdge(Graph, 4, 6);
    // 深度优先遍历
    //   8  2  3  6  4  5  1  7
    DFSTraverse(Graph);
    return 0;
}

02-头文件

        用于存储结构体和常量等。

//
// Created by 24955 on 2023-04-02.
// 默认为无向图,若为有向图或网,请适当修改
//

#ifndef INC_01_ADJACENTMATRIX_ADJMATRIX_H
#define INC_01_ADJACENTMATRIX_ADJMATRIX_H
// 头文件
#include <stdio.h>
#include <stdlib.h>

// 常量
#define MAXSIZE 8
typedef int VertexType;
typedef int EdgeType;

// 结构体-邻接矩阵
typedef struct {
    VertexType Vex[MAXSIZE];
    // 可采用压缩存储
    EdgeType Edge[MAXSIZE][MAXSIZE];
    int VexNum, EdgeNum;
} AdjMGraph;
#endif //INC_01_ADJACENTMATRIX_ADJMATRIX_H

03-AdjMatrixFunction.cpp

        用于存储邻接矩阵的基本操作。

//
// Created by 24955 on 2023-04-02.
// 默认为无向图,若为有向图或网,请适当修改
//
// 初始化图
void InitGraph(AdjMGraph &Graph) {
    // 初始化顶点
    for (int i = 0; i < MAXSIZE; i++) {
        Graph.Vex[i] = -1;
    }
    // 初始化边
    for (int i = 0; i < MAXSIZE; i++) {
        for (int j = 0; j < MAXSIZE; j++) {
            Graph.Edge[i][j] = 0;
        }
    }
    Graph.VexNum = 0;
    Graph.EdgeNum = 0;
}

// 输出邻接矩阵
void PrintGraph(AdjMGraph Graph) {
    for (int i = 0; i < MAXSIZE; i++) {
        printf("%2d\t", Graph.Vex[i]);
        for (int j = 0; j < MAXSIZE; j++) {
            printf("%2d", Graph.Edge[i][j]);
        }
        printf("\n");
    }
}

// 获取元素下标
int GetIndex(AdjMGraph Graph, VertexType x) {
    /*
     *  1. 获取元素真实下标*/
    int xIndex = -1;
    for (int i = 0; i < MAXSIZE; i++) {
        if (Graph.Vex[i] == x) {
            xIndex = i;
            break;
        }
    }
    return xIndex;
}

// 插入顶点x
void InsertVertex(AdjMGraph &Graph, VertexType x) {
    /*
     *  1. 插入,顶点个数+1*/
    if (Graph.VexNum == MAXSIZE) {
        return;
    }
    for (int i = 0; i < MAXSIZE; i++) {
        if (Graph.Vex[i] == -1) {
            Graph.Vex[i] = x;
            break;
        }
    }
    Graph.VexNum++;
}

// 删除顶点x
void DeleteVertex(AdjMGraph &Graph, VertexType x) {
    /*
     *  1. 清除顶点,并修改顶点个数
     *  2. 清除边,并修改边个数*/
    // 清除顶点,将其值设为-1表示该顶点为空
    int xIndex = GetIndex(Graph, x);
    if (xIndex == -1) {
        return;
    }
    Graph.Vex[xIndex] = -1;
    Graph.VexNum--;
    // 清除边
    for (int i = 0; i < MAXSIZE; i++) {
        if (Graph.Edge[xIndex][i]) {
            Graph.EdgeNum--;
            Graph.Edge[xIndex][i] = 0;
            Graph.Edge[i][xIndex] = 0;
        }
    }
}

// 添加边
void AddEdge(AdjMGraph &Graph, VertexType x, VertexType y) {
    /*
     *  1. 获取顶点值实际下标
     *  2. 插入边*/
    int xIndex = GetIndex(Graph, x);
    int yIndex = GetIndex(Graph, y);
    if (xIndex == -1 || yIndex == -1) {
        return;
    }
    // 添加边
    Graph.Edge[xIndex][yIndex] = 1;
    Graph.Edge[yIndex][xIndex] = 1;
    Graph.EdgeNum++;
}

// 删除边
void RemoveEdge(AdjMGraph &Graph, VertexType x, VertexType y) {
    /*
     *  1. 获取顶点值实际下标
     *  2. 删除边*/
    int xIndex = GetIndex(Graph, x);
    int yIndex = GetIndex(Graph, y);
    if (xIndex == -1 || yIndex == -1) {
        return;
    }
    // 删除边
    Graph.Edge[xIndex][yIndex] = 0;
    Graph.Edge[yIndex][xIndex] = 0;
    Graph.EdgeNum--;
}

// 寻找图中顶点x的第一个邻接点
int FirstNeighbor(AdjMGraph Graph, VertexType x) {
    /*
     *  1. 寻找第一个不为0的值,并返回顶点值*/
    int xIndex = GetIndex(Graph, x);
    if (xIndex == -1) {
        return -1;
    }
    for (int i = 0; i < MAXSIZE; i++) {
        if (Graph.Edge[xIndex][i]) {
            return Graph.Vex[i];
        }
    }
    return -1;
}

// 图的下一个邻接点-除y以外的下一个邻接点顶点号
int NextNeighbor(AdjMGraph Graph, VertexType x, VertexType y) {
    /*
     *  1. 寻找y之后第一个不为0的值,并返回顶点值*/
    int xIndex = GetIndex(Graph, x);
    int yIndex = GetIndex(Graph, y);
    if (xIndex == -1 || yIndex == -1) {
        return -1;
    }
    // 寻找y之后的下一个邻接点
    for (int i = yIndex + 1; i < MAXSIZE; i++) {
        if (Graph.Edge[xIndex][i]) {
            return Graph.Vex[i];
        }
    }
    return -1;
}


// 创建图 - 主要方便测试,并非图的正确创建方式,应根据具体情况具体分析
void CreateGraph(AdjMGraph &Graph) {
    Graph.VexNum = 8;
    for (int i = 0; i < Graph.VexNum; i++) {
        Graph.Vex[i] = i;
    }
    // 无向图
    AddEdge(Graph, 0, 1);
    AddEdge(Graph, 0, 4);
    AddEdge(Graph, 1, 5);
    AddEdge(Graph, 2, 5);
    AddEdge(Graph, 2, 3);
    AddEdge(Graph, 2, 6);
    AddEdge(Graph, 5, 6);
    AddEdge(Graph, 3, 6);
    AddEdge(Graph, 3, 7);
    AddEdge(Graph, 6, 7);
    Graph.EdgeNum = 10;
}

04-DFS.cpp

        用于存储DFS函数。

//
// Created by 24955 on 2023-04-06.
// 默认为无向图,若为有向图或网,请适当修改
//
// 访问函数
void visit(AdjMGraph Graph, int x) {
    printf("%3d", Graph.Vex[x]);
}

// 连通图深度优先遍历
void DFS(AdjMGraph Graph, int x, bool *visited) {
    /*
     * 1. 类似树的前序遍历*/
    int xIndex = GetIndex(Graph, x);
    visit(Graph, xIndex);
    visited[xIndex] = true;
    for (int w = FirstNeighbor(Graph, x); w != -1; w = NextNeighbor(Graph, x, w)) {
        int wIndex = GetIndex(Graph, w);
        // 若当前结点未被访问,访问并入队
        if (!visited[wIndex]) {
            DFS(Graph, w, visited);
        }
    }
}

// 深度优先遍历
void DFSTraverse(AdjMGraph Graph) {
    /*
     *  1. 设置结点是否已访问
     *  2. 访问多个连通子图*/
    bool visited[MAXSIZE];
    for (int i = 0; i < MAXSIZE; i++) {
        visited[i] = false;
    }
    for (int i = 0; i < MAXSIZE; i++) {
        // 数组所存结点值和数组下标未必对应
        if (!visited[i] && Graph.Vex[i] != -1) {
            DFS(Graph, Graph.Vex[i], visited);
        }
    }
}

结语

        此博客主要用于408考研数据结构C语言实现记录,内有不足,可留言,可讨论。文章来源地址https://www.toymoban.com/news/detail-409363.html

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

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

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

相关文章

  • 图的数据结构,系统学习图的基本概念、定义和建立,学会邻接矩阵、邻接表以及实现六度空间案例,遍历图的方式——广度、深度访问

    图 :G = (V,E) Graph = (Vertex, Edge) V:顶点(数据元素)的有穷非空集合; E:边的有穷集合。 有向图 :每条边都是有方向的     无向图 :每条边都是无方向的   完全图 :任意两点之间都有一条边相连    无向完全图:n个顶点,n(n-1)/2条边 无向完全图:n个顶点,n(n-1)条边 稀疏

    2023年04月22日
    浏览(48)
  • 对无向图进行邻接矩阵的转化,并且利用DFS(深度优先)和BFS(广度优先)算法进行遍历输出, 在邻接矩阵存储结构上,完成最小生成树的操作。

    目录 一 实验目的 二 实验内容及要求 实验内容: 实验要求: 三 实验过程及运行结果 一 算法设计思路 二 源程序代码 三、截图 四 调试情况、设计技巧及体会 1.掌握图的相关概念。 2.掌握用邻接矩阵和邻接表的方法描述图的存储结构。 3.掌握图的深度优先搜索和广度优

    2024年02月04日
    浏览(57)
  • 深度优先遍历(邻接矩阵,邻接表)

        深度优先遍历也称为深度优先搜索,简称为DFS。     深度优先遍历的思路是从图中某个顶点V出发,访问此顶点,然后从V的未被访问过的邻接点出发深度优先遍历图,直到图中所有与V路径相通的顶点都被访问到     该遍历过程用到递归。     深度优先遍历用到了一个辅

    2024年02月08日
    浏览(43)
  • 【数据结构】邻接矩阵和邻接图的遍历

    本篇文章开始学习数据结构的图的相关知识,涉及的基本概念还是很多的。 本文的行文思路: 学习图的基本概念 学习图的存储结构——本文主要介绍邻接矩阵和邻接表 对每种结构进行深度优先遍历和广度优先遍历 话不多说,狠活献上 等等,先别急,正式学习之前先认识几个

    2024年02月04日
    浏览(52)
  • 图用邻接矩阵实现,深度优先遍历和广度优先遍历

    邻接矩阵的结构体 邻接矩阵图的建立         图的建立有多种实现方式,我这里是从键盘输入顶点数,边条数,并从键盘输入边的关系 图是带有权值的,并且把环的权值赋值为0,两个顶点没有边权值为32767。 查找顶点v,并且返回v的相关信息         通过循环去找顶点,如

    2024年02月04日
    浏览(46)
  • 数据结构-邻接矩阵的创建与遍历

    上篇文章已经介绍了邻接矩阵的具体作用与如果利用邻接矩阵寻找相邻顶点,这次介绍重点为邻接矩阵的创建与两种遍历方式 邻接矩阵的创建 其结构体需要能记录顶点、顶点数、边数及邻接矩阵,即 创建方式则为读入边数、顶点数即各边的两个顶点和权值 图的遍历 DFS(深

    2024年02月20日
    浏览(46)
  • C++构造无向图,邻接矩阵,深度优先遍历,广度优先遍历

    目录 定义无向图邻接矩阵 构造无向图 打印邻接矩阵 无向图邻接矩阵深度优先遍历(DFS) 无向图邻接矩阵广度优先遍历(BFS) 测试  完整代码 定义无向图邻接矩阵 构造无向图 1、输入总顶点数和总边数 2、依次输入顶点信息存入顶点表 3、 初始化邻接矩阵,使每个权值初始化

    2024年02月06日
    浏览(82)
  • 邻接矩阵储存图实现深度优先遍历(C++)

          目录 基本要求: 图的结构体: 图的构造: 图的深度优先(DFS): 图的打印输出: 完整代码: 测试数据:  运行结果:      通过给出的图的顶点和边的信息,构建无向图的邻接矩阵存储结构。在此基础上,从A顶点开始,对无向图进行深度优先遍历,输出遍历序列

    2024年02月03日
    浏览(46)
  • 邻接矩阵存储图并深度优先搜索遍历

    采用邻接矩阵形式存储图,对图进行优先深度搜索,并输出结果。  算法设计       用邻接矩阵存储图首先定义图的邻接矩阵存储结构,其中一维数组vertexs用来表示与顶点有关的信息,二维数组arcs用来表示图中顶点之间的关系。      之后要初始化邻接矩阵,初始化顶点个

    2024年02月06日
    浏览(50)
  • 6-1 邻接矩阵存储图的深度优先遍历

    分数 20 作者 DS课程组 单位 浙江大学 试实现邻接矩阵存储图的深度优先遍历。 其中MGraph是邻接矩阵存储的图,定义如下: 函数DFS应从第V个顶点出发递归地深度优先遍历图Graph,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按序号递增的顺序。题目保证

    2024年02月05日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包