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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值