按照邻接表对图进行创建,并运用图的深度优先遍历和图的广度优先遍历算法对所创建的无向图进行遍历。c语言
时间: 2024-12-15 14:19:56 浏览: 12
Graph1_非递归算法进行深度优先遍历和广度优先遍历_
5星 · 资源好评率100%
在C语言中,我们可以使用邻接表来表示图,因为邻接表对于稀疏图(即边的数量远小于节点总数的平方)来说更为节省空间。邻接表由两个数组组成:顶点数组和邻接表数组。顶点数组保存每个顶点的索引,邻接表数组则存储每个顶点连接的所有邻居。
对于深度优先搜索(DFS),可以采用递归的方式实现。从给定的起始节点开始,访问该节点,然后递归地访问其未访问过的邻居,直到所有可达节点都访问过为止。
```c
void dfs(int v, int visited[], graph adj[], int V) {
visited[v] = 1; // 标记当前节点已访问
printf("%d ", v); // 输出节点
for (int i = 0; i < adj[v].size(); i++) { // 遍历邻接列表
if (visited[adj[v][i]] == 0) {
dfs(adj[v][i], visited, adj, V); // 对未访问的邻居递归调用dfs
}
}
}
```
而对于广度优先搜索(BFS),通常会使用队列来按照层次顺序遍历节点。首先将起始节点加入队列,然后每次从队首取出节点并访问,再将其未访问过的相邻节点入队。
```c
void bfs(int start, graph adj[], int V) {
bool visited[V + 1]; // 初始化所有节点为未访问
queue<int> q;
visited[start] = 1;
q.push(start);
while (!q.empty()) {
int node = q.front();
q.pop();
printf("%d ", node); // 输出节点
for (int i = 0; i < adj[node].size(); i++) {
int neighbor = adj[node][i];
if (!visited[neighbor]) {
visited[neighbor] = 1;
q.push(neighbor);
}
}
}
}
```
阅读全文