采用邻接矩阵表示法创建无向图/网,参考算法6.1;(2)采用邻接表表示法创建无向图/网,参考算法6.2;(3)分别采用邻接矩阵和邻接表表示图的深度优先搜索遍历,参考算法6.3,6.5,6.6;(4)分别采用邻接矩阵和邻接表表示图的广度优先搜索遍历,参考算法6.7写完整C语言代码
时间: 2025-01-06 07:53:09 浏览: 57
(1) 邻接矩阵表示法创建无向图通常是一个二维数组,其中行代表图中的顶点,列表示与该顶点相连的所有顶点。对于每个顶点i,它的邻居存储在矩阵的第i行。创建时,如果顶点u和v之间有边,就将矩阵[i][j]或[j][i]设置为1。例如:
```c
int graph[n][n]; // n为顶点数
graph[u][v] = 1; // 添加边(u, v)
```
(2) 邻接表则为链表结构,每个顶点对应一个链表,链表节点保存与其相邻的顶点及其边的信息。创建时,对于每条边(u, v),只需在u对应的链表中插入指向v的新节点。
```c
typedef struct Node {
int vertex;
struct Node* next;
} Node;
Node** adjacency_list; // 存储邻接表的指针数组
adjacency_list[u]->next = (Node*)malloc(sizeof(Node)); // 添加边(u, v)
adjacency_list[u]->next->vertex = v;
```
(3) 对于深度优先搜索(DFS),无论是邻接矩阵还是邻接表,基本思想都是递归地访问未访问过的节点。以下是DFS的通用框架:
```c
void dfs_matrix(int u, bool visited[], int graph[n][n]) {
visited[u] = true;
// ... 深度优先遍历操作
}
void dfs_adjacency_list(int u, bool visited[], Node** adjacency_list) {
visited[u] = true;
Node* node = adjacency_list[u];
while (node != NULL) {
if (!visited[node->vertex])
dfs_adjacency_list(node->vertex, visited, adjacency_list);
node = node->next;
}
}
```
(4) 广度优先搜索(BFS)会从起点开始逐层探索。邻接矩阵中,我们可以利用数组直接访问,邻接表则需要队列辅助:
```c
void bfs_matrix(int start, int graph[n][n], int visited[]) {
queue<int> q;
visited[start] = true;
q.enqueue(start);
// ... 使用queue做BFS操作
}
void bfs_adjacency_list(int start, Node** adjacency_list, bool visited[]) {
queue<Node*> q;
visited[start] = true;
q.enqueue(adjacency_list[start]);
// ... 使用queue做BFS操作
}
```
阅读全文
相关推荐















