十字链表是有向图的另一种链式存储结构。可以看成是将有向图的邻接表和逆邻接表结合起来得到的一种链表。
建立十字链表的时间复杂度和建立邻接表是相同的,十字链表解决了邻接表方便求出度不便求入度的问题。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define MAX_VERTEX_NUM 20
#define INFINITY INT_MAX
typedef int Status;
#define OK 1
#define ERROR 0
typedef int InfoType; //定义弧相关信息为整形
typedef char VertexType; //定义顶点类型为字符型
typedef struct ArcNode
{
int tailvex,headvex; //该弧所指向的顶点在顺序结构中的位置
struct ArcNode *hlink,*tlink; //分别为与该弧头邻接(同一尾结点)的下一条弧的指针和与该弧尾邻接(同一尾结点)的下一条弧的指针
InfoType *info; //该弧相关信息的指针
}ArcNode; //弧结构
typedef struct VNode
{
VertexType data; //顶点
ArcNode *firstin,*firstout; //分别为该顶点的第一条入弧和第一条出弧
}VNode,OrtList[MAX_VERTEX_NUM]; //顶点结构
typedef struct
{
OrtList vertices; //顶点数组
int vexnum,arcnum; //顶点数和弧数
}OLGraph; //邻接表表示的图结构
Status CreateDG(OLGraph *G);
int LocateVex(OLGraph G,VertexType v);
int main()
{