【二十五】图的存储结构--邻接矩阵法

原创 2015年07月09日 16:50:02

1、邻接矩阵法

基本思想:

这里写图片描述

示例:

这里写图片描述

从上面两个示例中也可看出:

这里写图片描述

2、数据结构的定义

这里写图片描述

顶点间边的描述需要使用二维数组,所以需要动态创建二维数组;

3、动态创建二维数组

这里写图片描述

4、算法实现

数据结构定义:

typedef struct _struct_mgraph
{
  int         count;      //保存顶点数目
  MVertex     **data;     //一维数组,保存顶点的数据的地址
  int         **matrix;   //二维矩阵的地址,保存顶点间关系--边
}TMGraph;

创建图操作:

/*
* 创建并返回有n个顶点的图
* 参数:
    data: 存放各顶点数据地址的指针数组
    n:    该图顶点的数目
* 返回值:
    如果成功,返回该图的有效地址;
    如果失败,返回NULL;
  */
MGraph* MGraph_Create(MVertex **data,int n)
{
  TMGraph *ret = NULL;
  if((data != NULL) && ( n > 0))
  {
    //动态申请图结构的空间
    ret = malloc(sizeof(TMGraph));

    if(ret != NULL)
    {
      ret->count = n;
      //申请一维数组,存放顶点数据地址
      ret->data = (MVertex**)malloc(sizeof(MVertex*) * n);

      //申请二维数组空间
      ret->matrix = (int**)malloc(sizeof(int*) * n);
      int *p = calloc(n * n,sizeof(int)); //申请空间并初始化为0
      if((ret->data != NULL) && (ret->matrix != NULL) && (p != NULL))
      {
        for(int i = 0; i < ret->count; i++)
        {
          //将节点的数据的地址,放入ret->data数组中
          ret->data[i] = data[i];   //data为参数中传入的各顶点数据的指针数组
          //真正意义上的“构造”二维数组
          ret->matrix[i] = p + i * n;
        }
      }
      else
      {
        free(p);p = NULL;
        free(ret->matrix);ret->matrix = NULL;
        free(ret->data); ret->data = NULL;
        free(ret);ret = NULL;
      }
    }
  }
  return ret;
}

添加、删除边操作:

/*
在graph所指图中的v1和v2之间加上边,且边的权为w
* 参数:
    graph:  指向图的指针
    v1:     顶点1
    v2:     顶点2
    w:      两顶点之间边的权值
* 返回值:
    如果成功,返回非0值
    如果失败,返回0
*/
int MGraph_AddEdge(MGraph* graph, int v1, int v2, int w)
{
  int iret = 1;
  TMGraph *tgraph = (TMGraph*)graph;
  iret = (tgraph != NULL);
  iret = iret && (0 <= v1) && (v1 < tgraph->count);
  iret = iret && (0 <= v2) && (v2 < tgraph->count);
  iret = iret && (w >= 0);
  if(iret)
  {
    tgraph->matrix[v1][v2] = w;
  }
  return iret;
}

/*
将graph所指图中v1和v2之间的边删除,返回权值
* 参数:
    graph:  指向图的指针
    v1:     顶点1
    v2:     顶点2
* 返回值:
    如果成功,返回两顶点之间边的权值,该值非负
    如果失败,返回-1
*/
int MGraph_RemoveEdge(MGraph* graph, int v1, int v2)
{
  int iret = -1;
  TMGraph *tgraph = (TMGraph*)graph;
  int condition = 1;
  condition = (tgraph != NULL);
  condition = condition && (0 <= v1) && (v1 < tgraph->count);
  condition = condition && (0 <= v2) && (v2 < tgraph->count);
  if(condition)
  {
    iret = tgraph->matrix[v1][v2];
    tgraph->matrix[v1][v2] = 0;
  }
  return iret;
}

5、小结

邻接矩阵法表示图结构时,实际上就是创建一个TMGraph头结构,该结构中,data时一个一维数组,用于存放顶点数据的地址,大小由顶点数目决定;因为存放的是指针,所以结构中将它声明为二级指针;每个顶点之间的关系存放在图结构的matrix二维数组中,依据顶点编号在二维数组中定位。

6、完整源码下载

文件名:mgraph-1.0.tar.gz
链接: http://pan.baidu.com/s/1qWC8bak 密码: vrys

编译步骤:
0.1 解压缩:tar -zxvf mgraph-1.0.tar.gz
0.2 进入目录:./configure
0.3 生成可执行文件:make
0.4 运行程序:./MGraph

版权声明:本文为博主原创文章,未经博主允许不得转载。

图的存储结构(邻接矩阵法)

#include #include #include "MGraph.h"//邻接矩阵表示法 #include "LinkQueue.h" typedef struct _tag_...
  • u012523688
  • u012523688
  • 2014年02月14日 23:13
  • 584

图的存储结构:邻接矩阵与邻接表(稠密图与稀疏图)

稠密图用 邻接矩阵存储 稀疏图用 邻接表存储 原因: 邻接表只存储非零节点,而邻接矩阵则要把所有的节点信息(非零节点与零节点)都存储下来。 稀疏图的非零节点不多,所以选用邻接表效率高,如果选用邻接...
  • fengxiao8
  • fengxiao8
  • 2017年11月22日 22:21
  • 366

图的存储结构—邻接矩阵、邻接表

图的存储结构:      图的存储结构相比较线性表与树来说就复杂很多。        对于线性表来说,是一对一的的关系,所以用数组或者链表均可简单存放。树结构是一对多的关系,所以我们就将数值和链表的特...
  • Y_23k_bug
  • Y_23k_bug
  • 2013年08月08日 15:59
  • 1476

图的存储方式--邻接矩阵法

1--邻接矩阵法     邻接矩阵又称数组表示,它采用两个数组表示图:一个数组表示顶点信息(一维数组),另一个数组表示个顶点的关系,这个关系数组叫做邻接矩阵(在邻接矩阵中,若为无向图,矩阵的元素为1或...
  • u012437355
  • u012437355
  • 2014年11月22日 17:24
  • 637

数据结构—图的存储结构(邻接矩阵)

邻接矩阵的代码 有向图/无向图#include #include using namespace std;#define MAX_VERTEX_NUM 20 #define INF 0 typede...
  • sunberryL
  • sunberryL
  • 2016年11月06日 14:30
  • 484

图的存储结构 --- 邻接矩阵

zau
  • dreamhougf
  • dreamhougf
  • 2014年09月12日 16:28
  • 684

7.2图的存储结构(邻接矩阵)

7.2图的存储结构(邻接矩阵)
  • qq78442761
  • qq78442761
  • 2017年02月23日 09:37
  • 848

图的存储结构-邻接矩阵

1.图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组存储图中的顶点信息,一个一维数组存储图中的边或者弧的信息 2.邻接矩阵的实现 #include "stdio.h" #include ...
  • Chenyt01
  • Chenyt01
  • 2016年04月29日 19:16
  • 282

图的存储结构(邻接矩阵)

图的存储结构   图的存储结构相比较线性表与树来说就复杂很多。 我们回顾下,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放。树结构是一对多的关系,所以我们要将数组和链...
  • zy_dreamer
  • zy_dreamer
  • 2013年06月08日 20:01
  • 831

图的存储结构 邻接矩阵

为了表现图中顶点之间的关联,我们可以使用邻接矩阵来实现图结构。所谓的邻接矩阵,就是一个反应边与边之间联系的二维数组。这个二维数组我们用matrix[numV][numV]表示,其中numV是顶点数。 ...
  • dazhiliudazhi
  • dazhiliudazhi
  • 2014年08月05日 11:22
  • 280
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【二十五】图的存储结构--邻接矩阵法
举报原因:
原因补充:

(最多只允许输入30个字)