专栏首页图灵技术域数据结构图的基本操作及遍历(存储结构为邻接矩阵)

数据结构图的基本操作及遍历(存储结构为邻接矩阵)

数据结构图的基本操作及遍历

邻接表的存储结构遍历请看https://www.omegaxyz.com/2017/05/16/graphofds/

实验目的:

编写程序,建立该图的邻接矩阵存储。

基于上面所建立的存储结构,编程实现深度优先和广度优先搜索算法。

头文件

C++

#include <stdio.h>
#include <stdlib.h>
 
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
 
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
 
typedef char VertexType; /* 顶点类型应由用户定义 */
typedef int EdgeType; /* 边上的权值类型应由用户定义 */
 
#define MAXSIZE 9 /* 存储空间初始分配量 */
#define MAXEDGE 15
#define MAXVEX 9
#define INFINITY 65535
 
typedef struct
{
    VertexType vexs[MAXVEX]; /* 顶点表 */
    EdgeType arc[MAXVEX][MAXVEX];/* 邻接矩阵,可看作边表 */
    int numVertexes, numEdges; /* 图中当前的顶点数和边数 */
}MGraph;

文中使用到的队列请使用C++  <queue>头文件或自己写

函数

①图的构建

void CreateMGraph(MGraph *G)
{
    int i, j;
 
    G->numEdges=12;
    G->numVertexes=9;
 
    G->vexs[0]='0';
    G->vexs[1]='1';
    G->vexs[2]='2';
    G->vexs[3]='3';
    G->vexs[4]='4';
    G->vexs[5]='5';
    G->vexs[6]='6';
    G->vexs[7]='7';
    G->vexs[8]='8';
 
 
    for (i = 0; i < G->numVertexes; i++)/* 初始化图 */
    {
        for ( j = 0; j < G->numVertexes; j++)
        {
            G->arc[i][j]=0;
        }
    }
 
    G->arc[0][2]=1;
 
    G->arc[1][3]=1;
    G->arc[1][4]=1;
 
    G->arc[2][4]=1;
    G->arc[2][5]=1;
 
    G->arc[3][6]=1;
    G->arc[3][7]=1;
 
    G->arc[4][7]=1;
    G->arc[4][8]=1;
 
    G->arc[5][7]=1;
 
    G->arc[6][7]=1;
    G->arc[7][8]=1;
 
 
    for(i = 0; i < G->numVertexes; i++)
    {
        for(j = i; j < G->numVertexes; j++)
        {
            G->arc[j][i] =G->arc[i][j];
        }
    }
 
}
 
Boolean visited[MAXVEX]; //访问标志的数组

②DFS遍历

C++

void DFS(MGraph G, int i)
{
    int j;
    visited[i] = TRUE;
    printf("%c ", G.vexs[i]);/* 打印顶点,也可以其它操作 */
    for(j = 0; j < G.numVertexes; j++)
        if(G.arc[i][j] == 1 && !visited[j])
            DFS(G, j);/* 对为访问的邻接顶点递归调用 */
}
 
/* 邻接矩阵的深度遍历操作 */
void DFSTraverse(MGraph G)
{
    int i;
    for(i = 0; i < G.numVertexes; i++)
        visited[i] = FALSE; /* 初始所有顶点状态都是未访问过状态 */
    for(i = 0; i < G.numVertexes; i++)
        if(!visited[i]) /* 对未访问过的顶点调用DFS,若是连通图,只会执行一次 */
            DFS(G, i);
}

③BFS遍历

C++

void BFSTraverse(ALGraph G,VertexType x)
{
    struct
    {
        ArcNode *Q[Maxsize];
        int front,rear;
    }Que;
    Que.front=Que.rear;
    int k,i;
    k=LocateX(G,x);
    visited[k]=1;
    printf("%d /",G.vertices[k].data);
    Que.rear=(Que.rear+1)%Maxsize;
    Que.Q[Que.rear]=G.vertices[k].firstarc;
    ArcNode *p;
    while(Que.rear!=Que.front)
    {
        Que.front=(Que.front+1)%Maxsize;
        p=Que.Q[Que.front];
        while(p)
        {
            if(visited[p->adjvex]==0)
            {
                visited[p->adjvex]=1;
                printf("%d /",G.vertices[p->adjvex].data);
                Que.rear=(Que.rear+1)%Maxsize;
                Que.Q[Que.rear]=G.vertices[p->adjvex].firstarc;
            }
            p=p->nextarc;
        }
    }
}

MAIN函数

C++

int main(void)
{
    MGraph G;
    printf("--------------徐奕 软件工程 E21614061--------------------\n");
    CreateMGraph(&G);
    printf("\n深度遍历序列为:");
    DFSTraverse(G);
    printf("\n广度遍历序列为:");
    BFSTraverse(G);
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据结构:图的存储结构之邻接矩阵

    图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息...

    s1mba
  • 图的邻接矩阵数据结构(基础) 顶

    算法之名
  • 算法与数据结构(四) 图的物理存储结构与深搜、广搜(Swift版)

    开门见山,本篇博客就介绍图相关的东西。图其实就是树结构的升级版。上篇博客我们聊了树的一种,在后边的博客中我们还会介绍其他类型的树,比如红黑树,B树等等,以及这些...

    lizelu
  • PHP数据结构-图的遍历:深度优先与广度优先

    在上一篇文章中,我们学习完了图的相关的存储结构,也就是 邻接矩阵 和 邻接表 。它们分别就代表了最典型的 顺序存储 和 链式存储 两种类型。既然数据结构有了,那...

    硬核项目经理
  • 图(graph) 原

    图是非线性数据结构,是一种较线性结构和树结构更为复杂的数据结构,在图结构中数据元素之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。

    云飞扬
  • 为什么我没写过「图」相关的算法?

    经常有读者问我「图」这种数据结构,因为我们公众号什么数据结构和算法都写过了,唯独没有专门介绍「图」。

    labuladong
  • 数据结构与算法 - 图的邻接表 (思想以及实现方式)

    cMusketeer
  • 数据结构——图

    设图 A = (V, E) 有 n 个顶点,则图的邻接矩阵是一个二维数组 A.Edgen,定义为:

    若尘_
  • 算法学习记录

    MiChong
  • 《offer来了》第四章学习笔记

    一个单向链表的节点(Node)可分为两部分:第 1 部分为数据区(data),用于保存节点的数据信息;第 2 部分为指针区,用于存储下一个节点的地址,最后一个节...

    编程之心
  • 数据结构:手把手带你了解 ”图“ 所有知识!(含DFS、BFS)

    本文主要讲解 数据结构中的图 结构,包括 深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树算法等,希望你们会喜欢。

    Carson.Ho
  • 小朋友学数据结构(16):基于邻接矩阵的的深度优先遍历和广度优先遍历

    这两个图其实是一样的,只是画法不同罢了。第一张图更有立体感,第二张图更有层次感,并且把A点置为顶点(事实上图的任何一点都可以做为顶点)。

    海天一树
  • [数据结构与算法] 图结构

    图是一种非线性的数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。 如下图:

    时间静止不是简史
  • 数据结构(十六)——图

      我们通过几篇文章介绍了树的概念以及树的相关应用。本文给大家介绍数据结构中最后一种数据结构——图。本文分别从图的概念、图的两种遍历等角度给大家介绍图的相关知识...

    一计之长
  • C++STL实现图的深度与广度优先遍历(BFS&DFS)

    C语言数据结构图的基本操作及遍历(存储结构为邻接矩阵)请查看:https://www.omegaxyz.com/2017/05/17/graphofds2/

    里克贝斯
  • 学习数据结构的框架思维

    今天分享一篇小吴的读者 labuladong 的投稿,文章里面提到的框架思维感觉很有用,希望对大家学习数据结构有帮助。

    五分钟学算法
  • 数据结构学习笔记(图)

    希希里之海
  • 【推荐收藏】学习数据结构的框架思维

    本文是对整个数据结构及算法的总体框架认识,旨在帮助读者自上向下,从整体到细节,从抽象到具体地看待数据结构。希望通过本文读者能在对数据结构的学习和理解上能有更高层...

    Sam Gor
  • 算法:图的广度优先遍历(Breadth First Search)

    图的遍历和树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程就叫做图的遍历(Traverse Graph)。 图...

    s1mba

扫码关注云+社区

领取腾讯云代金券