对给定图,实现图的深度优先遍历和广度优先遍历。以邻接表或邻接矩阵为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列,并调试算法。使用C语言
时间: 2024-11-12 12:47:00 浏览: 348
在C语言中,我们可以使用邻接表或邻接矩阵来存储图的数据结构。这里我将简单介绍如何实现深度优先搜索(DFS)和广度优先搜索(BFS):
使用邻接表实现:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int val;
struct Node* next;
} Node;
// 创建邻接列表表示图
Node* createAdjacencyList(int numNodes) {
// 初始化节点数组
Node** adjList = malloc(sizeof(Node*) * numNodes);
for (int i = 0; i < numNodes; ++i)
adjList[i] = NULL;
return adjList;
}
// 添加边到邻接表
void addEdge(Node** adjList, int src, int dest) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->val = dest;
newNode->next = adjList[src];
adjList[src] = newNode;
}
// DFS 函数
void dfs(Node* start, int visited[], int n) {
visited[start->val] = 1;
printf("%d ", start->val);
Node* temp = start->next;
while (temp != NULL) {
if (!visited[temp->val]) {
dfs(temp, visited, n);
}
temp = temp->next;
}
}
// BFS 函数
void bfs(Node* start, int visited[], int n) {
int queue[1000], front = -1, rear = -1;
visited[start->val] = 1;
queue[++rear] = start->val;
while (front != rear) {
int vertex = queue[++front];
printf("%d ", vertex);
Node* temp = adjList[vertex];
while (temp != NULL) {
if (!visited[temp->val]) {
visited[temp->val] = 1;
queue[++rear] = temp->val;
}
temp = temp->next;
}
}
}
// 主函数示例
int main() {
// 初始化并构建图...
int numNodes = 5;
Node* adjList = createAdjacencyList(numNodes);
// 添加边...
int visited[numNodes] = {0};
printf("Depth First Search from node %d: \n", 0); // 起点选择0
dfs(adjList, visited, numNodes);
printf("\n Breadth First Search from node %d: \n", 0); // 起点选择0
bfs(adjList, visited, numNodes);
return 0;
}
调试:
在实际应用中,你可以添加一些断点并在遍历时检查visited[]
数组,确认是否按预期访问了每个节点。同时,检查adjList
结构是否正确地存储了边。
相关问题--:
- 邻接表和邻接矩阵在存储效率上有什么区别?
- 如何处理有环的图在DFS中?
- 在BFS中为什么要使用队列数据结构?
相关推荐


















