在C语言中,图的构建以及图的深度遍历和广度遍历编码,写完整
时间: 2024-12-17 17:51:19 浏览: 4
在C语言中,图(Graph)通常不是内置的数据结构,而是通过数组或者邻接矩阵等数据结构来模拟。这里我会简述如何创建基本的无向图,并介绍深度优先搜索(DFS)和广度优先搜索(BFS)的编码实现。
1. 图的构建:
- **邻接矩阵**:可以用二维数组表示,行代表起点,列表示终点,值为1或0(0表示无连接)。例如:
```c
int graph[5][5] = {
{0, 1, 0, 1, 0},
{1, 0, 1, 0, 1},
{0, 1, 0, 0, 1},
{1, 0, 0, 0, 1},
{0, 1, 1, 1, 0}
};
```
- **邻接表**:更节省空间,每个节点存储指向其邻居的指针数组。但实现起来需要额外的数据结构支持,如链表。
2. 深度优先搜索(DFS):
```c
void dfs(int node, int visited[], int graph[]) {
visited[node] = 1;
printf("%d ", node);
for (int i = 0; i < num_nodes; i++) {
if (!visited[i] && graph[node][i]) {
dfs(i, visited, graph);
}
}
}
```
`num_nodes`是节点总数,函数首先标记当前节点已访问,然后递归访问未访问的相邻节点。
3. 广度优先搜索(BFS):
```c
#include <stdio.h>
#include <stdlib.h>
struct QueueNode {
int data;
struct QueueNode *next;
};
// 初始化队列
struct QueueNode* createQueue() {
return NULL;
}
// 添加元素到队列前端
void enqueue(struct QueueNode** front, int value) {
struct QueueNode* newNode = (struct QueueNode*)malloc(sizeof(struct QueueNode));
newNode->data = value;
newNode->next = *front;
*front = newNode;
}
// 删除并返回队列前端的元素
int dequeue(struct QueueNode** front) {
if (*front == NULL) return -1;
int data = (*front)->data;
struct QueueNode* temp = *front;
*front = (*front)->next;
free(temp);
return data;
}
void bfs(int start, int graph[], int num_nodes) {
int visited[num_nodes];
memset(visited, 0, sizeof(visited));
struct QueueNode* queue = createQueue();
enqueue(&queue, start);
while (queue != NULL) {
int node = dequeue(&queue);
printf("%d ", node);
for (int i = 0; i < num_nodes; i++) {
if (graph[node][i] && !visited[i]) {
enqueue(&queue, i);
visited[i] = 1;
}
}
}
}
```
BFS使用了队列来按层次顺序遍历节点。
阅读全文