图的存储结构

来源:互联网 发布:win10安装ubuntu分区 编辑:程序博客网 时间:2024/05/21 17:27

1、邻接矩阵。使用二位数组存储。
2、邻接表。使用链表存储。每个顶点拥有自己的链表,链表存储该顶点 的邻接点。如果是有向图,链表节点个数表示该顶点的出度。
3、逆邻接表。使用链表存储。通常针对有向图,与邻接表相反,链表节点个数表示该顶点的入度。
4、十字链表,邻接表与逆邻接表的结合。适用于有向图/稀疏矩阵,方便求顶点的出度和入度。有点节点、边节点,结构体定义如下:

struct VNode{    int i; // 点索引    VNode *olink, *ilink; // 出度边,入度边指针}struct ENode{   int i, j; // 边的起点终点   ENode *right, *down; // 同一行,同一列指针   int weight; // 权重   int index; // 边索引号}

5、邻接多重表。适用于无向图,需要删除边的情况。可以用来求点的度。类比:十字链表是有向图的邻接多重表。邻接多重表不唯一。点节点、边节点结构体定义:

struct VNode{    int i; // 点索引    VNode *link; // 指向第一条边}struct ENode{    int i, j; // 点索引    ENode *ivex, *jvex; // i,j点分别邻接的其它边    int weight; // 权    int index; // 边索引}

6、边集数组。通常适用于边的条数小于点的个数时使用。使用两个数组,数组1存储点,int a[3] = {0, 1, 2}; 数组2存储边结构,结构体定义:

struct ENode{    int index; // 边索引    int start, end; // 起点终点    int weight;}
0 0