使用邻接表实现一个图,功能包括图的建立; 图的销毁; 深度优先遍历图; 广度优先遍历图;
时间: 2023-06-26 20:10:29 浏览: 113
建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc
5星 · 资源好评率100%
好的,下面是使用邻接表实现图的代码实现(C++):
```c++
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 100;
// 邻接表结构体
struct Node {
int val; // 顶点的值
Node* next; // 指向下一个邻接点的指针
};
// 图类
class Graph {
private:
Node* head[MAXN]; // 邻接表头指针数组
bool visited[MAXN]; // 记录顶点是否被访问过
int n; // 顶点个数
public:
Graph(int n) {
this->n = n;
// 初始化邻接表为空链表
for (int i = 0; i < MAXN; i++)
head[i] = nullptr;
}
// 添加一条边
void addEdge(int u, int v) {
Node* node = new Node();
node->val = v;
node->next = head[u];
head[u] = node;
}
// 销毁图
void destroy() {
for (int i = 0; i < n; i++) {
Node* p = head[i], *q;
while (p != nullptr) {
q = p;
p = p->next;
delete q;
}
}
}
// 深度优先搜索
void dfs(int u) {
visited[u] = true;
cout << u << " ";
for (Node* p = head[u]; p != nullptr; p = p->next) {
int v = p->val;
if (!visited[v])
dfs(v);
}
}
// 广度优先搜索
void bfs(int u) {
queue<int> q;
q.push(u);
visited[u] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " ";
for (Node* p = head[u]; p != nullptr; p = p->next) {
int v = p->val;
if (!visited[v]) {
visited[v] = true;
q.push(v);
}
}
}
}
};
int main() {
Graph g(5);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 3);
g.addEdge(2, 3);
g.addEdge(3, 4);
cout << "DFS: ";
g.dfs(0);
cout << endl;
for (int i = 0; i < 5; i++)
g.visited[i] = false;
cout << "BFS: ";
g.bfs(0);
cout << endl;
g.destroy();
return 0;
}
```
这里使用了一个邻接表结构体来表示每个顶点的邻接点,图类中包括了图的建立、销毁、深度优先遍历和广度优先遍历等操作。在 `main()` 函数中,我们建立了一个包含5个顶点的图,并进行了深度优先遍历和广度优先遍历。最后别忘了销毁图,释放内存。
阅读全文