图的存储结构:
邻接表虽然很好,但也有不足,列如对有向图的处理上,有时候需要在建立一个逆邻接表。
默认的邻接表是关注的顶点的出度和弧尾的,如果我们要关注有向图顶点的入度和弧头,我们就需要在建立个逆邻接表了。
所以,有没有可能把邻接表和逆邻接表结合起来呢?
十字链表:
为此我们要重新定义顶点表节点结构:
Data | firstIn | firstOut |
firstIn:表示第一个入边表的指针
firstOut:表示第一个出边表的指针
然后重新定义边表节点结构:
tailVex | headVex | headLink | tailLink |
tailVex:表示弧起点的顶点下标
headVex:表示弧终点的顶点下标
则此边表表示的一条弧(与邻接表的表示一个顶点所不同)
这样不添加fistIn入度的信息就和邻接表是相似的了。(只是边表表示的一个弧而不是一个顶点)。
给上面的图解添加入度的信息(firstIn)
V0顶点的入度为v1->v0,则v0的firstIn的指针域指向v1->v0这条弧,v0顶点的第二个入度为v2->v0,则表示v1->v0这条弧的链表的headLink指针域指向v0的下个入度v2->v0弧,
因为v0顶点除此之外在没有入度了,则表示v2->v0弧的链表的入度指针域为空指针。
V1顶点的入度为v2->v1,则v1的firstIn指针指向v2->v1这条弧,由于v1顶点只有一条入度弧,则v2->v1弧的链表的headLink指针域为空。
同理v2的入度为v1-v2,则指向v1-v2弧的链表
总结:
顶点数组:数组元素为一个结构体,数据元素,两个指针域,firstOut指向出度链表
firstIn指向入度。
边表(表示一个弧):为一个单链表,元素为一个4个元素的结构体,tailVex为该弧的起始顶点,headVex为该弧的终点顶点。
tailLink指针域:指向该顶点的下一个出度。
headLink指针域:指向该顶点的下个入度。