C语言设无向图G有n个顶点(设顶点值用1~n编号),m条边。 编写程序,实现以下功能: (1)创建图的邻接表存储结构(存储邻接表时,按给定的边的顺序依次生成边结点,将新生成的边结点插入在链表的头部) (2)深度优先遍历 (3)广度优先遍历
时间: 2024-02-05 10:03:01 浏览: 99
数据结构实验3
以下是C语言实现无向图的邻接表存储结构,并实现深度优先遍历和广度优先遍历的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
#define FALSE 0
#define TRUE 1
typedef int Status; // 状态码
typedef int VertexType; // 顶点类型
// 边表结点
typedef struct ArcNode {
int adjvex; // 邻接点在顶点表中的下标
struct ArcNode *nextarc; // 指向下一个邻接点
} ArcNode;
// 顶点表结点
typedef struct VNode {
VertexType data; // 顶点信息
ArcNode *firstarc; // 指向第一个邻接点
} VNode, AdjList[MAX_VERTEX_NUM];
// 无向图
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和边数
} Graph;
// 建立无向图的邻接表存储结构
Status CreateGraph(Graph *G) {
printf("请输入无向图的顶点数和边数:\n");
scanf("%d%d", &G->vexnum, &G->arcnum);
// 初始化邻接表
for (int i = 0; i < G->vexnum; i++) {
G->vertices[i].data = i + 1;
G->vertices[i].firstarc = NULL;
}
// 逐条插入边
for (int i = 0; i < G->arcnum; i++) {
printf("请输入第%d条边的两个顶点编号:\n", i + 1);
int v1, v2;
scanf("%d%d", &v1, &v2);
// 插入边v1-v2
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = v2 - 1;
p->nextarc = G->vertices[v1 - 1].firstarc;
G->vertices[v1 - 1].firstarc = p;
// 插入边v2-v1
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = v1 - 1;
p->nextarc = G->vertices[v2 - 1].firstarc;
G->vertices[v2 - 1].firstarc = p;
}
return TRUE;
}
// 深度优先遍历
void DFS(Graph G, int v, int *visited) {
visited[v] = TRUE;
printf("%d ", G.vertices[v].data);
for (ArcNode *p = G.vertices[v].firstarc; p != NULL; p = p->nextarc) {
int w = p->adjvex;
if (!visited[w]) {
DFS(G, w, visited);
}
}
}
// 广度优先遍历
void BFS(Graph G, int v, int *visited) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
visited[v] = TRUE;
printf("%d ", G.vertices[v].data);
queue[rear++] = v;
while (front != rear) {
int u = queue[front++];
for (ArcNode *p = G.vertices[u].firstarc; p != NULL; p = p->nextarc) {
int w = p->adjvex;
if (!visited[w]) {
visited[w] = TRUE;
printf("%d ", G.vertices[w].data);
queue[rear++] = w;
}
}
}
}
int main() {
Graph G;
CreateGraph(&G);
printf("深度优先遍历:\n");
int visited[MAX_VERTEX_NUM] = { FALSE };
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
printf("\n广度优先遍历:\n");
for (int i = 0; i < G.vexnum; i++) {
visited[i] = FALSE;
}
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
BFS(G, i, visited);
}
}
return 0;
}
```
其中,深度优先遍历使用递归实现,广度优先遍历使用队列实现。在遍历之前,需要将每个顶点的访问状态初始化为未访问。
阅读全文