使用C语言用邻接表作为图的存储结构建立一个图,并对此图分别进行深度优先搜索和广度优先搜索遍历
时间: 2024-03-15 17:46:35 浏览: 66
好的,我可以回答你的问题。首先,我们需要了解一下邻接表的概念和图的遍历算法。
邻接表是一种常用的图的存储结构,它采用链式存储方式,能够有效地表示稀疏图。邻接表由一个一维数组和若干个链表组成,其中数组中的每个元素对应一个链表,该链表存储该节点所连接的所有节点。
图的遍历算法有两种,即深度优先搜索和广度优先搜索。深度优先搜索是从起点开始,沿着一条路径一直走到底,直到无法再继续下去,然后回溯到上一个节点,再沿着另一条路径继续走下去,直到遍历完所有节点。广度优先搜索是从起点开始,按照距离逐层遍历,先遍历离起点最近的节点,再遍历离起点更远的节点,直到遍历完所有节点。
下面是使用C语言实现邻接表存储结构的图,并对其进行深度优先搜索和广度优先搜索遍历的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 最大节点数
// 邻接表结构体定义
typedef struct ArcNode {
int adjvex; // 邻接点在数组中的位置
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode {
char data; // 节点数据
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 节点数和边数
} ALGraph;
// 初始化邻接表
void InitGraph(ALGraph *G) {
int i;
G->vexnum = G->arcnum = 0;
for (i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].data = ' ';
G->vertices[i].firstarc = NULL;
}
}
// 插入节点
int InsertVex(ALGraph *G, char v) {
if (G->vexnum >= MAX_VERTEX_NUM) {
printf("Error: too many vertices!\n");
return 0;
}
G->vertices[G->vexnum].data = v;
G->vexnum++;
return 1;
}
// 插入边
int InsertArc(ALGraph *G, int v, int w) {
ArcNode *p;
if (v < 0 || v >= G->vexnum || w < 0 || w >= G->vexnum) {
printf("Error: invalid vertex index!\n");
return 0;
}
p = (ArcNode *) malloc(sizeof(ArcNode));
p->adjvex = w;
p->next = G->vertices[v].firstarc;
G->vertices[v].firstarc = p;
G->arcnum++;
return 1;
}
// 深度优先搜索遍历
void DFS(ALGraph *G, int v, int visited[]) {
ArcNode *p;
visited[v] = 1;
printf("%c ", G->vertices[v].data);
p = G->vertices[v].firstarc;
while (p != NULL) {
if (!visited[p->adjvex]) {
DFS(G, p->adjvex, visited);
}
p = p->next;
}
}
// 广度优先搜索遍历
void BFS(ALGraph *G, int v, int visited[]) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0, i;
ArcNode *p;
visited[v] = 1;
printf("%c ", G->vertices[v].data);
queue[rear++] = v;
while (front < rear) {
i = queue[front++];
p = G->vertices[i].firstarc;
while (p != NULL) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = 1;
printf("%c ", G->vertices[p->adjvex].data);
queue[rear++] = p->adjvex;
}
p = p->next;
}
}
}
int main() {
ALGraph G;
int visited[MAX_VERTEX_NUM] = {0}; // 标记节点是否被访问过
InitGraph(&G);
InsertVex(&G, 'A');
InsertVex(&G, 'B');
InsertVex(&G, 'C');
InsertVex(&G, 'D');
InsertVex(&G, 'E');
InsertArc(&G, 0, 1);
InsertArc(&G, 0, 2);
InsertArc(&G, 1, 0);
InsertArc(&G, 1, 3);
InsertArc(&G, 1, 4);
InsertArc(&G, 2, 0);
InsertArc(&G, 2, 3);
InsertArc(&G, 3, 1);
InsertArc(&G, 3, 2);
InsertArc(&G, 3, 4);
InsertArc(&G, 4, 1);
InsertArc(&G, 4, 3);
printf("DFS: ");
DFS(&G, 0, visited);
printf("\nBFS: ");
for (int i = 0; i < MAX_VERTEX_NUM; i++) {
visited[i] = 0;
}
BFS(&G, 0, visited);
printf("\n");
return 0;
}
```
在上面的代码中,我们定义了一个邻接表结构体`ALGraph`,并实现了初始化邻接表、插入节点和边、深度优先搜索和广度优先搜索遍历等函数。在`main()`函数中,我们创建了一个包含5个节点和7条边的图,并对其进行了深度优先搜索和广度优先搜索遍历。
希望这个例子可以帮助你理解邻接表的概念和图的遍历算法。
阅读全文