前言
有向图有多种存储方式:邻接矩阵、邻接表、逆邻接表、十字链表等。本文主要介绍 十字链表 ,并给出其结构体定义以及相应图解。
概念
十字链表是有向图的一种链式存储结构,可以看成有向图的邻接表和逆邻接表结合出来的产物。他能根据一个结点的出度指针以及入度指针快速找到多条边以及计算结点的出入度。
和邻接表类似,结点的结构顺序存储,边的结构链式存储,这样方便边去索引到结点。
定义
结点结构是一张顺序表,里面每个元素表示图中的一个结点,而指针域中的两个指针分别为出边和入边的弧链表。
结点结构(VexNode)
数据 | 入边 | 出边 |
---|---|---|
data | firstin | firstout |
弧结构(ArcBox)
起点 | 终点 | 和本条弧有相同起点的弧 | 和本条弧有相同终点的弧 | 数据 |
---|---|---|---|---|
headvex | tailvex | hlink | tlink | data |
结构体代码
#define MAX_VERTEX_NUM 20
typedef struct ArcBox {
int headvex, tailvex; //起点和终点在顺序表中的索引
struct ArcBox *hlink, *tlink; //起点或终点相同的弧
InfoType data;
}ArcBox;
typedef struct VexNode {
ArcBox *firstin, *firstout; //出边和入边链表
VerTexType data;
}VexNode;
typedef struct {
VexNode xlist[MAX_VERTEX_NUM];
int vexnum, arcnum;
}OLGraph;