matlab压缩邻接表转矩阵,邻接表和邻接矩阵在深度遍历中的相互转换

1:概念

邻接矩阵:就是一个一维数组存储图中订单顶点的信息, 用一个二维数组存储图中边的信息,存储顶点之间邻接关系的二维数组称为邻接矩阵。

矩阵元素为:

0ad26a28c1f7fbec4cc85dfca16ff2c3.png

邻接表:对图中每个顶点Vi简历一个单链表,第i个单链表中的节点表示依附于顶点Vi的边,这个单链表就称为顶点Vi的边表。边表的头指针和顶点和顶点的数据信息采用顺序存储,所以在邻接表中存在两种节点:顶点表节点和边表节点。如下图:

92aec6e2ac1d9729de227d58f7c13165.png

2:数据准备

邻接表:

d8940db02bc0b1e5b5bf8ad9f5dd03e8.png

邻接矩阵:

6b70c7f03be778910e3001eb8eb93c26.png

有向图:

238c5de42f280c15e6251c3296db6ede.png

3:图的创建与遍历(邻接表+深度优先+递归算法)

#include

#include

#define MAX_VERTEX_NUM 4 //顶点数

typedef int VertexType; //顶点数据类型

typedef struct ArcNode{ //弧(边)所指顶点——3

int adjvex; //相连边顶点的位置(序号)

struct ArcNode *nextarc; //指向下一个弧结点的指针

//int info; //该弧的权值,比链表多一个分量(权值)

}ArcNode; //定义弧结点类型,用于创建邻接表里的单链表

typedef struct{ //定义顶点类型——2

VertexType data; //顶点数据域

ArcNode *firstarc; //指向顶点第一条边的顶点的指针

}VNode;

typedef struct{

VNode adjlist[MAX_VERTEX_NUM]; //顶点集数组——1,即图由若干顶点组成

//int vexnum, arcnum; //顶点数及弧数

}ALGraph; // 定义图类型

int visited[MAX_VERTEX_NUM]; //记录该顶点是否访问过

void DFS(ALGraph G, int v){ //图G从顶点v开始的深度优先搜索

ArcNode *p;

printf("%5d",G.adjlist[v].data); //访问顶点v的数据域

visited[v]=1; //标记顶点v已访问

p=G.adjlist[v].firstarc; //取顶点v首边结点的头指针,深度优先

while(p){

if (!visited[p->adjvex])

DFS(G,p->adjvex); //递归

p=p->nextarc; //下一个邻接点

}

}

int main(){

ALGraph g;

//邻接表创建开始

g.adjlist[0].data=1; //设置图的顶点集数组

g.adjlist[1].data=2;

g.adjlist[2].data=3;

g.adjlist[3].data=4;

//g.vexnum = 4; //g.arcnum = 5; //设置图的顶点数及狐数,未使用

//邻接表是对邻接矩阵的改进,将邻接矩阵中非零的边(狐)连接起来构成单链表(节省空间),

//同一顶点相关联的边在同一链表里

ArcNode *arc,*p; //arc和p都是指向边结点的指针,p用于循环

//ArcNode *arc = NULL, *p = NULL;

arc = (ArcNode *)malloc (sizeof (ArcNode));

arc->adjvex = 1; //相连边顶点的位置(序号)

//arc->nextarc = NULL;

//arc->info = 0;

g.adjlist[0].firstarc = arc; //顶点1的首边指针(地址)

p = arc; //保存当前结点地址,为新建结做点准备

arc = (ArcNode *)malloc (sizeof (ArcNode));

arc->adjvex = 2;

//arc->nextarc = NULL;

//arc->info = 0;

p->nextarc = arc; //顶点1的第2条边指针

p = arc;

arc = (ArcNode *)malloc (sizeof (ArcNode));

arc->adjvex = 3;

arc->nextarc = NULL; //不可省略

//arc->info = 0;

p->nextarc = arc; //顶点1的第3条边

//

arc = (ArcNode *)malloc (sizeof (ArcNode)); //处理顶点2,方法如上

arc->adjvex = 0;

arc->nextarc = NULL;

//arc->info = 0;

g.adjlist[1].firstarc = arc;

p = arc;

arc = (ArcNode *)malloc (sizeof (ArcNode));

arc->adjvex = 2;

//arc->nextarc = NULL;

//arc->info = 0;

p->nextarc = arc;

p = arc;

arc = (ArcNode *)malloc (sizeof (ArcNode));

arc->adjvex = 3;

arc->nextarc = NULL;

//arc->info = 0;

p->nextarc = arc;

/

arc = (ArcNode *)malloc (sizeof (ArcNode)); //处理顶点3,方法如上

arc->adjvex = 0;

//arc->nextarc = NULL;

//arc->info = 0;

g.adjlist[2].firstarc = arc;

p = arc;

arc = (ArcNode *)malloc (sizeof (ArcNode));

arc->adjvex = 1;

arc->nextarc = NULL;

//arc->info = 0;

p->nextarc = arc;

/

arc = (ArcNode *)malloc (sizeof (ArcNode)); //处理顶点4,方法如上

arc->adjvex = 0;

//arc->nextarc = NULL;

//arc->info = 0;

g.adjlist[3].firstarc = arc;

p = arc;

arc = (ArcNode *)malloc (sizeof (ArcNode));

arc->adjvex = 1;

arc->nextarc = NULL;

//arc->info = 0;

p->nextarc = arc; //邻接表创建完毕

DFS (g, 3); //深度搜索,第2参数取值可以是0-3

return 0;

}

4:图的创建与遍历(邻接矩阵+深度优先+递归算法)

/*

*对使用邻接矩阵表示的图进行深度优先遍历的递归算法

*/

#include

#define MAX_VERTEX_NUM 4 //顶点数

typedef int VertexType; //顶点数据类型

typedef struct{

VertexType v[MAX_VERTEX_NUM]; //顶点集数组

int A[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵

//int vexnum, arcnum; //顶点数及弧数

}MGraph;

int visited[MAX_VERTEX_NUM]; //记录该顶点是否访问过

int DFS(MGraph G, int s){ //从图G的顶点s开始的深度优先搜索

int p = 0;

printf("%5d",G.v[s]);

visited[s]=1; //标记顶点s已被访问

for (p=0;p

if (!visited[p] && G.A[s][p]==1){

DFS(G,p); //递归

}

}

//for (;p

}

int main(){

MGraph g;

g.v[0]=1; //顶点集

g.v[1]=2;

g.v[2]=3;

g.v[3]=4;

g.A[0][0]=0;g.A[0][1]=1;g.A[0][2]=1;g.A[0][3]=1; //邻接矩阵

g.A[1][0]=1;g.A[1][1]=0;g.A[1][2]=1;g.A[1][3]=1;

g.A[2][0]=1;g.A[2][1]=1;g.A[2][2]=0;g.A[2][3]=0;

g.A[3][0]=1;g.A[3][1]=1;g.A[3][2]=0;g.A[3][3]=0;

//设置图的顶点数及狐数

//g.vexnum = 4;g.arcnum = 5; //暂时未用

DFS (g, 2); //深度优先搜索

return 0;

}

5:输出结果

a.当顶点为数组下标0时,则输出1  2   3  4

b.当顶点为数组下标1时,则输出2  1   3  4

c.当顶点为数组下标2时,则输出3  1   2  4

d.当顶点为数组下标3时,则输出4  1   2  3

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邻接矩阵是图论常用的一种表示图结构的方法,而邻接表则是另一种常见的形式。在Matlab,我们可以使用一些简单的代码将邻接矩阵转换邻接表。 首先,我们需要创建一个邻接矩阵。我们可以使用Matlab矩阵表示方法,其矩阵的行和列代表的是图的节点,而矩阵的元素则表示节点之间是否存在边。边存在时,该元素的值为1,边不存在时,该元素的值为0。 接下来,我们要创建一个空的邻接表。在Matlab,我们可以使用cell数组来实现邻接表。每个节点对应一个cell,cell存放的是与该节点相邻的节点。 然后,我们可以使用一个for循环来遍历邻接矩阵的每个元素。对于邻接矩阵的非零元素,我们可以将其对应的节点添加到邻接表的对应节点cell。 最后,我们可以输出邻接表来查看转换结果。 以下是用Matlab代码实现邻接矩阵转换邻接表的过程: ```matlab % 创建邻接矩阵 adjacencyMatrix = [0 1 1; 1 0 0; 1 0 0]; % 获取节点数量 numNodes = size(adjacencyMatrix, 1); % 创建空的邻接表 adjacencyList = cell(numNodes, 1); % 遍历邻接矩阵 for i = 1:numNodes for j = 1:numNodes if adjacencyMatrix(i, j) == 1 % 将相邻节点添加到邻接表 adjacencyList{i} = [adjacencyList{i} j]; end end end % 输出邻接表 disp('邻接表:'); for i = 1:numNodes disp(['节点 ' num2str(i) ': ' num2str(adjacencyList{i})]); end ``` 运行上述代码后,将会在命令窗口输出邻接表,展示邻接矩阵转换的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值