编程实现如下功能: (1)输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。 (2)对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列。用c语言数据结构写出来
时间: 2025-01-27 19:14:34 浏览: 43
在C语言中,我们可以使用数组或链表来实现邻接表,这有助于存储无向图的数据结构。这里是一个简单的示例,我们将创建一个邻接表表示无向图,以及实现深度优先搜索(DFS)和广度优先搜索(BFS)算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义邻接表节点
typedef struct Node {
int vertex;
struct Node* next;
} Node;
// 邻接表表示无向图
typedef struct Graph {
int vertices;
Node** adj; // 存储每个顶点的邻接表指针
} Graph;
// 初始化邻接表
void initGraph(Graph* graph, int vertices) {
graph->vertices = vertices;
graph->adj = (Node**)malloc(sizeof(Node*) * vertices);
for (int i = 0; i < vertices; i++) {
graph->adj[i] = NULL;
}
}
// 添加边到邻接表
void addEdge(Graph* graph, int src, int dest) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->vertex = dest;
newNode->next = graph->adj[src];
graph->adj[src] = newNode;
// 对于无向图,添加源节点到目的节点的反向边
graph->adj[dest] = newNode->next;
}
// 深度优先搜索
void DFS(Graph* graph, int start, int visited[]) {
visited[start] = 1;
printf("%d ", start); // 输出当前节点
Node* temp = graph->adj[start];
while (temp != NULL) {
if (!visited[temp->vertex]) {
DFS(graph, temp->vertex, visited);
}
temp = temp->next;
}
}
// 广度优先搜索
void BFS(Graph* graph, int start) {
int visited[] = {0};
int queue[graph->vertices]; // 使用数组模拟队列
queue[0] = start;
visited[start] = 1;
printf("%d ", start); // 输出开始节点
for (int i = 0; i < graph->vertices; i++) {
int front = 0, rear = 0;
while (front < rear) {
int node = queue[rear]; // 取出前部节点
rear++;
printf("%d ", node); // 输出节点
for (Node* neighbor = graph->adj[node]; neighbor != NULL; neighbor = neighbor->next) {
if (!visited[neighbor->vertex]) {
queue[front] = neighbor->vertex;
visited[neighbor->vertex] = 1;
front++;
}
}
}
}
}
int main() {
int vertices, edges;
printf("请输入顶点数: ");
scanf("%d", &vertices);
printf("请输入边数: ");
scanf("%d", &edges);
Graph graph;
initGraph(&graph, vertices);
// 输入边
for (int i = 0; i < edges; i++) {
int src, dest;
scanf("%d %d", &src, &dest);
addEdge(&graph, src - 1, dest - 1); // 减一是因为数组索引从0开始
}
// 深度优先搜索
printf("\n深度优先搜索遍历:\n");
int visited[vertex];
for (int i = 0; i < vertices; i++)
visited[i] = 0;
DFS(&graph, 0, visited);
// 广度优先搜索
printf("\n广度优先搜索遍历:\n");
BFS(&graph, 0);
return 0;
}
```
在这个例子中,我们首先创建了一个邻接表表示无向图,并实现了DFS和BFS的函数。注意这个代码示例假设用户输入的都是有效整数,并且为了简化,没有包含错误处理部分。
阅读全文
相关推荐


















