#include <stdio.h> #include <stdlib.h> #define MAX_VERTICES 50 typedef struct Graph { int num_vertices; int adj_matrix[MAX_VERTICES][MAX_VERTICES]; } Graph; void dfs(Graph *graph, int vertex, int visited[]) { visited[vertex] = 1; printf("%d ", vertex); for (int i = 0; i < graph->num_vertices; i++) { if (graph->adj_matrix[vertex][i] == 1 && visited[i] == 0) { dfs(graph, i, visited); } } } void bfs(Graph *graph, int vertex, int visited[]) { int queue[MAX_VERTICES]; int front = -1; int rear = -1; visited[vertex] = 1; queue[++rear] = vertex; while (front != rear) { vertex = queue[++front]; printf("%d ", vertex); for (int i = 0; i < graph->num_vertices; i++) { if (graph->adj_matrix[vertex][i] == 1 && visited[i] == 0) { visited[i] = 1; queue[++rear] = i; } } } } int main() { Graph *graph = (Graph*) malloc(sizeof(Graph)); graph->num_vertices = 6; int adj_matrix[6][6] = { {0, 1, 1, 0, 0, 0}, {1, 0, 0, 1, 1, 0}, {1, 0, 0, 0, 0, 1}, {0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 1}, {0, 0, 1, 0, 1, 0} }; for (int i = 0; i < graph->num_vertices; i++) { for (int j = 0; j < graph->num_vertices; j++) { graph->adj_matrix[i][j] = adj_matrix[i][j]; } } int visited[MAX_VERTICES] = {0}; printf("DFS: "); dfs(graph, 0, visited); printf("\n"); for (int i = 0; i < graph->num_vertices; i++) { visited[i] = 0; } printf("BFS: "); bfs(graph, 0, visited); printf("\n"); free(graph); return 0; }解释这些代码
时间: 2024-04-26 09:22:25 浏览: 90
这段代码是一个基于邻接矩阵表示法的图的深度优先遍历(DFS)和广度优先遍历(BFS)算法的实现。具体解释如下:
首先,定义了一个Graph结构体,其中包含了图的顶点数和邻接矩阵adj_matrix,用于存储图的边信息。
然后,定义了dfs和bfs两个函数。其中dfs函数用于深度优先遍历图,它采用递归的方式遍历图中的每个连通分量(connected component),并将遍历过的节点打印出来。bfs函数则用于广度优先遍历图,它采用队列的方式遍历图中的每个连通分量,也将遍历过的节点打印出来。
在main函数中,先使用malloc函数动态分配了一个Graph结构体,并初始化了图的顶点数和邻接矩阵。然后,定义了一个visited数组,用于记录每个节点是否被访问过。接着,分别调用了dfs和bfs函数,传入图、起始节点和visited数组,进行遍历,并打印出遍历结果。最后,使用free函数释放了Graph结构体的内存。
总体来说,这段代码是一个简单而实用的图的遍历算法实现,可以用于求解图的连通性、最短路径等问题。
相关问题
#include <stdio.h> #include <stdlib.h> #define MaxInt 32767 #define MVNum 100 typedef char VerTexType; typedef int ArcType; typedef struct { VerTexType vexs[MVNum]; ArcType arcs[MVNum]; int vexnum,arcnum; }AMGraph;这段C语言代码怎么完善
这段C语言代码需要完善的地方是定义一个函数来创建一个邻接矩阵图。可以按照以下步骤来完善代码:
1. 定义一个函数,例如createAMGraph,用于创建邻接矩阵图。该函数的返回值为AMGraph类型的指针。
2. 在函数中,首先创建一个AMGraph类型的指针g,并为其分配内存空间。
3. 读入顶点数和边数,并将其存储在g中。
4. 读入顶点信息,并将其存储在g的vexs数组中。
5. 初始化g的arcs数组,将所有元素赋值为MaxInt,表示两个顶点之间没有边。
6. 读入边信息,并将其存储在g的arcs数组中。
7. 返回g指针。
以下是完善后的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct {
VerTexType vexs[MVNum];
ArcType arcs[MVNum][MVNum];
int vexnum, arcnum;
} AMGraph;
AMGraph* createAMGraph() {
AMGraph* g = (AMGraph*)malloc(sizeof(AMGraph));
if (g == NULL) {
printf("Memory allocation failed.\n");
exit(1);
}
printf("Enter the number of vertices: ");
scanf("%d", &g->vexnum);
printf("Enter the number of edges: ");
scanf("%d", &g->arcnum);
printf("Enter the vertex information:\n");
for (int i = 0; i < g->vexnum; i++) {
printf("Vertex %d: ", i);
scanf("%c", &g->vexs[i]);
}
for (int i = 0; i < g->vexnum; i++) {
for (int j = 0; j < g->vexnum; j++) {
g->arcs[i][j] = MaxInt;
}
}
printf("Enter the edge information:\n");
for (int i = 0; i < g->arcnum; i++) {
int v1, v2, w;
printf("Edge %d (v1 v2 weight): ", i);
scanf("%d %d %d", &v1, &v2, &w);
g->arcs[v1][v2] = w;
}
return g;
}
int main() {
AMGraph* g = createAMGraph();
// Do something with the graph
free(g);
return 0;
}
```
#include "graph.h" #include <stdio.h> #include <stdlib.h> void CreateAdj(AdjGraph *&G,int A[MAXV][MAXV],int n,int e) //创建图的邻接表 { int i,j; ArcNode *p; G=(AdjGraph *)malloc(sizeof(AdjGraph)); for(i=0;i<n;i++)
这是一个创建图的邻接表的函数实现,其中AdjGraph是图的邻接表结构体,定义如下:
```c
#define MAXV 100 // 最大顶点数
typedef struct ArcNode{ // 边结点
int adjvex; // 邻接点
struct ArcNode *next; // 指向下一个邻接点的指针
}ArcNode;
typedef struct VNode{ // 顶点结点
int data; // 顶点的数据
ArcNode *first; // 指向第一个邻接点的指针
}VNode, AdjList[MAXV];
typedef struct{ // 邻接表
AdjList vertices; // 存放顶点的数组
int vexnum, arcnum; // 顶点数和边数
}AdjGraph;
```
下面是CreateAdj函数的实现:
```c
void CreateAdj(AdjGraph *&G, int A[MAXV][MAXV], int n, int e)
{
int i, j;
ArcNode *p;
G = (AdjGraph *)malloc(sizeof(AdjGraph)); // 分配内存空间
for(i = 0; i < n; i++)
{
G->vertices[i].data = i; // 初始化顶点的数据
G->vertices[i].first = NULL; // 初始化指向第一个邻接点的指针
for(j = 0; j < n; j++)
{
if(A[i][j] != 0) // 如果顶点i和顶点j之间有边
{
p = (ArcNode *)malloc(sizeof(ArcNode)); // 创建边结点
p->adjvex = j; // 邻接点为j
p->next = G->vertices[i].first; // 将该边结点插入到顶点i的邻接表头部
G->vertices[i].first = p;
}
}
}
G->vexnum = n; // 顶点数为n
G->arcnum = e; // 边数为e
}
```
其中,A[MAXV][MAXV]是一个邻接矩阵,n是顶点数,e是边数。函数的作用是将邻接矩阵转换为邻接表存储法。
阅读全文