我的首发平台是公众号【CodeAllen】,学习交流QQ群:736386324,转载请注明出处

因为图人任意两点之间都可能存在联系,所以无法用数据元素在内存中的物理位置表示元素之间的关系

因此将数组和链表的特性结合在一起才能更好的存放

比如下面四张图其实是一个图

临接矩阵(无向图)

考虑到图是由顶点和边或弧两部分组成,合在一起比较困难,那就很自然地考虑到分为两个结构来分别存储
顶点因为不区分大小、主次,所以用一个一维数组来存储是狠不错的选择
而边或弧由于是顶点与顶点之间的关系,一维数组肯定就搞不定了,那我们不妨考虑用一个二维数组来存储
图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。

我们可以设置两个数组,顶点数组为vertex[4]={V0,V1,V2,V3},边数组arc[4][4]为对称矩阵(0表示不存在顶点间的边,1表示顶点间存在边)。

对称矩阵:所谓对称矩阵就是n阶矩阵的元满足a[i][j]=a[j][i](0<=i,j<=n)。即从矩阵的左上角到右下角的主对角线为轴,右上角的元与左下角相对应的元全都是相等的

邻接矩阵(有向图)

无向图的边构成了一个对称矩阵,貌似浪费了一半的空间,那如果是有向图来存放,会不会把资源都利用得很好呢?

可见顶点数组vertex[4]={V0,V1,V2,V3},弧数组arc[4][4]也是一个矩阵,但因为是有向图,所以这个矩阵并不对称,例如由V1到V0有弧,得到arc[1][0]=1,而V0到V1没有弧,因此arc[0][1]=0。

另外有向图是有讲究的,要考虑入度和出度,顶点V1的入度为1,正好是第V1列的各数之和,顶点V1的出度为2,正好是第V1行的各数之和。

实践代码:

// 时间复杂度为O(n+n^2+e)#define MAXVEX 100          // 最大顶点数
#define INFINITY 65535      // 用65535来代表无穷大typedef struct
{char vexs[MAXVEX];              // 顶点表int arc[MAXVEX][MAXVEX];        // 邻接矩阵int numVertexes, numEdges;      // 图中当前的顶点数和边数
} MGraph;// 建立无向网图的邻接矩阵
void CreateMGraph(MGraph *G)
{int i, j, k, w;printf("请输入顶点数和边数:\n");scanf("%d %d", &G->numVertexes, &G->numEdges);for( i=0; i < G->numVertexes; i++ ){scanf("%c", &G->vexs[i]);}for( i=0; i < G->numVertexes; i++ ){for( j=0; j < G->numVertexes; j++ ){G->arc[i][j] = INFINITY;            // 邻接矩阵初始化}}for( k=0; k < G->numEdges; k++ ){printf("请输入边(Vi,Vj)上的下标i,下标j和对应的权w:\n");        // 这只是例子,提高用户体验需要进行改善scanf("%d %d %d", &i, &j, &w);G->arc[i][j] = w;G->arc[j][i] = G->arc[i][j];            // 是无向网图,对称矩阵}
}#include<stdio.h>int main() {
int i;for(i=1;i<=9;i++) {int j;for(j=1;j<=i;j++) {printf("%d*%d=%2d    ",i,j,i*j);}printf("\n");}return 0;
}

【大话数据结构C语言】38 图的存储结构(邻接矩阵)相关推荐

  1. 数据结构考研笔记(十五)——图的存储结构邻接矩阵、邻接表、十字链表、临界多重表的概念

    图的存储结构 1.邻接矩阵 1.1有向图 1.2无向图 2.邻接表法 2.1有向图边表 2.2无向图边表 3.十字链表 4.临界多重表 十字链表与临界多重表 1.邻接矩阵 邻接矩阵法结点数为n的图G ...

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

    邻接矩阵(无向图) 因为图是由顶点和边或弧组成的,所以最好是把他们分开存储. 下面来看无向图的邻接矩阵. 图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图. 如下图所示: ...

  3. 20.0、C语言数据结构——图的存储结构

    20.0.C语言数据结构--图的存储结构 图的存储结构相比较线性表与树来说就复杂很多了: 1. 我们回顾下,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放:树结构是一对多的关系,所以我 ...

  4. 《大话数据结构》读书笔记-图

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 7.2 图的定义 7.2.1 各种图定 ...

  5. 数据结构——图:极大小连通子图、图的存储结构、图的遍历

    图的基本概念: 极大连通子图就是连通分量. 极大连通子图与连通分量在无向图(undirected graph)这个前提下是等同的概念. 极小连通子图: 减去任何一条边就不再连通. 不管树还是二叉树:n ...

  6. 数据结构之图的存储结构一及其实现

    图的存储结构 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系,即图没有顺序映像的存储结构,但可以借助数组的数据类型表示元素之间的关系. ...

  7. 数据结构——图(存储结构)

    数据结构--图 图的定义和基本术语 图的类型定义 图的存储结构 数组(邻接矩阵表示法) 网(即有权图)的邻接矩阵表示法 邻接表 邻接表表示法(链式) 图的邻接表存储表示 采用邻接表表示法创建无向网 邻 ...

  8. 【数据结构——图和图的存储结构】

    目录 一.图的定义和基本术语(Graph) (一)图的定义 (二)图的基本术语 一.图的存储结构 (一)邻接矩阵(Adjacency Matrix) 1.无向图的邻接矩阵 2.有向图的邻接矩阵 3.网 ...

  9. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

最新文章

  1. MongoDB 索引
  2. TensorFlow入门(二)简单前馈网络实现 mnist 分类
  3. Firefox 突然拉黑中国用户
  4. 使用CoordinatorLayout打造一个炫酷的详情页
  5. SSM整合activiti框架
  6. 同时阅读多个pdf文档怎么办?
  7. 【译】Immutable.js : 操作 Set -8
  8. dts数据库迁移工具_干货分享丨DM8 DTS工具使用小技巧
  9. Android中如何提取和生成mp4文件
  10. EasyUI的combobox
  11. php连接postgresql数据库
  12. 主编编辑器操作流程指南
  13. 图论算法真的那么难吗?知识点都在这了……
  14. sop4封装尺寸图_扇出型面板级封装技术的演进
  15. 超实用的容器镜像漏洞检测工具 Trivy 入门指南
  16. java调起本地摄像头,利用openCV进行人脸识别(一)
  17. 一个简单的俄罗斯方块实现
  18. 新款H3C服务器图形化界面配置raid
  19. 监控数据库的作用是什么呢?
  20. Base128编码规范

热门文章

  1. 免费影像数据下载网站汇总——2010年7月28[转自ESRI中国]
  2. oracle rollback作用,Oracle ROLLBACK语句(回滚事务)
  3. Dual-View Distilled BERT for Sentence Embedding
  4. 计算机应用基础教研设想,《计算机应用基础》集体备课方案.doc
  5. 库克是出色的苹果CEO 这六点可以证明
  6. 通过 WSL在Windows下愉快的玩耍Linux
  7. 利用Windows 自带的任务计划功能设置闹钟
  8. SIGIR22:User-controllable Recommendation Against Filter Bubbles
  9. jpg、png、svg、gif等图片格式的区别
  10. 怎么计算子网能容纳的IP数量,如何看网络标识?