用c++实现设计MatToList( ) 函数,把用户输入的邻接矩阵转化为邻接表。实现对使用邻接表存储的图的深度优先遍历
时间: 2024-05-16 19:17:57 浏览: 126
以下是用C++实现的代码:
```c++
#include<iostream>
#include<vector>
using namespace std;
// 定义邻接表节点
struct AdjListNode {
int dest;
struct AdjListNode* next;
};
// 定义邻接表
struct AdjList {
struct AdjListNode* head;
};
// 定义图
class Graph {
private:
int V; // 图的顶点数
vector<AdjList> adj; // 邻接表
// 深度优先遍历的递归函数
void DFSUtil(int v, vector<bool>& visited) {
visited[v] = true;
cout << v << " "; // 输出被访问的顶点
// 递归访问所有未被访问的相邻顶点
for (AdjListNode* neighbor = adj[v].head; neighbor != NULL; neighbor = neighbor->next) {
int w = neighbor->dest;
if (!visited[w]) {
DFSUtil(w, visited);
}
}
}
public:
Graph(int V) {
this->V = V;
adj.resize(V);
for (int i = 0; i < V; i++) {
adj[i].head = NULL;
}
}
// 添加边
void addEdge(int src, int dest) {
AdjListNode* newNode = new AdjListNode;
newNode->dest = dest;
newNode->next = adj[src].head;
adj[src].head = newNode;
}
// 把邻接矩阵转化为邻接表
void MatToList(int mat[][100]) {
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (mat[i][j] != 0) {
addEdge(i, j);
}
}
}
}
// 深度优先遍历
void DFS(int start) {
vector<bool> visited(V, false);
DFSUtil(start, visited);
}
};
int main() {
int V, mat[100][100];
cout << "输入顶点数:";
cin >> V;
cout << "输入邻接矩阵:\n";
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
cin >> mat[i][j];
}
}
Graph g(V);
g.MatToList(mat);
int start;
cout << "输入起始顶点:";
cin >> start;
cout << "深度优先遍历:";
g.DFS(start);
cout << endl;
return 0;
}
```
这个程序中,我们首先定义了邻接表节点和邻接表结构体,然后定义了图类。在图类中,我们定义了添加边、把邻接矩阵转化为邻接表和深度优先遍历等函数。在主函数中,我们首先读入图的顶点数和邻接矩阵,然后创建图对象,并把邻接矩阵转化为邻接表。最后,我们读入起始顶点,输出深度优先遍历的结果。
阅读全文