用c语言编写程序且用邻接矩阵或邻接表创建图然后进行DFS和BFS操作
时间: 2024-05-13 10:16:01 浏览: 112
数据结构课程设计
好的,下面是用C语言编写程序,用邻接矩阵创建图,再进行DFS和BFS的操作。
首先,我们需要定义一个结构体来表示图中的边:
```c
typedef struct {
int src; // 边的起点
int dest; // 边的终点
} Edge;
```
然后,我们可以定义一个结构体来表示图:
```c
#define MAX_VERTICES 100 // 最大顶点数
typedef struct {
int num_vertices; // 顶点数
int num_edges; // 边数
int adj_matrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
} Graph;
```
其中,`num_vertices`表示图中的顶点数,`num_edges`表示图中的边数,`adj_matrix`是一个二维数组,表示图的邻接矩阵。如果`adj_matrix[i][j]`为1,表示顶点i和j之间有一条边;如果为0,表示没有边。
接下来,我们可以编写代码来创建图:
```c
void init_graph(Graph* g, int num_vertices) {
g->num_vertices = num_vertices;
g->num_edges = 0;
for (int i = 0; i < num_vertices; i++) {
for (int j = 0; j < num_vertices; j++) {
g->adj_matrix[i][j] = 0;
}
}
}
void add_edge(Graph* g, int src, int dest) {
Edge e = { src, dest };
g->adj_matrix[src][dest] = 1;
g->num_edges++;
}
```
首先,`init_graph`函数用于初始化图,将`num_vertices`赋值为顶点数,将`num_edges`赋值为0,将邻接矩阵中的所有元素都赋值为0。
然后,`add_edge`函数用于添加一条边,将邻接矩阵中对应的元素设为1,表示有一条边。
接下来,我们可以编写代码来进行DFS和BFS操作:
```c
void dfs(Graph* g, int v, int visited[]) {
visited[v] = 1;
printf("%d ", v);
for (int i = 0; i < g->num_vertices; i++) {
if (g->adj_matrix[v][i] == 1 && visited[i] == 0) {
dfs(g, i, visited);
}
}
}
void bfs(Graph* g, int v, int visited[]) {
int queue[MAX_VERTICES];
int front = 0, rear = 0;
visited[v] = 1;
printf("%d ", v);
queue[rear++] = v;
while (front != rear) {
int cur = queue[front++];
for (int i = 0; i < g->num_vertices; i++) {
if (g->adj_matrix[cur][i] == 1 && visited[i] == 0) {
visited[i] = 1;
printf("%d ", i);
queue[rear++] = i;
}
}
}
}
```
以上代码中,`dfs`函数用于进行深度优先搜索,`bfs`函数用于进行广度优先搜索。这两个函数都接受一个`visited`数组作为参数,用于记录每个顶点是否已访问过。
在`dfs`函数中,我们首先将当前顶点标记为已访问,然后输出当前顶点的值。然后遍历所有与当前顶点相邻的顶点,如果该相邻顶点未被访问过,则递归调用`dfs`函数。
在`bfs`函数中,我们首先将起始顶点标记为已访问,并将其加入队列中。然后,我们进入一个while循环,直到队列为空。在循环中,我们取出队头顶点,输出其值,并遍历所有与其相邻的未访问过的顶点,将其标记为已访问,并加入队列中。
最后,我们可以编写一个主函数来测试我们的程序:
```c
int main() {
Graph g;
init_graph(&g, 5);
add_edge(&g, 0, 1);
add_edge(&g, 0, 2);
add_edge(&g, 1, 2);
add_edge(&g, 2, 0);
add_edge(&g, 2, 3);
add_edge(&g, 3, 3);
int visited[MAX_VERTICES] = { 0 };
printf("DFS: ");
dfs(&g, 2, visited);
printf("\n");
for (int i = 0; i < g.num_vertices; i++) {
visited[i] = 0;
}
printf("BFS: ");
bfs(&g, 2, visited);
printf("\n");
return 0;
}
```
以上代码中,我们首先创建了一个图,并添加了一些边。然后,我们分别调用`dfs`和`bfs`函数来进行深度优先搜索和广度优先搜索。最后,我们输出搜索结果。
完整代码如下:
阅读全文