用链表实现有向图的邻接表,其中节点的值为char类型,给出C++代码
时间: 2024-02-26 14:58:03 浏览: 117
以下是用链表实现有向图的邻接表的C++代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 邻接表中的节点
struct Node {
char val; // 节点的值
Node* next; // 指向下一个邻接节点的指针
Node(char v) : val(v), next(nullptr) {}
};
// 有向图的邻接表
class Graph {
private:
vector<Node*> adjList; // 邻接表的数组
public:
Graph(int n) {
adjList.resize(n, nullptr); // 初始化邻接表数组
}
// 添加有向边
void addEdge(char src, char dest) {
int srcIdx = src - 'a'; // 源节点在邻接表数组中的下标
int destIdx = dest - 'a'; // 目标节点在邻接表数组中的下标
Node* newNode = new Node(dest); // 创建新的节点,表示从源节点指向目标节点
newNode->next = adjList[srcIdx]; // 将新节点插入到源节点的邻接表中
adjList[srcIdx] = newNode;
}
// 打印邻接表
void printAdjList() {
for (int i = 0; i < adjList.size(); i++) {
Node* curr = adjList[i];
cout << (char)('a' + i) << " -> ";
while (curr != nullptr) {
cout << curr->val << " ";
curr = curr->next;
}
cout << endl;
}
}
};
int main() {
Graph g(5); // 创建5个节点的有向图
g.addEdge('a', 'b'); // 添加有向边
g.addEdge('a', 'c');
g.addEdge('b', 'c');
g.addEdge('b', 'd');
g.addEdge('c', 'd');
g.addEdge('d', 'e');
g.printAdjList(); // 打印邻接表
return 0;
}
```
上述代码中,我们用一个vector来存储邻接表,vector的下标表示节点的值减去字符'a'的值,这样就能得到节点在邻接表数组中的下标。每个邻接表中的节点是一个单向链表,表示从当前节点指向的下一个节点。在添加有向边时,我们只需在源节点的邻接表中插入一个新节点,表示从源节点指向目标节点。最后,调用printAdjList()函数打印邻接表。
阅读全文