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;
}