用C语言以邻接矩阵或邻接表定义无向图,其中每个元素的数据类型为int。实现图的深度优先,打印所有的节点并给出注释。
时间: 2024-02-12 14:04:32 浏览: 78
使用邻接矩阵定义无向图:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100 // 图的最大顶点数
int visited[MAX_VERTICES]; // 标记节点是否已被访问
// 定义邻接矩阵图的结构体
typedef struct {
int n; // 顶点数
int adj[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
} Graph;
// 初始化图
void init_graph(Graph* g, int n) {
int i, j;
g->n = n;
for (i = 0; i < g->n; i++) {
for (j = 0; j < g->n; j++) {
g->adj[i][j] = 0;
}
}
}
// 向图中添加一条边
void add_edge(Graph* g, int u, int v) {
g->adj[u][v] = g->adj[v][u] = 1;
}
// 深度优先搜索
void dfs(Graph* g, int v) {
int i;
visited[v] = 1; // 标记当前节点已被访问
printf("%d ", v); // 输出访问的节点
// 访问该节点的所有未被访问的邻居节点
for (i = 0; i < g->n; i++) {
if (g->adj[v][i] && !visited[i]) {
dfs(g, i);
}
}
}
int main() {
int n = 5;
Graph* g = (Graph*)malloc(sizeof(Graph));
init_graph(g, n);
add_edge(g, 0, 1);
add_edge(g, 0, 2);
add_edge(g, 1, 2);
add_edge(g, 2, 3);
add_edge(g, 3, 4);
printf("深度优先遍历结果:");
dfs(g, 0);
return 0;
}
```
使用邻接表定义无向图:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100 // 图的最大顶点数
int visited[MAX_VERTICES]; // 标记节点是否已被访问
// 定义邻接表中的链表节点
typedef struct ListNode {
int v; // 邻接节点的下标
struct ListNode* next; // 指向下一个邻接节点的指针
} ListNode;
// 定义邻接表的结构体
typedef struct {
int n; // 顶点数
ListNode* adj[MAX_VERTICES]; // 邻接表
} Graph;
// 初始化图
void init_graph(Graph* g, int n) {
int i;
g->n = n;
for (i = 0; i < g->n; i++) {
g->adj[i] = NULL;
}
}
// 向图中添加一条边
void add_edge(Graph* g, int u, int v) {
ListNode* new_node = (ListNode*)malloc(sizeof(ListNode));
new_node->v = v;
new_node->next = g->adj[u];
g->adj[u] = new_node;
new_node = (ListNode*)malloc(sizeof(ListNode));
new_node->v = u;
new_node->next = g->adj[v];
g->adj[v] = new_node;
}
// 深度优先搜索
void dfs(Graph* g, int v) {
ListNode* p;
visited[v] = 1; // 标记当前节点已被访问
printf("%d ", v); // 输出访问的节点
// 访问该节点的所有未被访问的邻居节点
for (p = g->adj[v]; p != NULL; p = p->next) {
if (!visited[p->v]) {
dfs(g, p->v);
}
}
}
int main() {
int n = 5;
Graph* g = (Graph*)malloc(sizeof(Graph));
init_graph(g, n);
add_edge(g, 0, 1);
add_edge(g, 0, 2);
add_edge(g, 1, 2);
add_edge(g, 2, 3);
add_edge(g, 3, 4);
printf("深度优先遍历结果:");
dfs(g, 0);
return 0;
}
```
阅读全文