用c语言编程实现如下功能: (1)输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图。 (2)对图进行深度优先搜索和广度优先搜索遍历,并分别输出其遍历序列。并给出注释
时间: 2024-02-06 17:09:07 浏览: 30
以下是用 C 语言实现输入无向图的顶点数、边数及各条边的顶点对,建立用邻接表表示的无向图的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 顶点数的最大值
typedef struct ArcNode { // 边结点
int adjvex; // 相邻顶点的序号
struct ArcNode *nextarc; // 指向下一条边的指针
} ArcNode;
typedef struct VNode { // 顶点结点
int data; // 顶点的数据
ArcNode *firstarc; // 指向第一条边的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct { // 图
AdjList vertices; // 顶点表
int vexnum, arcnum; // 顶点数和边数
} Graph;
void CreateGraph(Graph *G) { // 建立无向图的邻接表
int i, j, k;
ArcNode *p;
printf("请输入顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
for (i = 0; i < G->vexnum; ++i) { // 初始化顶点表
printf("请输入第%d个顶点的数据:", i + 1);
scanf("%d", &G->vertices[i].data);
G->vertices[i].firstarc = NULL;
}
for (k = 0; k < G->arcnum; ++k) { // 建立边表
printf("请输入第%d条边的顶点对应的序号:", k + 1);
scanf("%d%d", &i, &j);
p = (ArcNode *)malloc(sizeof(ArcNode)); // 创建边结点
p->adjvex = j - 1;
p->nextarc = G->vertices[i - 1].firstarc; // 插入到 i 的边表头部
G->vertices[i - 1].firstarc = p;
p = (ArcNode *)malloc(sizeof(ArcNode)); // 创建边结点
p->adjvex = i - 1;
p->nextarc = G->vertices[j - 1].firstarc; // 插入到 j 的边表头部
G->vertices[j - 1].firstarc = p;
}
}
int visited[MAX_VERTEX_NUM]; // 全局数组,记录顶点是否被访问过
void DFS(Graph G, int v) { // 深度优先搜索遍历
ArcNode *p;
visited[v] = 1; // 标记为已访问
printf("%d ", G.vertices[v].data); // 输出遍历序列
for (p = G.vertices[v].firstarc; p; p = p->nextarc) { // 遍历相邻顶点
if (!visited[p->adjvex]) { // 如果相邻顶点未被访问过
DFS(G, p->adjvex); // 递归访问相邻顶点
}
}
}
void BFS(Graph G, int v) { // 广度优先搜索遍历
ArcNode *p;
int queue[MAX_VERTEX_NUM], front = 0, rear = 0; // 队列
visited[v] = 1; // 标记为已访问
printf("%d ", G.vertices[v].data); // 输出遍历序列
queue[rear++] = v; // 入队
while (front != rear) { // 队列不为空
v = queue[front++]; // 出队
for (p = G.vertices[v].firstarc; p; p = p->nextarc) { // 遍历相邻顶点
if (!visited[p->adjvex]) { // 如果相邻顶点未被访问过
visited[p->adjvex] = 1; // 标记为已访问
printf("%d ", G.vertices[p->adjvex].data); // 输出遍历序列
queue[rear++] = p->adjvex; // 入队
}
}
}
}
int main() {
Graph G;
int i;
CreateGraph(&G);
printf("深度优先搜索遍历序列:");
for (i = 0; i < G.vexnum; ++i) { // 初始化 visited 数组
visited[i] = 0;
}
for (i = 0; i < G.vexnum; ++i) { // 遍历所有顶点
if (!visited[i]) { // 如果顶点未被访问过
DFS(G, i); // 从该顶点开始进行深度优先搜索遍历
}
}
printf("\n广度优先搜索遍历序列:");
for (i = 0; i < G.vexnum; ++i) { // 初始化 visited 数组
visited[i] = 0;
}
for (i = 0; i < G.vexnum; ++i) { // 遍历所有顶点
if (!visited[i]) { // 如果顶点未被访问过
BFS(G, i); // 从该顶点开始进行广度优先搜索遍历
}
}
printf("\n");
return 0;
}
```
注释已经在代码中给出。