用c语言实现 建立一个有向图的邻接矩阵存储,然后在主函数中输出该二 维矩阵(注意输出格式要为一个矩阵),以检验存储的正确 性;再从0号顶点出发对该图进行深度优先搜索,按顺序输出 所访问的顶点。
时间: 2024-01-22 13:18:24 浏览: 132
以下是用C语言实现建立有向图的邻接矩阵存储,并进行深度优先搜索的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct {
int vertex[MAX_VERTEX_NUM];
int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vertexNum, arcNum;
} Graph;
void createGraph(Graph *G) {
printf("请输入顶点数和边数:");
scanf("%d%d", &G->vertexNum, &G->arcNum);
printf("请输入顶点编号:\n");
for (int i = 0; i < G->vertexNum; i++) {
scanf("%d", &G->vertex[i]);
}
for (int i = 0; i < G->vertexNum; i++) {
for (int j = 0; j < G->vertexNum; j++) {
G->arc[i][j] = 0; // 初始化邻接矩阵
}
}
printf("请输入每条边的起点编号和终点编号:\n");
for (int i = 0; i < G->arcNum; i++) {
int s, e;
scanf("%d%d", &s, &e);
G->arc[s][e] = 1; // 将边存入邻接矩阵
}
}
void printGraph(Graph G) {
printf("邻接矩阵为:\n");
printf("\t");
for (int i = 0; i < G.vertexNum; i++) {
printf("%d\t", G.vertex[i]);
}
printf("\n");
for (int i = 0; i < G.vertexNum; i++) {
printf("%d\t", G.vertex[i]);
for (int j = 0; j < G.vertexNum; j++) {
printf("%d\t", G.arc[i][j]); // 输出邻接矩阵
}
printf("\n");
}
}
void DFS(Graph G, int v, int *visited) {
printf("%d ", G.vertex[v]); // 输出访问的顶点
visited[v] = 1;
for (int i = 0; i < G.vertexNum; i++) {
if (G.arc[v][i] == 1 && visited[i] == 0) {
DFS(G, i, visited); // 递归访问与v相邻的未被访问过的顶点
}
}
}
void DFSTraverse(Graph G) {
int visited[MAX_VERTEX_NUM] = {0};
printf("DFS遍历结果为:");
for (int i = 0; i < G.vertexNum; i++) {
if (visited[i] == 0) {
DFS(G, i, visited); // 对未被访问过的顶点进行深度优先搜索
}
}
printf("\n");
}
int main() {
Graph G;
createGraph(&G);
printGraph(G);
DFSTraverse(G);
return 0;
}
```
输入示例:
```
请输入顶点数和边数:5 6
请输入顶点编号:
0 1 2 3 4
请输入每条边的起点编号和终点编号:
0 1
0 4
1 2
1 4
3 0
3 2
```
输出示例:
```
邻接矩阵为:
0 1 2 3 4
0 0 1 0 0 1
1 0 0 1 0 1
2 0 0 0 0 0
3 1 0 1 0 0
4 0 0 0 0 0
DFS遍历结果为:0 1 2 4 3
```
阅读全文