帮我用c++写一个程序,要求是定义图的邻接表存储结构,并编写创建图、输出图、广度优先遍历、计算并输出图中每个顶点的度等基本操作实现函数。同时在主函数中调用这些函数进行验证
时间: 2024-02-13 22:00:51 浏览: 70
好的,以下是一个简单的示例程序,实现了您的要求:
```c++
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 100; // 最大顶点数
// 边结构体
struct Edge {
int to; // 目标顶点
int next; // 下一条边的位置
};
// 邻接表存储的图结构体
struct Graph {
Edge edges[MAXN]; // 存储边的数组
int head[MAXN]; // 存储每个顶点的第一条边的位置
int cnt; // 当前边的数量
int n; // 顶点数
// 构造函数,初始化图
Graph(int n) {
this->cnt = 0;
this->n = n;
for (int i = 0; i < n; i++) {
head[i] = -1;
}
}
// 添加一条边
void addEdge(int u, int v) {
edges[cnt].to = v;
edges[cnt].next = head[u];
head[u] = cnt++;
}
// 输出图
void printGraph() {
for (int u = 0; u < n; u++) {
cout << u << ": ";
for (int i = head[u]; i != -1; i = edges[i].next) {
cout << edges[i].to << " ";
}
cout << endl;
}
}
// 广度优先遍历
void bfs(int s) {
bool visited[MAXN] = { false };
queue<int> q;
q.push(s);
visited[s] = true;
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " ";
for (int i = head[u]; i != -1; i = edges[i].next) {
int v = edges[i].to;
if (!visited[v]) {
q.push(v);
visited[v] = true;
}
}
}
cout << endl;
}
// 计算每个顶点的度并输出
void printDegrees() {
for (int u = 0; u < n; u++) {
int degree = 0;
for (int i = head[u]; i != -1; i = edges[i].next) {
degree++;
}
cout << "Degree of vertex " << u << ": " << degree << endl;
}
}
};
int main() {
int n = 5; // 顶点数
Graph g(n);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 3);
g.addEdge(2, 3);
g.addEdge(2, 4);
cout << "Graph:" << endl;
g.printGraph();
cout << "BFS:" << endl;
g.bfs(0);
cout << "Degrees:" << endl;
g.printDegrees();
return 0;
}
```
这个程序定义了邻接表存储的图结构体,包括了添加边、输出图、广度优先遍历和计算每个顶点度的函数。在主函数中,首先创建了一个包含5个顶点的图,并添加了一些边,然后分别调用了这些函数进行验证。
希望这个程序能够帮到您。如果您有任何疑问,请随时问我。
阅读全文