写一个C语言程序,内容为使用图的邻接表的存储结构实现有向图、无向图和网的建立算法,并实现深度优先遍历及广度优先遍历
时间: 2024-02-17 14:03:01 浏览: 86
好的,以下是实现有向图、无向图和网的建立算法,并实现深度优先遍历及广度优先遍历的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20 // 图中最大顶点数
typedef enum {DG, DN, UDG, UDN} GraphKind; // 图的种类:DG-有向图,DN-有向网,UDG-无向图,UDN-无向网
// 边表结构体
typedef struct ArcNode {
int adjvex; // 邻接点的位置
int weight; // 权值
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
// 顶点表结构体(图的顶点)
typedef struct VNode {
char data; // 顶点的数据
ArcNode *firstarc; // 指向第一个邻接点的指针
} VNode;
// 图结构体
typedef struct {
VNode vexs[MAX_VERTEX_NUM]; // 存储顶点的数组
int vexnum, arcnum; // 顶点数和边数
GraphKind kind; // 图的种类
} Graph;
// 初始化图
void InitGraph(Graph *G, GraphKind kind) {
int i, j;
G->kind = kind;
printf("请输入图的顶点数和边数:");
scanf("%d%d", &(G->vexnum), &(G->arcnum));
printf("请输入图的顶点数据:");
for (i = 0; i < G->vexnum; i++) {
scanf(" %c", &(G->vexs[i].data));
G->vexs[i].firstarc = NULL;
}
printf("请输入图的边信息(起点 终点 权值):\n");
for (i = 0; i < G->arcnum; i++) {
int v1, v2, w;
printf("第%d条边:", i+1);
scanf("%d%d%d", &v1, &v2, &w);
ArcNode *arc = (ArcNode*)malloc(sizeof(ArcNode));
arc->adjvex = v2;
arc->weight = w;
arc->next = G->vexs[v1].firstarc;
G->vexs[v1].firstarc = arc;
if (kind == UDG || kind == UDN) { // 如果是无向图或无向网,需要添加反向边
arc = (ArcNode*)malloc(sizeof(ArcNode));
arc->adjvex = v1;
arc->weight = w;
arc->next = G->vexs[v2].firstarc;
G->vexs[v2].firstarc = arc;
}
}
}
// 访问顶点v
void visit(int v) {
printf("%c ", v);
}
// 深度优先遍历
void DFS(Graph *G, int v, int *visited) {
visit(G->vexs[v].data); // 访问当前顶点
visited[v] = 1; // 标记当前顶点为已访问
ArcNode *p = G->vexs[v].firstarc;
while (p != NULL) { // 遍历当前顶点的邻接点
if (!visited[p->adjvex]) { // 如果邻接点未被访问
DFS(G, p->adjvex, visited); // 递归访问邻接点
}
p = p->next;
}
}
// 广度优先遍历
void BFS(Graph *G, int v, int *visited) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
visit(G->vexs[v].data); // 访问当前顶点
visited[v] = 1; // 标记当前顶点为已访问
queue[rear++] = v; // 将当前顶点入队列
while (front != rear) { // 队列不为空时循环
int u = queue[front++]; // 取出队头顶点
ArcNode *p = G->vexs[u].firstarc;
while (p != NULL) { // 遍历当前顶点的邻接点
if (!visited[p->adjvex]) { // 如果邻接点未被访问
visit(G->vexs[p->adjvex].data); // 访问邻接点
visited[p->adjvex] = 1; // 标记邻接点为已访问
queue[rear++] = p->adjvex; // 将邻接点入队列
}
p = p->next;
}
}
}
int main() {
Graph G;
int visited[MAX_VERTEX_NUM] = {0}; // 标记顶点是否被访问过
printf("请选择图的种类:\n");
printf("1. 有向图\n");
printf("2. 有向网\n");
printf("3. 无向图\n");
printf("4. 无向网\n");
int kind;
scanf("%d", &kind);
switch (kind) {
case 1:
InitGraph(&G, DG);
break;
case 2:
InitGraph(&G, DN);
break;
case 3:
InitGraph(&G, UDG);
break;
case 4:
InitGraph(&G, UDN);
break;
default:
printf("错误的输入!\n");
return 0;
}
printf("深度优先遍历结果为:");
for (int i = 0; i < G.vexnum; i++) { // 遍历所有顶点,防止非连通图出现
if (!visited[i]) { // 如果顶点未被访问
DFS(&G, i, visited); // 深度优先遍历
}
}
printf("\n");
for (int i = 0; i < G.vexnum; i++) { // 重置visited数组
visited[i] = 0;
}
printf("广度优先遍历结果为:");
for (int i = 0; i < G.vexnum; i++) { // 遍历所有顶点,防止非连通图出现
if (!visited[i]) { // 如果顶点未被访问
BFS(&G, i, visited); // 广度优先遍历
}
}
printf("\n");
return 0;
}
```
注意:以上程序中的图的顶点数据为字符,可以根据需要修改为其他类型的数据。另外,为了简化代码,程序中没有对输入的数据进行错误处理,实际使用时需要注意。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)