用C实现(1)输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。 (2)对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列
时间: 2024-02-05 07:13:44 浏览: 59
(1)用邻接表表示的无向图可以使用链表来实现。每个链表节点代表一个顶点,其指针域指向与该顶点相邻的其他顶点。
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点
typedef struct Node {
int vertex; // 顶点编号
struct Node* next; // 指向下一个邻接点的指针
} Node;
// 邻接表
typedef struct Graph {
int V; // 顶点数
int E; // 边数
Node** adjList; // 指向链表头节点的指针数组
} Graph;
// 创建邻接表节点
Node* createNode(int v) {
Node* node = (Node*)malloc(sizeof(Node));
node->vertex = v;
node->next = NULL;
return node;
}
// 添加边
void addEdge(Graph* graph, int src, int dest) {
// 添加 src -> dest 的边
Node* node = createNode(dest);
node->next = graph->adjList[src];
graph->adjList[src] = node;
// 添加 dest -> src 的边
node = createNode(src);
node->next = graph->adjList[dest];
graph->adjList[dest] = node;
}
// 创建无向图
Graph* createGraph(int V, int E) {
Graph* graph = (Graph*)malloc(sizeof(Graph));
graph->V = V;
graph->E = E;
graph->adjList = (Node**)malloc(V * sizeof(Node*));
// 初始化链表头节点为NULL
for (int i = 0; i < V; i++) {
graph->adjList[i] = NULL;
}
// 添加边
for (int i = 0; i < E; i++) {
int src, dest;
printf("Enter edge %d (src dest): ", i+1);
scanf("%d %d", &src, &dest);
addEdge(graph, src, dest);
}
return graph;
}
// 深度优先搜索遍历
void DFS(Graph* graph, int v, int* visited) {
visited[v] = 1; // 标记当前顶点为已访问
printf("%d ", v); // 输出遍历序列
// 遍历当前顶点的邻接点
for (Node* node = graph->adjList[v]; node != NULL; node = node->next) {
int adjV = node->vertex;
if (!visited[adjV]) { // 如果邻接点未被访问,则递归访问它
DFS(graph, adjV, visited);
}
}
}
// 广度优先搜索遍历
void BFS(Graph* graph, int v, int* visited) {
int queue[graph->V]; // 创建队列
int front = -1, rear = -1;
visited[v] = 1; // 标记当前顶点为已访问
queue[++rear] = v; // 入队
while (front != rear) {
v = queue[++front]; // 出队
printf("%d ", v); // 输出遍历序列
// 遍历当前顶点的邻接点
for (Node* node = graph->adjList[v]; node != NULL; node = node->next) {
int adjV = node->vertex;
if (!visited[adjV]) { // 如果邻接点未被访问,则标记为已访问并入队
visited[adjV] = 1;
queue[++rear] = adjV;
}
}
}
}
int main() {
int V, E;
printf("Enter the number of vertices: ");
scanf("%d", &V);
printf("Enter the number of edges: ");
scanf("%d", &E);
Graph* graph = createGraph(V, E);
int visited[V];
for (int i = 0; i < V; i++) {
visited[i] = 0; // 初始化 visited 数组为 0
}
printf("\nDFS traversal: ");
DFS(graph, 0, visited);
for (int i = 0; i < V; i++) {
visited[i] = 0; // 重新初始化 visited 数组为 0
}
printf("\nBFS traversal: ");
BFS(graph, 0, visited);
return 0;
}
```
(2)对于深度优先搜索遍历和广度优先搜索遍历,只需要在遍历顶点时输出其编号即可。在代码中,分别使用了 `DFS()` 和 `BFS()` 函数来实现深度优先搜索和广度优先搜索。其中,`visited` 数组用于记录每个顶点是否被访问过。在 `DFS()` 和 `BFS()` 中,通过递归和队列来遍历图中的所有顶点,并输出其遍历序列。
在运行程序时,先输入顶点数和边数,然后输入每条边的顶点对。程序会按照输入的信息创建无向图,并输出深度优先搜索和广度优先搜索的遍历序列。
阅读全文