图的存储——邻接矩阵


你的点赞评论就是对博主最大的鼓励
当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~


🍊自我介绍

  Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”“内容共创官” ,现在我来为大家介绍一下有关物联网-嵌入式方面的内容。


🍊图存储简介

图的存储相对于我们前面学习的线性表和树来说就显得更为复杂了。首先,我们需要了解两个概念,叫做“顶点的位置”
或者“邻接点的位置”。从图的逻辑上说,图中任何一个顶点都可以被看成是第一个顶点,任何一个顶点的邻接点也不存在层次关系。如下图:
在这里插入图片描述
在这里插入图片描述
  上面的2个图,若是我们仔细的观察可以发现,他们其实是一个图,只不过是顶点的位置不一样而已。所以,给人感觉是两张图。既然,我们图形的变化可能存在多种多样的!下面我们就来介绍邻接矩阵的用法。

🍊邻接矩阵

思维简介

  对于一个具有n个节点的图,我们可以使用n*n的矩阵来表示他们之间的邻接关系,既然是矩阵,我们肯定就会想到我们C语言之中的二维数组。如下图,若是我们想要存储下面这个图案该怎么办呢?
在这里插入图片描述

代码实现思路

  我们用二维数组来表示,我们把有两个顶点相连的置为1,没有相连接的顶点置为0(自己和自己也表示没有关系)。

在这里插入图片描述

本质

  图的邻接矩阵存储方式就是用两个数组来表示图,一个一维数组存储图中的顶点信息,一个二维数组(称为邻接矩阵)存储图中的边的信息

数据类型的设计

typedef int vertex_t; //存储顶点编号的数据类型(编号为0,1,2,3,4)
#define N 5
typedef struct
{
	vertex_t V[N];//存储顶点信息的数组
	int matrix[N][N];//存储顶点关系集合的二维数组
}graph_t;

代码演示

在这里插入图片描述

根据上面的图输出下面的表格:
在这里插入图片描述

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef  int vertex_t; //存储定点编号的数据类型(0,1,2,3,4)

#define N 5  //5个定点

typedef struct
{
	//存储顶点信息的数组
	vertex_t v[N];
	int maxtrix[N][N]; //存储顶点关系集合的二维数组
}graph_t;


//1.创建空的图,分配空间,填入顶点的编号
graph_t *create_graph()
{
	graph_t *g = NULL;
	int i = 0;

	g = (graph_t *)malloc(sizeof(graph_t));
	memset(g,0,sizeof(graph_t));

	//填入顶点编号信号
	for(i = 0;i < N;i++)
	{
		g->v[i] = i; 	
	}

	return g;
}	

//2.输入边的信息
void input_edge(graph_t *g)
{
	int i = 0,j = 0;

	printf("please input link (v0,v1) (v0,v2) ...\n");


	//返回正确输入元素的个数 ---- (V0,V1) (V1,V2) ....(V3,V4) \n
	while(scanf("(V%d,V%d)",&i,&j) == 2)
	{
		g->maxtrix[i][j] = g->maxtrix[j][i] = 1;	
		getchar(); //读取用户输入的' '
	}

	//清除缓冲区,最后读取回车
	while(getchar() != '\n');
}

//3.输出邻接矩阵
void print_matrix(graph_t *g)
{
	int i = 0,j = 0;
	printf("%3c",' ');
	//输出头部信息
	for(i = 0;i < N;i++)
	{
		printf("V%-2d",i);   
	}
	putchar('\n'); //printf("\n");

	for(i = 0;i < N;i++)
	{
		printf("V%-2d",i);   
		for(j = 0;j < N;j++)	
		{
			printf("%-3d",g->maxtrix[i][j]);	
		}
		putchar('\n');
	}

	return ;
}

int main()
{
	graph_t *g = NULL;	

	g = create_graph();

	input_edge(g);

	print_matrix(g);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值