失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【大话数据结构C语言】38 图的存储结构(邻接矩阵)

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

时间:2022-04-30 00:20:38

相关推荐

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

我的首发平台是公众号【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 图的存储结构(邻接矩阵)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。