用C语言实现使用邻接矩阵或链接表来存储图,并编程实现DFS和BFS算法
时间: 2023-07-14 16:14:01 浏览: 129
好的,这里给出使用邻接矩阵来存储图,并实现DFS和BFS算法的C语言代码示例。
首先,我们需要定义一个结构体来表示图:
```
#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;
```
其中,`vexs`数组存储顶点的值,`arcs`数组存储边的邻接矩阵,`vexnum`表示顶点数,`arcnum`表示边数。
接下来,我们可以定义一个函数来创建图:
```
void createGraph(Graph *G) {
printf("请输入顶点数和边数:");
scanf("%d %d", &G->vexnum, &G->arcnum);
printf("请输入顶点的值:");
for (int i = 0; i < G->vexnum; i++) {
scanf("%d", &G->vexs[i]);
}
// 初始化邻接矩阵
for (int i = 0; i < G->vexnum; i++) {
for (int j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = 0;
}
}
printf("请输入每条边的起点和终点:");
int v1, v2;
for (int k = 0; k < G->arcnum; k++) {
scanf("%d %d", &v1, &v2);
int i = locateVex(G, v1);
int j = locateVex(G, v2);
G->arcs[i][j] = 1;
G->arcs[j][i] = 1; // 无向图需加上这行
}
}
```
该函数从标准输入中读取顶点数和边数,以及每个顶点的值,然后根据输入的起点和终点在邻接矩阵中设置对应的边。
我们还需要一个函数来查找某个值对应的顶点在图中的位置:
```
int locateVex(Graph *G, int v) {
for (int i = 0; i < G->vexnum; i++) {
if (G->vexs[i] == v) {
return i;
}
}
return -1;
}
```
接下来,我们可以实现DFS算法:
```
void DFS(Graph *G, int v, int visited[]) {
printf("%d ", G->vexs[v]);
visited[v] = 1;
for (int i = 0; i < G->vexnum; i++) {
if (G->arcs[v][i] == 1 && visited[i] == 0) {
DFS(G, i, visited);
}
}
}
```
该函数从给定的起点v开始,输出其值并将其标记为已访问,然后递归遍历所有与v相连的未访问过的顶点。
最后,我们可以实现BFS算法:
```
void BFS(Graph *G, int v, int visited[]) {
int queue[MAX_VERTEX_NUM];
int front = 0, rear = 0;
printf("%d ", G->vexs[v]);
visited[v] = 1;
queue[rear++] = v;
while (front < rear) {
int w = queue[front++];
for (int i = 0; i < G->vexnum; i++) {
if (G->arcs[w][i] == 1 && visited[i] == 0) {
printf("%d ", G->vexs[i]);
visited[i] = 1;
queue[rear++] = i;
}
}
}
}
```
该函数从给定的起点v开始,输出其值并将其标记为已访问,然后将其加入队列中。然后不断从队列中取出一个顶点,遍历其所有未访问过的邻接点,并将其加入队列中。
完整代码如下:
阅读全文