定义图的邻接矩阵存储结构,以及编写图的初始化、建立图、输出图、深度优先/广度优先遍历、计算并输出图中每个顶点的度(入度+出度)等基本操作的实现函数。建立一个验证操作实现的主函数进行测试。的实现源代码
时间: 2024-02-05 20:12:36 浏览: 95
以下是图的邻接矩阵存储结构及基本操作的实现代码:
```C++
#include <iostream>
#include <queue>
using namespace std;
#define MAX_VERTEX_NUM 20 // 最大顶点数
// 图的邻接矩阵存储结构
typedef struct {
char vertex; // 顶点信息
int arc[MAX_VERTEX_NUM]; // 弧信息,1表示有弧,0表示无弧
} Graph[MAX_VERTEX_NUM];
// 初始化图
void InitGraph(Graph G, int n) {
for (int i = 0; i < n; i++) {
G[i].vertex = 'A' + i; // 顶点信息为A~Z的字母
for (int j = 0; j < n; j++) {
G[i].arc[j] = 0; // 初始化所有弧为0
}
}
}
// 建立图
void CreateGraph(Graph G, int n, int e) {
cout << "请输入每个顶点的出度(即与其相连的边数):" << endl;
for (int i = 0; i < n; i++) {
int outDegree;
cin >> outDegree;
for (int j = 0; j < outDegree; j++) {
int adjVertex; // 相邻顶点
cout << "请输入与顶点" << G[i].vertex << "相邻的顶点编号(0~" << n-1 << "):" << endl;
cin >> adjVertex;
G[i].arc[adjVertex] = 1; // 有向边
}
}
}
// 输出图
void PrintGraph(Graph G, int n) {
for (int i = 0; i < n; i++) {
cout << G[i].vertex << ": ";
for (int j = 0; j < n; j++) {
if (G[i].arc[j] == 1) {
cout << G[j].vertex << " ";
}
}
cout << endl;
}
}
// 深度优先遍历
void DFS(Graph G, int n, int v, bool visited[]) {
visited[v] = true; // 标记已访问
cout << G[v].vertex << " "; // 输出当前顶点
for (int i = 0; i < n; i++) {
if (G[v].arc[i] == 1 && !visited[i]) { // 有弧且未访问
DFS(G, n, i, visited); // 递归访问
}
}
}
// 广度优先遍历
void BFS(Graph G, int n, int v, bool visited[]) {
queue<int> q;
visited[v] = true; // 标记已访问
cout << G[v].vertex << " "; // 输出当前顶点
q.push(v); // 入队
while (!q.empty()) {
int u = q.front(); // 取队首元素
q.pop(); // 出队
for (int i = 0; i < n; i++) {
if (G[u].arc[i] == 1 && !visited[i]) { // 有弧且未访问
visited[i] = true; // 标记已访问
cout << G[i].vertex << " "; // 输出当前顶点
q.push(i); // 入队
}
}
}
}
// 计算并输出图中每个顶点的度
void PrintDegree(Graph G, int n) {
for (int i = 0; i < n; i++) {
int degree = 0;
for (int j = 0; j < n; j++) {
if (G[i].arc[j] == 1) {
degree++; // 出度
}
if (G[j].arc[i] == 1) {
degree++; // 入度
}
}
cout << G[i].vertex << "的度为:" << degree << endl;
}
}
// 主函数
int main() {
Graph G;
int n, e;
bool visited[MAX_VERTEX_NUM] = {false}; // 初始化所有顶点未访问
cout << "请输入图的顶点数和边数(用空格隔开):" << endl;
cin >> n >> e;
InitGraph(G, n);
CreateGraph(G, n, e);
cout << "图的邻接矩阵为:" << endl;
PrintGraph(G, n);
cout << "深度优先遍历结果:" << endl;
DFS(G, n, 0, visited);
cout << endl;
memset(visited, false, sizeof(visited)); // 重置所有顶点未访问
cout << "广度优先遍历结果:" << endl;
BFS(G, n, 0, visited);
cout << endl;
cout << "每个顶点的度为:" << endl;
PrintDegree(G, n);
return 0;
}
```
阅读全文