邻接表创建无向图
时间: 2023-09-08 10:10:57 浏览: 202
邻接表是一种常见的图的存储方式,可以用于存储有向图和无向图。下面是邻接表创建无向图的步骤:
1. 定义一个邻接表的数据结构,一般包含两个部分:节点数组和邻接表数组。
2. 定义节点结构体,包含节点的值和指向第一个邻接节点的指针。
3. 初始化邻接表数组,将每个元素的指针初始化为 NULL。
4. 读取无向图的边信息,对于每条边 (u, v),在节点 u 和节点 v 的邻接表中分别添加一个指向对方节点的指针。
5. 如果无向图中存在自环边,即 (u, u),则在节点 u 的邻接表中只添加一个指向自己的指针。
6. 最后输出邻接表即可。
下面是用 C++ 代码实现的邻接表创建无向图的过程:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 节点结构体
struct Node {
int val; // 节点的值
Node* next; // 指向下一个邻接节点的指针
};
// 邻接表数据结构
class AdjacencyList {
public:
// 构造函数
AdjacencyList(int n) {
nodes.resize(n);
for (int i = 0; i < n; i++) {
nodes[i].val = i; // 节点值初始化为下标
nodes[i].next = NULL;
}
}
// 添加无向图边
void addEdge(int u, int v) {
Node* node_u = &nodes[u];
while (node_u->next != NULL) {
node_u = node_u->next;
}
Node* new_node_u = new Node();
new_node_u->val = v;
new_node_u->next = NULL;
node_u->next = new_node_u;
Node* node_v = &nodes[v];
while (node_v->next != NULL) {
node_v = node_v->next;
}
Node* new_node_v = new Node();
new_node_v->val = u;
new_node_v->next = NULL;
node_v->next = new_node_v;
}
// 输出邻接表
void printList() {
for (int i = 0; i < nodes.size(); i++) {
Node* node = &nodes[i];
cout << node->val << " -> ";
while (node->next != NULL) {
node = node->next;
cout << node->val << " -> ";
}
cout << "NULL" << endl;
}
}
private:
vector<Node> nodes; // 节点数组
};
int main() {
int n, m; // n 个节点,m 条边
cin >> n >> m;
AdjacencyList list(n); // 创建邻接表
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
list.addEdge(u, v); // 添加无向图边
}
list.printList(); // 输出邻接表
return 0;
}
```
上述代码中,我们首先定义了一个节点结构体 `Node`,包括节点的值和指向下一个邻接节点的指针。然后定义了一个邻接表数据结构 `AdjacencyList`,包括节点数组和邻接表数组,其中节点数组中每个元素表示一个节点,邻接表数组中每个元素表示一个节点的邻接表。在 `AdjacencyList` 类中,我们实现了添加无向图边和输出邻接表的方法。在 `main` 函数中,我们读取节点数和边数,然后创建邻接表并添加边,最后输出邻接表。
阅读全文