你的点赞评论就是对博主最大的鼓励
当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~
🍊自我介绍
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;
}