当前位置: 首页 > news >正文

数据结构:图;邻接矩阵和邻接表

 邻接矩阵:

1.概念:

邻接矩阵是图的存储结构之一,通过二维数组表示顶点间的连接关系。

2.具体例子 :

一.无向图邻接矩阵示例:

示例图(顶点:A、B、C,边:A-B、B-C):

邻接矩阵:A B C  
A 0 1 0  
B 1 0 1  
C 0 1 0  

特点

  1. 矩阵对称,主对角线为0(无自环边)。
  2. 顶点B的度为2,对应第2行/列非零元素数量。
  3. 非零元素总数=边数×2(无向图双向性)。

二、有向图邻接矩阵示例

示例图(顶点:V1→V2、V2→V3、V3→V1):

邻接矩阵:V1 V2 V3  
V1 0   1  0  
V2 0   0  1  
V3 1   0  0  

特点

  1. 矩阵不对称(边方向性)。
  2. V3的入度=1(第3列非零数),出度=1(第3行非零数)。

三、带权图(网)邻接矩阵示例

示例图(顶点:A、B、C,边:A-B权2,B-C权5):

邻接矩阵(∞表示无穷):A   B     C  
A 0   2     ∞  
B 2   0     5  
C ∞   5     0  

特点

  1. 权值替代0/1,主对角线仍为0。
  2. 对称性保留(无向网),稀疏图可能用压缩存储。

邻接表:

概念:

邻接表是图数据结构最常用的链式存储方式,通过数组与链表结合实现顶点与边的离散化存储。

  1. 组成结构
    • 顶点表(头节点表):一维数组存储顶点信息,每个元素包含顶点值和指向首个邻接点的指针。
    • 边表(链表节点):每个顶点对应的链表,存储其所有邻接点的索引(或地址)及边权重(网图)。例如顶点A的链表包含C,表示存在边AC。

示例图结构:

假设存在无向图如下(顶点:A、B、C、D;边:A-B、A-C、B-C、B-D、C-D):

 A 
/ \
B——C \ /D 

邻接表存储实现

1. 顶点表(顺序存储)

顶点表使用数组存储,每个元素包含顶点信息和指向邻接链表的指针:

顶点表索引 | 顶点数据 | 边表头指针 
---------------------------------
0         |   A     | → 1 → 2 → NULL 
1         |   B     | → 0 → 2 → 3 → NULL 
2         |   C     | → 0 → 1 → 3 → NULL 
3         |   D     | → 1 → 2 → NULL 
2. 边表(链表存储)

每个顶点的边表以链表形式存储邻接顶点(本例使用头插法):

  • 顶点A的邻接链表:B(索引1)、C(索引2)
  • 顶点B的邻接链表:A(索引0)、C(索引2)、D(索引3)
  • 顶点C的邻接链表:A(索引0)、B(索引1)、D(索引3)
  • 顶点D的邻接链表:B(索引1)、C(索引2)
// C语言实现(无向图)
typedef struct ArcNode {    // 边表节点 int adjvex;             // 邻接顶点索引 struct ArcNode *next;   // 指向下一邻接点 
} ArcNode;typedef struct VNode {      // 顶点表节点 char data;              // 顶点数据 ArcNode *firstarc;      // 指向第一个邻接点 
} VNode, AdjList[MAX_VERTEX];typedef struct {AdjList vertices;       // 顶点表数组 int vexnum, arcnum;     // 顶点数和边数 
} ALGraph;

http://www.lryc.cn/news/538285.html

相关文章:

  • DeepSeek-R1论文阅读及蒸馏模型部署
  • OpenEuler学习笔记(三十三):在 OpenEuler 上搭建 OpenGauss 数据库环境
  • [C++]多态详解
  • 调用DeepSeek API接口:实现智能数据挖掘与分析
  • ffmpeg-cli-wrapper操作ffmpeg的工具
  • 【Qt】QObject类的主要功能
  • 学习笔记之debian的thonny开发(尚未验证)--从stm32裸机到linux嵌入式系统
  • 把 CSV 文件摄入到 Elasticsearch 中 - CSVES
  • PyQt组态软件 拖拽设计界面测试
  • 【Python爬虫(1)】专栏开篇:夯实Python基础
  • Java中的分布式(概念说明)
  • Field ‘id‘ doesn‘t have a default value
  • 蓝桥杯 Java B 组之栈的应用(括号匹配、表达式求值)
  • Hive之分区表
  • Redis之持久化
  • 有关计算机的英语单词、短语、句子
  • String、StringBuffer、StringBuilder 区别
  • shell——分支语句
  • 【vue3】实现pdf在线预览的几种方式
  • (学习总结22)Linux 基本指令1
  • Linux:用 clang 编译带 sched_ext 功能内核
  • Redis 的集群 --- 数据分开扛
  • 微信小程序中缓存数据全方位解惑
  • LeetCode 每日一题 2025/2/10-2025/2/16
  • 使用 Shiro 和 JPA 结合 MySQL 实现一个简易权限管理系统
  • DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析
  • 设计模式:代理模式
  • 141,【1】buuctf web [SUCTF 2019]EasyWeb
  • 破解微服务疑难杂症:2025年全解决方案
  • Node.js 中的 Event 模块详解