C语言代码建立一个有向图的邻接链表表示,实现对图广度优先遍历
时间: 2023-06-24 13:09:13 浏览: 150
以下是 C 语言代码建立有向图的邻接链表表示,以及实现对图的广度优先遍历:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 50 // 最大顶点数
/* 边节点结构体 */
typedef struct edgeNode {
int adjvex; // 邻接点下标
struct edgeNode *next; // 下一个邻接点指针
} EdgeNode;
/* 顶点节点结构体 */
typedef struct vertexNode {
int data; // 顶点信息
EdgeNode *firstEdge; // 第一个邻接点指针
} VertexNode;
/* 图结构体 */
typedef struct {
VertexNode vertices[MAX_VERTICES]; // 顶点数组
int numVertices; // 顶点数
int numEdges; // 边数
} Graph;
/* 初始化图 */
void initGraph(Graph *g) {
int i;
g->numVertices = 0;
g->numEdges = 0;
for (i = 0; i < MAX_VERTICES; i++) {
g->vertices[i].firstEdge = NULL;
}
}
/* 添加顶点 */
void addVertex(Graph *g, int data) {
if (g->numVertices >= MAX_VERTICES) {
printf("Error: too many vertices\n");
exit(1);
}
g->vertices[g->numVertices].data = data;
g->numVertices++;
}
/* 添加边 */
void addEdge(Graph *g, int start, int end) {
EdgeNode *newEdge;
if (start < 0 || start >= g->numVertices ||
end < 0 || end >= g->numVertices) {
printf("Error: invalid vertex index\n");
exit(1);
}
newEdge = (EdgeNode*) malloc(sizeof(EdgeNode));
newEdge->adjvex = end;
newEdge->next = g->vertices[start].firstEdge;
g->vertices[start].firstEdge = newEdge;
g->numEdges++;
}
/* 广度优先遍历 */
void BFS(Graph *g, int start) {
int visited[MAX_VERTICES] = {0};
int queue[MAX_VERTICES];
int front = 0, rear = 0;
EdgeNode *p;
printf("%d ", g->vertices[start].data);
visited[start] = 1;
queue[rear++] = start;
while (front < rear) {
int v = queue[front++];
p = g->vertices[v].firstEdge;
while (p != NULL) {
int w = p->adjvex;
if (!visited[w]) {
printf("%d ", g->vertices[w].data);
visited[w] = 1;
queue[rear++] = w;
}
p = p->next;
}
}
}
int main() {
Graph g;
initGraph(&g);
addVertex(&g, 0);
addVertex(&g, 1);
addVertex(&g, 2);
addVertex(&g, 3);
addVertex(&g, 4);
addEdge(&g, 0, 1);
addEdge(&g, 0, 2);
addEdge(&g, 1, 3);
addEdge(&g, 2, 3);
addEdge(&g, 3, 4);
BFS(&g, 0);
return 0;
}
```
以上代码中,我们使用邻接链表来表示有向图,具体实现方法是将每个顶点用一个 `VertexNode` 结构体来存储,其中包括该顶点的信息(这里我们用一个整数来表示),以及一个指向该顶点的第一个邻接点的指针 `firstEdge`。邻接点则用 `EdgeNode` 结构体来表示,其中包括邻接点的下标 `adjvex`,以及一个指向下一个邻接点的指针 `next`。
在建立好邻接链表之后,我们可以使用广度优先遍历算法对图进行遍历。具体实现方法是使用一个队列来存储待处理的顶点,从起始顶点开始,依次将它的邻接点加入队列中,然后处理队列中的下一个顶点,直到队列为空为止。在遍历的过程中,我们使用一个 `visited` 数组来记录每个顶点是否已经被访问过,避免重复访问同一顶点。
阅读全文