图Graph

存储结构:

1、邻接矩阵存储

typedef struct

{

  char vex[MAXVEX];//顶点数

  int arc[MAXVEX][MAXVEX];//邻接矩阵

  int numVextexes,numEdges;//顶点数和边数

}MGraph;

边数相对节点较少时会浪费内存,因此可以使用链表实现

2、邻接表

此为边表

typedef struct EdgeNode

{

  int adjvex;//存储顶点对应的下标

  int weight;

  struct EdgeNode* next;//指向下一个邻接点

}EdgeNode;

此为顶点表

typedef struct VertexNode

{

  int data;//存储顶点信息

  EdgeNode *firstedge;//指向第一个以该顶点为顶点的弧结点

}VertexNode[MAXVEX];

此为图表

typedef struct

{

  VertexNode adjList;//顶点表节点

  int numVertex,numEdges;//顶点数和边数

}GraphAdjList;

邻接链表和逆邻接链表可以分别解决出度和入度的问题,但是不能同时考虑,因此引入十字链表。

3、十字链表 (有向图)

顶点表结构为: data firstin firstout

边表结构为:tailvex headvex hlink tlink info

firstin,firstout:分别指向以该节点为弧头和弧尾的弧结点

tailvex:弧尾  headvex:弧头 hlink:指向弧头相同的下一条边 tlink:指向弧尾相同的下一条边

首先将顶点结点和所有的弧结点全部写出,然后分别将指针指向相应的弧。

注意,此处所有的指针都是指向弧的,与之前的相同。

原文地址:https://www.cnblogs.com/jiangnanrain/p/4419106.html