6-3图-邻接表

news/2024/7/15 17:50:01 标签: 数据结构, 链表, 图论

邻接表

回顾:
邻接矩阵:数组实现的顺序存储,空间复杂度高,不适合存储稀疏图

一.基本概念
邻接表:顺序+链式存储

第一行:A指向123三个顶点,对应BCD三个顶点(123顺序可交换,故邻接表的表示形式不唯一
第二行:B指向AEF三个顶点

在这里插入图片描述
在这里插入图片描述
1.边/弧
在这里插入图片描述

typedef struct ArcNode {
	int adjvex;//指向的结点(边)
	struct ArcNode *next;//指向结点的指针
	//InfoType info;  //边权值
}ArcNode;

2.顶点
在这里插入图片描述

typedef char VertexType;
typedef struct VNode {
	VertexType data;//当前结点的数据
	ArcNode *first;//指向的第一个结点
}VNode,AdjList[MaxVertexNum];
//用AdjList[MaxVertexNum]存储各个顶点的信息,包括data和*first

3.用邻接表存储的图

typedef struct {
	AdjList vertices;//定义顶点数组
	int vexnum, arcnum;//结点数和边数
}ALGraph;

【练习】
设计一个算法将无向图的邻接矩阵转为对应的邻接表的算法

思路:双层for循环按行遍历邻接矩阵,依次处理每个结点。对于每个结点的处理,找到1后记录所连的边(分别处理两次),采用头插法插入到邻接表中

代码实现(仅供参考)

#include <corecrt_malloc.h>
//邻接矩阵
#define MaxVertexNum 100
typedef struct {
	int Vex[MaxVertexNum];
	int Edge[MaxVertexNum][MaxVertexNum];
	int vexnum, arcnum;
}MGraph;

//邻接表
typedef struct ArcNode {//邻接表ArcNode
	int adjvex;
	struct ArcNode* next;
}ArcNode;

typedef struct {//data和first的数组表AdjList
	char data;
	ArcNode* first;
}VNode,AdjList[MaxVertexNum];

typedef struct {//暂不需要,可不写
	AdjList vertices;
	int vexnum, arcnum;
}ALGraph;

void change(MGraph g1[], AdjList g2[]) {
//g1为邻接矩阵MGraph,g2为邻接表数组AdjList
	int i, j;//用于双层for循环
	ArcNode* p;//指向待插入结点
	int n = g1->vexnum;//n表示总结点数,用于for循环遍历邻接矩阵
	for (i = 0; i < n; i++)//将邻接矩阵的first指针域置空
		g2[i]->first = 0;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			if (g1->Edge[i][j] == 1) {//找到1
				p = (ArcNode*)malloc(sizeof(ArcNode));//建立新结点,p指向
				p->adjvex = j;//p赋值为要指向的边(如1→5,p指向新结点5)
				//头插法建立
				p->next = g2[i]->first;
				g2[i]->first = p;
				
				//处理反向边(如1←5),同上
				p = (ArcNode*)malloc(sizeof(ArcNode));
				p->adjvex = i;
				p->next = g2[j]->first;
				g2[j]->first = p;
			}
}

二.性质
(1)无向图
邻接表第一行A到B一条边
邻接表第二行B到A一条边
相同边重复计算两次
故:边结点的数量是2|E|
整体空间复杂度O(|V|+2|E|)

概念:
顶点结点:由顶点域和指向第一条邻接边的指针域构成
边结点:由邻接点域和指向下一跳邻接边的指针域构成

(1.1)度
看邻接表第一行:A的度为A相连的BCD,度为3
在这里插入图片描述
(2)有向图
无重复计算
边结点的数量是|E|
整体空间复杂度O(|V|+|E|)

(2.1)度
E的出度=2(E到1、E到2)
A的入度=2(C到0,D到0)
度=入度+出度
E的度=2
A的度=3
在这里插入图片描述
(3)综合对比
在这里插入图片描述
【逆邻接表】
在这里插入图片描述
邻接表一行表示该顶点的指出
逆邻接表一行表示该顶点的指入
在这里插入图片描述


http://www.niftyadmin.cn/n/816354.html

相关文章

Linux系统(X64)7 安装Oracle11g完整安装图文教程另附基本操作

在linux 7.6 安装 oracle 11g mount 挂载yum源 yum –y sys* gcc* lib* sys* ma* un* gli* elf* bin* com* 一&#xff0e;修改操作系统核心参数 在Root用户下执行以下步骤&#xff1a; 1&#xff09;修改用户的SHELL的限制&#xff0c;修改/etc/security/limits.conf文件 输…

6-4图-十字链表与邻接多重表

十字链表、邻接多重表 一.基础知识 十字链表&#xff1a;存储有向图 邻接多重表&#xff1a;存储无向图 二.进阶 1.十字链表&#xff08;有向图&#xff09; &#xff08;1&#xff09;顶点结点 data&#xff1a;当前顶点&#xff0c;如A firstin&#xff1a;指入&#xff08…

综合

python 虚拟环境 https://blog.csdn.net/qq_32227401/article/details/79657685 mysql内置函数: https://blog.csdn.net/sinat_38899493/article/details/78710482 sqlalchemy 原生sql 操作: https://blog.csdn.net/qq_28893679/article/details/77453540 使用Cobbler批量部署…

6-5图-图的基本操作

图的基本操作 一.先学几个单词 adjacent [əˈdʒeɪsnt] 邻近的adj. neighbors [ˈneɪbəz] 邻近v.n. insert [ɪnˈsɜːt , ˈɪnsɜːt] 插入v. vertex [ˈvɜːteks] 顶点n. edge [edʒ] 边n. remove [rɪˈmuːv] 移开v. 二.图的基本操作 Adjacent(G,x,y)&#xff1a;图…

6-6图-深度优先搜索DFS

深度优先搜索 一.基础知识 Depth-First-Search DFS深度优先搜索 往深处走 先看树 访问顺序12563478 过程&#xff1a;首先访问1&#xff0c;并置1标记已访问&#xff1b;然后访问与a邻接且未被访问的顶点2&#xff08;FirstNeighbor&#xff09;&#xff0c;标记2为已访问&a…

bzoj3029 守卫者的挑战 (多维dp)

题面&#xff1a; 打开了黑魔法师Vani的大门&#xff0c;队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地。突然&#xff0c;眼前一道亮光闪过。“我&#xff0c;Nizem&#xff0c;是黑魔法圣殿的守卫者。如果你能通过我的挑战&#xff0c;那么你可以带走黑魔法…

这是一个蒟蒻的计划……QAQ

感觉像我这种拖拉的人很有可能是完成不了的&#xff0c;挂上来相当于监督我自己啦QWQ 加粗了的是链接link&#xff01; 【学习计划】 【√】1.去看Trie树&#xff01;&#xff01;&#xff01; yyb学长的blog 2.KMP还有AC自动机 先贴两个链接在这里吧&#xff1a;KMP AC自动…

Android 程序结构

Android程序在创建时&#xff0c;Android Studio就为其构建了基本结构&#xff0c;设计者可以在此结构上开发应用程序&#xff0c;因此掌握Android程序结构是很有必要的。 下面以HelloWorid程序为例&#xff0c;分析Android 程序结构&#xff1a; 在图中&#xff0c;可以看到一…