十字链表表示法
邻接表的缺点
十字链表
十字链表(Orthogonal List)
是有向图的另一种链式存储结构,可以看成是将有向图的邻接表和逆邻接表结合起来形成的一种链表。
有向图中的每一条弧对应十字链表中的一个弧结点,同时有向图中的每个顶点在十字链表中对应有一个结点,叫做顶点结点。
其顶点结点的结构为
- data:顶点的数据
- firstin:第一条入弧
- firstout:第一条出弧
- tailvex:尾域,指向弧尾顶点在图中的位置
- headvex:头域,指向弧头顶点在图中的位置
- hlink:指向弧头相同的下一条弧
- tlink:指向弧尾相同的下一条弧
- info(如果有):指向该弧的相关信息
示例
如下有向图
则它的十字链表为
存储结构
#define MAX_VERTEX_NUM 20
#define MAX_NAME 3 // 顶点字符串的最大长度+1
typedef int InfoType; // 网的权值类型
typedef char VertexType[MAX_NAME]; // 顶点类型为字符串
// 有向图的十字链表存储表示
struct ArcBox // 弧结点
{
int tailvex, headvex; // 该弧的尾和头顶点的位置
struct ArcBox *hlink, *tlink; // 分别为弧头相同和弧尾相同的弧的链域
InfoType *info; // 该弧相关信息的指针,可指向权值或其他信息
};
struct VexNode // 顶点结点
{
VertexType data;
struct ArcBox *firstin, *firstout; // 分别指向该顶点第一条入弧和出弧
};
struct OLGraph // 图
{
struct VexNode xlist[MAX_VERTEX_NUM]; // 表头向量(数组)
int vexnum, arcnum; // 有向图的当前顶点数和弧数
};