前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构图的基本操作及遍历(存储结构为邻接矩阵)

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

作者头像
里克贝斯
发布2021-05-21 17:05:06
9030
发布2021-05-21 17:05:06
举报

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

邻接表的存储结构遍历请看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;
}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档