用邻接链表存储图,并对该图进行深度优先遍历和广度优先遍历,用C语言写出源代码
时间: 2025-06-21 15:27:34 浏览: 6
在C语言中,我们可以使用邻接链表来表示图的数据结构。这里是一个简单的示例,包含了深度优先遍历(DFS)和广度优先遍历(BFS)的实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 图节点结构体
typedef struct Node {
int data;
struct Node* next; // 邻接链表链接
} Node;
// 创建邻接链表
Node* createAdjList(int vertices) {
Node** adj = (Node**)malloc(sizeof(Node*) * vertices);
for (int i = 0; i < vertices; i++) {
adj[i] = NULL;
}
return adj;
}
// 添加边到邻接链表
void addEdge(Node** adj, int src, int dest) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = dest;
newNode->next = adj[src];
adj[src] = newNode;
}
// 深度优先遍历(DFS)
void dfs(Node* node, int visited[], int vertices) {
if (node == NULL) return;
printf("%d ", node->data);
visited[node->data] = 1;
// 探索当前节点的所有邻居
Node* temp = node->next;
while (temp != NULL) {
if (!visited[temp->data]) {
dfs(temp, visited, vertices);
}
temp = temp->next;
}
}
// 广度优先遍历(BFS)
void bfs(Node* root, int vertices, int visited[]) {
int level[vertex]; // 用于记录每个节点所在的层数
int qindex = 0; // 栈顶指针
// 初始化栈和标记数组
for (int i = 0; i < vertices; i++) {
level[i] = 0;
visited[i] = 0;
}
visited[root->data] = 1;
level[root->data] = 1;
qindex++; // 根节点入栈
Node* current = root;
while (qindex > 0) {
current = level[current->data] ? current->next : current;
printf("%d ", current->data);
visited[current->data] = 1;
// 将当前节点未访问的邻居加入下一层
Node* neighbor = current->next;
while (neighbor != NULL && !visited[neighbor->data]) {
visited[neighbor->data] = 1;
level[neighbor->data] = level[current->data] + 1;
qindex++;
neighbor = neighbor->next;
}
qindex--;
}
}
// 主函数
int main() {
int vertices, edges, src, dest;
printf("请输入顶点数和边数: ");
scanf("%d %d", &vertices, &edges);
Node** adj = createAdjList(vertices);
for (int i = 0; i < edges; i++) {
scanf("%d %d", &src, &dest);
addEdge(adj, src, dest);
}
printf("深度优先遍历结果:\n");
int dfsVisited[vertex] = {0};
Node* startNode = adj[0];
dfs(startNode, dfsVisited, vertices);
printf("\n广度优先遍历结果:\n");
bfs(adj[0], vertices, dfsVisited);
free(adj);
return 0;
}
```
这段代码首先创建了邻接链表,然后添加边,最后分别执行深度优先遍历和广度优先遍历。请注意,为了简洁,这里没有包括错误处理和输入验证。在实际应用中,你需要增加适当的功能以处理无效输入等场景。
阅读全文
相关推荐


















