图的存储结构:十字链表法
思维导图:
产生条件:
当用邻接矩阵存储时:空间复杂度为O(|v|^2),太大
当用邻接表法存储时:在进行入度查询时只能进行全部节点遍历,很不方便
十字链表法的定义:
**PS:**只能存储有向图
找指定顶点的所有出边:顺着绿色指针找
找指定顶点的所有入边:顺着橙色指针找
顶点表节点:
1、data:顶点数据域
2、firstin:入边单链表头指针
3、firstout:出边单链表头指针
边表节点:
1、tailvex:尾域,存放弧尾节点
2、headvex:头域,存放弧头节点
3、hlink:弧头相同的下一条边,即指向下一个边表节点的指针
4、tlink:弧尾相同的下一条边
5、info:权值
十字链表法的代码定义:
#define MaxVertexTypeNum 100
typedef char VertexType;
typedef int EdgeType;
typedef struct ArcNode{ //边表节点
int tailvex,headvex; //尾域和头域
struct ArcNode *hlink , *think; //出单链表和入单链表
//InfoType info; //权值
}ArcNode; //边表节点的类型
typedef struct VNode{ //顶点表节点
VertexType data; //顶点的数据
ArcNode *firstin,*firstout; //入单链表的头指针和入单链表的头指针
}VNode; // 邻接表类型
typedef struct{ //十字链表
VNode xlist[MaxVertexTypeNum]; //所有结点的数据
int vexnum,arcnum; //节点数和边数
}ALGraph; //十字链表的类型
性能分析:
空间复杂度:O(|v| + |E|)