图的邻接矩阵和邻接表

本文介绍了图的邻接矩阵存储方式,用于表示无向图和有向图的边信息。邻接矩阵是一个二维数组,对于无向图是对称的,有向图则不一定对称。在无向图中,对角线元素为0,而在有向图中,主对角线元素仍为0。当边数较少时,邻接矩阵可能导致存储空间浪费。为解决这一问题,可以使用单链表存储边关系,降低空间消耗。文中还给出了创建无向网图邻接矩阵的C语言代码示例,并展示了打印邻接矩阵的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图的邻接矩阵存储方式是两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(即为邻接矩阵)存储图中的边或弧的信息
设图G有n个顶点,则邻接矩阵为一个n×n的方阵,定义为:
在这里插入图片描述
抽象数据类型如下

typedef struct Graph
{
	char vexs[MAXSIZE];
	int arc[MAXSIZE][MAXSIZE];
	int numVertexes, numEdges;
}MGraph;

我们设置一个顶点数组为vertex[]={v0,v1,v2,v3…} 边数组为一个对称矩阵,该矩阵关于对角线对称,对角线的元素均为0,因为对角线的元素如 **arc[0][0],arc[1][1]**都是顶点到自身的边,而因为是无向图,所以关于对角线对称。
在这里插入图片描述
对于有向图,主对角线的元素依旧为零,但是因为为有向图,所以不一定对称。而有向图的入度和出度入度为v1列各数之和,出度为v1列各数之和。
如果对于带有权值的有向图,设图G是网图,有n个顶点,则邻接矩阵是一个n×n的方阵,定义为
在这里插入图片描述
邻接矩阵代码如下

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define INFINITY 65535
typedef struct Graph
{
	char vexs[MAXSIZE];
	int arc[MAXSIZE][MAXSIZE];
	int numVertexes, numEdges;
}MGraph;
//建立无向网图的邻接矩阵
void CreatMGraph(MGraph* G)
{
	int m, n, w;
	printf("请输入你的顶点数和边数\n");
	scanf("%d %d", &G->numVertexes, &G->numEdges);
	for (int i = 0; i < G->numVertexes; i++)
		scanf(&G->vexs[i]);
	for (int i = 0; i < G->numVertexes; i++)
		for (int j = 0; j < G->numVertexes; j++)
			G->arc[i][j] = INFINITY;
	for (int i = 0; i < G->numEdges; i++)
	{
		printf("请输入边(vi,vj)上的下标,下标和权\n");
		scanf("%d %d %d", &n, &m, &w);
		G->arc[n][m] = w;
		G->arc[m][n] = w;
	}
}
void printMGraph(MGraph* G)
{
	for (int i = 0; i < G->numVertexes; i++)
	{
		for (int j = 0; j < G->numVertexes; j++)
			printf("%10d", G->arc[i][j]);
		putchar('\n');
	}
}
int main()
{
	MGraph* G = (MGraph*)malloc(sizeof(MGraph));
	CreatMGraph(G);
	printMGraph(G);
	return 0;
}

而对于邻接矩阵来说,如果存在定点较多,边数较少的稀疏图,我们发现,对于存储空间的浪费很大,所以我们依旧用一个数组存储顶点信息,但是每个顶点的边关系我们用单链表来存储。
在这里插入图片描述
所以抽象数据类型为

在这里插入代码片
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值