用c语言写采用邻接矩阵和邻接链表作为图的存储结构,写出有向图和无向图的dfs和bfs代码。
时间: 2024-12-22 20:32:05 浏览: 2
在C语言中,我们可以分别使用邻接矩阵和邻接链表这两种数据结构来表示图。下面是简单的有向图和无向图的深度优先搜索(DFS)和广度优先搜索(BFS)算法示例。
### 邻接矩阵表示:
```c
#include <stdio.h>
#define ROW 5 // 图的行数或列数
// 对于有向图的DFS
void dfs_matrix(int graph[ROW][ROW], int visited[], int start) {
visited[start] = 1;
printf("%d ", start);
for (int i = 0; i < ROW; ++i)
if (graph[start][i] && !visited[i])
dfs_matrix(graph, visited, i);
}
// 对于无向图的BFS
void bfs_matrix(int graph[ROW][ROW], int src) {
int visited[ROW] = {0};
int queue[ROW]; // 使用数组模拟队列
queue[0] = src;
visited[src] = 1;
while (queue[0] != -1) {
int u = queue[0];
printf("%d ", u);
for (int v = 0; v < ROW; ++v)
if (!visited[v] && graph[u][v]) {
queue[0] = v;
visited[v] = 1;
break;
}
queue[0]++;
}
}
// 示例函数调用
int main() {
// 初始化图...
int graph[ROW][ROW] = ...;
int start = 0; // 或者指定源节点
dfs_matrix(graph, NULL, start); // 有向图DFS
bfs_matrix(graph, start); // 无向图BFS
return 0;
}
```
### 邻接链表表示:
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 对于有向图的DFS
void dfs_linked_list(Node** head, int visited[], int start) {
visited[start] = 1;
printf("%d ", start);
Node* current = *head;
while (current != NULL) {
if (visited[current->data] == 0 && current->next != NULL) {
dfs_linked_list(¤t->next, visited, current->data);
}
current = current->next;
}
}
// 对于无向图的BFS
void bfs_linked_list(Node** head, int src) {
Node* current = *head;
int level[ROW] = {0}; // 水平数组用于追踪层数
int queue_index = 0;
level[src] = 0;
Node* node = current;
while (node != NULL) {
printf("%d ", node->data);
if (level[node->data] > queue_index) {
for (int i = queue_index; i < level[node->data]; ++i)
printf("..."); // 显示省略号
queue_index = level[node->data];
}
current = node->next;
if (current != NULL)
level[current->data] = level[node->data] + 1;
}
}
// 示例函数调用
int main() {
// 初始化图...
Node* graph_head = ...;
int start = 0; // 或者指定源节点
dfs_linked_list(&graph_head, NULL, start); // 有向图DFS
bfs_linked_list(&graph_head, start); // 无向图BFS
return 0;
}
```
阅读全文