C语言编程实现: 1、 建立一个以邻接表或邻接矩阵形式存储的图; 2、 输出图的邻接表或邻接矩阵表示 3、进行图的深度优先遍历并打印遍历结果; 4、进行图的广度优先遍历并打印遍历结果; 5、退出系统。
时间: 2023-06-13 11:02:14 浏览: 147
好的,以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
// 图的邻接表存储结构
typedef struct ArcNode {
int adjvex; // 邻接点的下标
struct ArcNode *nextarc; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode {
char data; // 顶点的数据
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 存储图的邻接表
int vexnum, arcnum; // 图的顶点数和边数
} ALGraph;
// 创建图的邻接表
void CreateGraph(ALGraph *G) {
printf("请输入图的顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
getchar(); // 读取换行符
// 输入每个顶点的数据
printf("请依次输入每个顶点的数据:");
for (int i = 0; i < G->vexnum; i++) {
scanf("%c", &G->vertices[i].data);
G->vertices[i].firstarc = NULL;
}
getchar(); // 读取换行符
// 输入每条边的信息
printf("请依次输入每条边的信息:\n");
for (int i = 0; i < G->arcnum; i++) {
int v1, v2;
printf("请输入第%d条边的两个顶点的下标:", i + 1);
scanf("%d%d", &v1, &v2);
// 创建邻接点
ArcNode *p = (ArcNode *) malloc(sizeof(ArcNode));
p->adjvex = v2;
p->nextarc = G->vertices[v1].firstarc;
G->vertices[v1].firstarc = p;
// 若是无向图还需创建反向的邻接点
p = (ArcNode *) malloc(sizeof(ArcNode));
p->adjvex = v1;
p->nextarc = G->vertices[v2].firstarc;
G->vertices[v2].firstarc = p;
}
}
// 输出图的邻接表表示
void PrintGraph(ALGraph G) {
printf("图的邻接表表示如下:\n");
for (int i = 0; i < G.vexnum; i++) {
printf("%c -> ", G.vertices[i].data);
ArcNode *p = G.vertices[i].firstarc;
while (p) {
printf("%c -> ", G.vertices[p->adjvex].data);
p = p->nextarc;
}
printf("NULL\n");
}
}
// 图的深度优先遍历
void DFS(ALGraph G, int v, int visited[]) {
printf("%c ", G.vertices[v].data);
visited[v] = 1;
ArcNode *p = G.vertices[v].firstarc;
while (p) {
int w = p->adjvex;
if (!visited[w]) {
DFS(G, w, visited);
}
p = p->nextarc;
}
}
// 进行图的深度优先遍历并打印遍历结果
void DFSTraverse(ALGraph G) {
printf("深度优先遍历结果为:");
int visited[MAX_VERTEX_NUM] = {0};
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
printf("\n");
}
// 图的广度优先遍历
void BFS(ALGraph G, int v, int visited[]) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
printf("%c ", G.vertices[v].data);
visited[v] = 1;
queue[rear++] = v;
while (front != rear) {
int w = queue[front++];
ArcNode *p = G.vertices[w].firstarc;
while (p) {
int u = p->adjvex;
if (!visited[u]) {
printf("%c ", G.vertices[u].data);
visited[u] = 1;
queue[rear++] = u;
}
p = p->nextarc;
}
}
}
// 进行图的广度优先遍历并打印遍历结果
void BFSTraverse(ALGraph G) {
printf("广度优先遍历结果为:");
int visited[MAX_VERTEX_NUM] = {0};
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
BFS(G, i, visited);
}
}
printf("\n");
}
int main() {
ALGraph G;
CreateGraph(&G);
PrintGraph(G);
DFSTraverse(G);
BFSTraverse(G);
return 0;
}
```
注意:以上代码实现的是无向图,如果要实现有向图,只需在创建邻接点时不用创建反向的邻接点即可。
阅读全文