江小南

V1

2023/03/11阅读:17主题:萌绿

【数据结构】图的存储-邻接矩阵法、邻接表法、十字链表与邻接多重表(下)

2. 邻接表(顺序+链式存储)

说明:*first指向第一条边,但是把哪一条看成第一条边,并不唯一。

#define MaxVertexNum 100  // 顶点数目的最大值
// 边/弧
typedef struct ArcNode{
    int adjvex;  // 边/弧指向哪个结点
    struct ArcNode *next;  // 指向下一条弧的指针
    // InfoType info;  // 边权值
}ArcNode;

// 顶点
typedef struct VNode{
    VertexType data;  // 顶点信息
    ArcNode *first; // 第一条边/弧
}VNode,AdjList[MaxVertexNum];

// 用邻接表存储的图
typedef struct{
    AdjList vertices;
    int vexnum,arcnum;
}ALGraph;

类比树的孩子兄弟表示法:顺序存储各个结点,每个结点中保存孩子链表头指针。

1. 性能分析

对于无向图,如图蓝色区域,从A到B和从B到A实际是同一条,这就造成了边结点的数量是2|E|,整体空间复杂度为O(|V|+2|E|)。

对于有向图,边结点的数量是|E|,整体空间复杂度为O(|V|+|E|)。

2. 思考

如何求顶点的度、入度、出度?如何找到与一个顶点相连的边/弧?

答:

  • 对于无向图,如果要找A结点的度,那么顺着A结点向后遍历即可,例如找到了1,2,,3,三个结点,边也就找到了。
  • 对于有向图,如果要找A结点的出度,那么顺着A结点向后遍历即可,例如找到了1,一个结点,弧也就找到了。但是对于入度会比较麻烦,需要对所有的结点进行遍历。

3. 十字链表

十字链表只用于存储有向图

说明:以A结点为例,顺着绿色往后找,能找到所有从A发出的边。顺着橙色往后找,能找到所有指向A的边。

性能分析

空间复杂度:O(|V|+|E|)

如何找到指定顶点的所有出边?——顺着绿色线路找。

如何找到指定顶点的所有入边?―—顺着橙色线路找。

4. 邻接多重表

邻接多重表只适用于存储无向图

说明:以A结点为例,A的编号为0,顺着箭头往后找,找到了蓝色标注的结点,由于A的编号为0,于是我们再顺着橙色的箭头往后找,找到了红色标注的结点。其余类似。

性能分析

由于每条边只对应一份数据,空间复杂度为O(|V|+|E|)。

删除边、删除结点等操作很方便。

5. 小结

分类:

后端

标签:

数据结构与算法

作者介绍

江小南
V1