邻接表是图的一种常用存储方式,它通过一个数组来存储图中的顶点,数组的每个元素表示一个顶点,每个顶点都有一个指针指向与之相邻的顶点列表。
邻接表的主要优点是节省了存储空间,尤其在稀疏图中,只存储了实际存在的边。另外,邻接表能够高效地查询一个顶点的邻居。但是,它的缺点是在查询两个顶点之间是否有边时需要遍历整个邻边表,时间复杂度较高。
下面是一个使用邻接表存储图的示例代码:
c++
#include<iostream>
#include<vector>
using namespace std;
// 邻接表节点
struct AdjListNode {
int dest; // 目标顶点
struct AdjListNode* next; // 指向下一个节点
};
// 邻接表头节点
struct AdjList {
struct AdjListNode* head; // 链表头指针
};
// 图
class Graph {
private:
int V; // 图的顶点数
vector<struct AdjList> adj; // 邻接表
public:
// 构造函数
Graph(int V) {
this->V = V;
adj.resize(V);
for (int i = 0; i < V; ++i) {
adj[i].head = NULL;
}
}
// 添加边
void addEdge(int src, int dest) {
struct AdjListNode* newNode = new AdjListNode;
newNode->dest = dest;
newNode->next = adj[src].head;
adj[src].head = newNode;
newNode = new AdjListNode;
newNode->dest = src;
newNode->next = adj[dest].head;
adj[dest].head = newNode;
}
// 打印图
void printGraph() {
for (int v = 0; v < V; ++v) {
struct AdjListNode* pCrawl = adj[v].head;
cout << "顶点 " << v << " 的邻接列表为:";
while (pCrawl) {
cout << " -> " << pCrawl->dest;
pCrawl = pCrawl->next;
}
cout << endl;
}
}
};
int main() {
Graph graph(5);
graph.addEdge(0, 1);
graph.addEdge(0, 4);
graph.addEdge(1, 2);
graph.addEdge(1, 3);
graph.addEdge(1, 4);
graph.addEdge(2, 3);
graph.addEdge(3, 4);
graph.printGraph();
return 0;
}
在上面的代码中,Graph
类表示一个图,它有一个私有成员变量V
表示图的顶点数,一个私有vector<struct AdjList> adj
表示邻接表。构造函数用来初始化邻接表,addEdge
方法用来添加边,printGraph
方法用来打印图的邻接表。
在main
函数中,我们创建了一个含有5个顶点的图,并添加了一些边,然后调用printGraph
方法打印图的邻接表。
以上就是C++中邻接表的详解。