用C写无向图采用邻接矩阵进行存储,完成以下操作 (1) 建立无向图的邻接矩阵存储 (2) 输出邻接矩阵 (3) 基于图邻接矩阵的深度优先遍历 (4) 基于图邻接矩阵的广度优先遍历
时间: 2024-06-23 22:02:14 浏览: 140
在C语言中,我们可以使用二维数组来实现无向图的邻接矩阵表示。这是一种静态数据结构,适用于稠密图,其中边的数量接近于节点总数的平方。
**1. 建立无向图的邻接矩阵存储**:
```c
#define V // 顶点数
typedef int graph[V][V]; // 定义邻接矩阵类型
void create_graph(graph adj[], int v, int edges[]) {
for (int i = 0; i < v; ++i) {
for (int j = 0; j < v; ++j) {
adj[i][j] = (i == j) ? 0 : UNREACHABLE; // 初始化为未连接,如果是自身则为0
}
}
for (int i = 0; i < v; ++i) {
for (int j = 0; j < edges[i * 2]; ++j) { // 假设每条边由两个元素表示,第一个元素是起点,第二个是终点
int src = edges[2 * i + j];
int dest = edges[2 * i + j + 1];
adj[src][dest] = adj[dest][src] = 1; // 如果有边,则将对应位置设为1
}
}
}
```
**2. 输出邻接矩阵:**
```c
void print_matrix(graph adj, int v) {
for (int i = 0; i < v; ++i) {
for (int j = 0; j < v; ++j) {
printf("%d ", adj[i][j]);
}
printf("\n");
}
}
```
**3. 基于图邻接矩阵的深度优先遍历(Depth First Search, DFS):**
```c
void dfs(graph adj, int v, int src) {
int visited[v] = {0}; // 初始化访问数组
dfs_util(adj, v, src, visited);
}
void dfs_util(graph adj, int v, int vertex, int visited[]) {
visited[vertex] = 1; // 标记已访问
printf("%d ", vertex); // 输出当前节点
for (int i = 0; i < v; ++i) {
if (adj[vertex][i] && !visited[i]) {
dfs_util(adj, v, i, visited);
}
}
}
```
**4. 基于图邻接矩阵的广度优先遍历(Breadth First Search, BFS):**
```c
void bfs(graph adj, int v, int src) {
int queue[v], front = -1, rear = -1;
queue[++rear] = src; // 初始化队列
while (front != rear) {
front++;
int vertex = queue[front];
printf("%d ", vertex); // 输出当前节点
for (int i = 0; i < v; ++i) {
if (adj[vertex][i] && !queue[i + 1]) {
queue[++rear] = i;
}
}
}
}
```
阅读全文