较为简便的用C语言实现图的存储,输出存储结构示意图; 输出对建立的图进行深度优先搜索和广度优先搜索所得的遍历序列
时间: 2024-01-22 07:18:29 浏览: 77
在C语言中,可以使用邻接矩阵和邻接表两种方式实现图的存储。
1. 邻接矩阵
邻接矩阵是一个二维数组,表示图中每个节点之间的连接关系。其中,数组的每个元素A[i][j]表示节点i和节点j之间是否有边相连,如果有,则为1,否则为0。
示意图:
```
0 1 2 3
0 0 1 1 0
1 1 0 1 1
2 1 1 0 1
3 0 1 1 0
```
其中,第一行和第一列分别表示节点的编号,数组中的元素表示节点之间的连接关系。
2. 邻接表
邻接表是一种链式存储结构,用于表示图中每个节点的连接关系。对于每个节点i,以链表的形式存储与其相连的所有节点。
示意图:
```
0 -> 1 -> 2
1 -> 0 -> 2 -> 3
2 -> 0 -> 1 -> 3
3 -> 1 -> 2
```
其中,每个节点后面的箭头表示与其相连的节点。可以用一个数组来存储每个节点的邻接表,数组中的每个元素表示该节点的邻接表。
接下来是深度优先搜索和广度优先搜索的遍历序列实现:
1. 深度优先搜索遍历序列
深度优先搜索是一种沿着图的深度遍历的算法。从某个节点开始,沿着某一条边遍历到底,直到该节点的所有路径都被遍历完毕,然后回溯到上一个节点,继续遍历其他路径,直到所有节点都被遍历完毕。
对于邻接矩阵和邻接表两种存储方式,深度优先搜索的遍历序列算法是相同的,只需改变访问节点的方式即可。
遍历序列实现代码:
```
int visited[MAX_NODE]; // 记录节点是否被访问过
void dfs(int node) {
visited[node] = 1; // 标记节点为已访问
printf("%d ", node); // 输出访问节点的编号
for (int i = 0; i < MAX_NODE; i++) {
if (graph[node][i] && !visited[i]) { // 如果节点i与node相连且未被访问过
dfs(i); // 递归访问节点i
}
}
}
void dfsTraversal() {
memset(visited, 0, sizeof(visited)); // 初始化visited数组
for (int i = 0; i < MAX_NODE; i++) {
if (!visited[i]) { // 如果节点i未被访问过
dfs(i); // 从节点i开始进行深度优先搜索
}
}
}
```
2. 广度优先搜索遍历序列
广度优先搜索是一种按照层次遍历的算法。从某个节点开始,先访问它的所有邻居节点,然后再访问邻居节点的邻居节点,直到所有节点都被遍历完毕。
对于邻接表存储方式,广度优先搜索的遍历序列算法比较容易实现。可以使用队列来存储待访问的节点,每次从队列中取出一个节点,并将其所有邻居节点加入队列。
对于邻接矩阵存储方式,也可以使用队列来存储待访问的节点,但需要额外记录每个节点的层数,以便按照层次遍历。
遍历序列实现代码:
```
void bfsTraversal() {
int visited[MAX_NODE]; // 记录节点是否被访问过
memset(visited, 0, sizeof(visited)); // 初始化visited数组
queue<int> q; // 定义队列
for (int i = 0; i < MAX_NODE; i++) {
if (!visited[i]) { // 如果节点i未被访问过
visited[i] = 1; // 标记节点为已访问
printf("%d ", i); // 输出访问节点的编号
q.push(i); // 将节点i加入队列
while (!q.empty()) {
int node = q.front(); // 取出队首节点
q.pop(); // 将队首节点出队
for (int j = 0; j < MAX_NODE; j++) {
if (graph[node][j] && !visited[j]) { // 如果节点j与node相连且未被访问过
visited[j] = 1; // 标记节点为已访问
printf("%d ", j); // 输出访问节点的编号
q.push(j); // 将节点j加入队列
}
}
}
}
}
}
```
阅读全文