- 邻接矩阵, 多用于稠密图,记录每两个顶点之间边的信息。空间复杂度是O(|V|2);通常实际问题稠密图情况很少。
- 邻接表, 是表示图的标准方法,尤其对于稀疏图节省很多存储空间,空间复杂度是O(|E|+|V|). 对于每个顶点,使用一个表存放所有邻接的顶点。
{
adjVertexNode* next;
}
struct VertexNode
{
char* data;//以结点存储的信息为字符为例。
adjVertexNode* list; //邻接点链表。
}
一个图结构便可以由结点数组组成。考虑到数组不能用变量声明大小。所以预先给定一个足够大的数组。当然也可以用vector,List实现,那是后话了。同时图必须要包含顶点数量信息。
struct Graph
{
VertexNode VertexNode[MAX_VERTEX_NUM];
int vertexNum;
}
以上,是我们尝试构建一个图的存储结构必须,也是一定应该会想到的信息。
{
char* data;
adjVertexNode* next;
}
而恰恰这是最容易出现的错误写法!!!事实上这个数据信息已在顶点VertexNode结构体中体现了,完全没有必要这样重复写出来。
{
int adjVertexPosition;
adjVertexNode* next;
}
{
char* data;//以结点存储的信息为字符为例。
adjVertexNode* list; //邻接点链表。
int indegree;
}
struct adjVertexNode
{
int adjVertexPosition;
adjVertexNode* next;
}
struct VertexNode
{
char* data;//以结点存储的信息为字符为例。
adjVertexNode* list; //邻接点链表。
int indegree;
}
struct Graph
{
VertexNode VertexNode[MAX_VERTEX_NUM];
int vertexNum;
}
还有一些其他信息,比如边上的权值(可以存储在adjVertexNode中),图的边数,类型(可以存储在Graph中),这里没有添加,主要是避免混淆。当真正理解每个元素信息为什么需要时再做扩展。