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

邻接矩阵:

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)
cs 复制代码
// 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;
相关推荐
向阳@向远方10 分钟前
第二章 简单程序设计
开发语言·c++·算法
github_czy1 小时前
RRF (Reciprocal Rank Fusion) 排序算法详解
算法·排序算法
许愿与你永世安宁2 小时前
力扣343 整数拆分
数据结构·算法·leetcode
爱coding的橙子2 小时前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展
满分观察网友z2 小时前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
YuTaoShao2 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx2 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
大熊背3 小时前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
满分观察网友z3 小时前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
杰克尼4 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode