完成一个图的创建和深度优先遍历C语言
时间: 2024-04-30 13:20:31 浏览: 84
以下是一个基本的图的创建和深度优先遍历的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100
typedef struct node {
int vertex;
struct node* next;
} Node;
Node* graph[MAX_VERTICES];
int visited[MAX_VERTICES];
void addEdge(int u, int v) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = v;
newNode->next = graph[u];
graph[u] = newNode;
}
void createGraph(int vertices, int edges) {
int i, u, v;
for (i = 0; i < vertices; i++) {
graph[i] = NULL;
visited[i] = 0;
}
for (i = 0; i < edges; i++) {
scanf("%d %d", &u, &v);
addEdge(u, v);
addEdge(v, u);
}
}
void DFS(int vertex) {
visited[vertex] = 1;
printf("%d ", vertex);
Node* temp = graph[vertex];
while (temp != NULL) {
int adjVertex = temp->vertex;
if (!visited[adjVertex]) {
DFS(adjVertex);
}
temp = temp->next;
}
}
int main() {
int vertices, edges;
printf("Enter the number of vertices: ");
scanf("%d", &vertices);
printf("Enter the number of edges: ");
scanf("%d", &edges);
createGraph(vertices, edges);
int startVertex;
printf("Enter the starting vertex for DFS: ");
scanf("%d", &startVertex);
printf("DFS Traversal: ");
DFS(startVertex);
return 0;
}
```
代码中定义了一个 `Node` 结构体来表示图中的每个节点,其中包含了节点的值和一个指向下一个节点的指针。
`graph` 数组用于存储整个图,其中每个元素都是一个指向链表头部节点的指针。链表中的节点表示与该节点相邻的其他节点。
`visited` 数组用于记录每个节点是否已经被访问过。
`addEdge` 函数用于向图中添加边,这里采用无向图,因此需要同时添加两个方向的边。
`createGraph` 函数用于创建图,它首先将每个节点的邻接链表初始化为空,并将 `visited` 数组中每个元素都初始化为 0。然后通过循环读取每个边的起始节点和结束节点,并调用 `addEdge` 函数将这些边添加到图中。
`DFS` 函数用于进行深度优先遍历,它首先将当前节点标记为已访问,并输出该节点的值。然后遍历该节点的邻接链表,对于每个未被访问的相邻节点,递归调用 `DFS` 函数。
在 `main` 函数中,首先读取图的顶点数和边数,并调用 `createGraph` 函数创建图。然后读取起始节点并调用 `DFS` 函数进行深度优先遍历。
阅读全文