知识总览:
邻接矩阵缺点是空间复杂度高,邻接表缺点是在找有向图的入度时时间消耗太大(要遍历所有节点)
十字链表只用于存储有向图:
十字链表存储图的话定义2个结构体:节点+弧,从某个顶点绿色的指针线一直往后找绿色的话可以找到从当前顶点往外发射的所有弧/边(该顶点出度),顺着橙色的指针一直往后找橙色可以找到所有指向该顶点的弧(该顶点入度,即解决了邻接表找有向图入度难的问题),不管是从绿色还是从橙色开始找,最后都没有边节点的时候就记为null
过程如下:
下图中的A、B、C、D四个顶点数据信息存储在一维数组里,即每个顶点都有索引编号,即A编号为0,B为1,C为2,D为3,从下图中可看出从A节点出发的边有2条,A->B,A->C,指向A节点的边有2条,D->A,C->A,
如找A节点的出度:从A节点firstout作为弧尾绿色块发出的指针指向出发(A对应的0号节点块为绿色色以下一直找绿色块发出的线),可以看到指向0和1块,即0编号节点指向1编号节点,即对应的A节点指向B节点,再从0和1块下方所在的绿色块发出的线出发指向0和2块,即0编号节点指向2编号节点,即对应的A节点指向C节点,继续从当前0和2块下方的绿色块发出的线出发,发现当前的绿色块有^标识,即再无边节点指向了,再无节点和A节点相邻了,到此结束
找A节点的入度:从A节点firstin作为弧头的橙色指针指向出发(A对应的0号节点块为橙色以下一直找橙色块发出的线),可以看到指向了2和0块,即2编号节点指向0编号节点,即对应的C节点指向A节点,再从2和0块所在的橙色块发出的线出发指向了3和0块,即3编号节点指向0编号节点,即对应的D节点指向A节点,继续从当前3和0块的橙色块发出的线出发,发现当前的橙色块有^标识,即再无边节点指向了,即再无节点和A节点相邻了,到此结束