用c语言编写程序,构造无向图的邻接矩阵基于邻接矩阵存储的DFS遍历算法,用户输入图的顶点数和边数,顶点序列,图中边的顶点对序列,遍历的起始顶点:,完整代码,算法思想
时间: 2024-03-25 11:41:21 浏览: 60
好的,以下是用 C 语言编写的程序,可以构造无向图的邻接矩阵,并基于邻接矩阵存储的 DFS 遍历算法进行遍历:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 图的最大顶点数
// 定义邻接矩阵结构体
typedef struct {
int vexs[MAX_VERTEX_NUM]; // 存储图的顶点
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储图的边
int vexnum; // 存储顶点数
int arcnum; // 存储边数
} Graph;
// 初始化图
void initGraph(Graph *G) {
int i, j;
G->vexnum = 0;
G->arcnum = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vexs[i] = 0;
for (j = 0; j < MAX_VERTEX_NUM; j++) {
G->arcs[i][j] = 0;
}
}
}
// 创建无向图的邻接矩阵
void createGraph(Graph *G) {
int i, j, k, v1, v2;
printf("请输入图的顶点数和边数:");
scanf("%d%d", &(G->vexnum), &(G->arcnum));
printf("请输入图的顶点序列:");
for (i = 0; i < G->vexnum; i++) {
scanf("%d", &(G->vexs[i]));
}
for (i = 0; i < G->arcnum; i++) {
printf("请输入第 %d 条边的顶点对序列:", i + 1);
scanf("%d%d", &v1, &v2);
for (j = 0; j < G->vexnum; j++) {
if (G->vexs[j] == v1) {
break;
}
}
for (k = 0; k < G->vexnum; k++) {
if (G->vexs[k] == v2) {
break;
}
}
G->arcs[j][k] = 1;
G->arcs[k][j] = 1;
}
}
// DFS 遍历算法
void DFS(Graph G, int v, int *visited) {
int i;
visited[v] = 1;
printf("%d ", G.vexs[v]);
for (i = 0; i < G.vexnum; i++) {
if (G.arcs[v][i] == 1 && visited[i] == 0) {
DFS(G, i, visited);
}
}
}
int main() {
Graph G;
int visited[MAX_VERTEX_NUM];
int i;
initGraph(&G);
createGraph(&G);
printf("请输入遍历的起始顶点:");
int v;
scanf("%d", &v);
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
DFS(G, v, visited);
printf("\n");
return 0;
}
```
算法思想:
1. 定义邻接矩阵结构体,包含存储图的顶点和边的数组,以及顶点数和边数。
2. 初始化图,将顶点和边的数组全部清空。
3. 创建无向图的邻接矩阵,用户输入图的顶点数和边数,顶点序列,边的顶点对序列,程序通过遍历顶点数组找到对应的下标,然后在邻接矩阵中将对应的元素设为 1。
4. 实现 DFS 遍历算法,遍历起始顶点为用户输入的顶点,使用 visited 数组记录每个顶点是否被访问过,如果当前顶点未被访问,则输出该顶点,将 visited 数组中的对应位置设为 1,然后递归地对所有与该顶点相连的未访问过的顶点进行 DFS 遍历。
阅读全文