用c语言写一个用邻接表存储的连通图,并能分别用深度优先和广度优先遍历的算法
时间: 2024-02-25 19:57:27 浏览: 80
邻接表存储图深度优先广度优先遍历
好的,下面是代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
// 邻接表结点
typedef struct ArcNode {
int adjvex; // 该弧指向的顶点位置
struct ArcNode *nextarc; // 指向下一条弧的指针
} ArcNode;
// 顶点结构体
typedef struct {
int data; // 顶点的数据
ArcNode *firstarc; // 指向第一条依附于该顶点的弧的指针
} VNode, AdjList[MAX_VERTEX_NUM];
// 图结构体
typedef struct {
AdjList vertices; // 顶点数组
int vexnum, arcnum; // 顶点数和弧数
} ALGraph;
// 初始化邻接表图
void InitGraph(ALGraph *G, int vexnum, int arcnum)
{
G->vexnum = vexnum;
G->arcnum = arcnum;
for (int i = 0; i < G->vexnum; i++) {
printf("请输入第%d个顶点的数据:", i + 1);
scanf("%d", &G->vertices[i].data);
G->vertices[i].firstarc = NULL; // 没有依附的弧
}
for (int i = 0; i < G->arcnum; i++) {
int tail, head;
printf("请输入第%d条弧的起点和终点位置(用空格隔开):", i + 1);
scanf("%d %d", &tail, &head);
ArcNode *arc = (ArcNode *)malloc(sizeof(ArcNode));
arc->adjvex = head - 1;
arc->nextarc = G->vertices[tail - 1].firstarc;
G->vertices[tail - 1].firstarc = arc; // 将弧插入到起点的邻接表中
}
}
// 深度优先遍历
void DFS(ALGraph G, int v, int *visited)
{
visited[v] = 1;
printf("%d ", G.vertices[v].data);
ArcNode *p = G.vertices[v].firstarc;
while (p) {
if (!visited[p->adjvex]) {
DFS(G, p->adjvex, visited);
}
p = p->nextarc;
}
}
// 广度优先遍历
void BFS(ALGraph G, int v, int *visited)
{
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
visited[v] = 1;
printf("%d ", G.vertices[v].data);
queue[rear++] = v;
while (front != rear) {
int w = queue[front++];
ArcNode *p = G.vertices[w].firstarc;
while (p) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = 1;
printf("%d ", G.vertices[p->adjvex].data);
queue[rear++] = p->adjvex;
}
p = p->nextarc;
}
}
}
int main()
{
ALGraph G;
int vexnum, arcnum;
printf("请输入顶点数和弧数(用空格隔开):");
scanf("%d %d", &vexnum, &arcnum);
InitGraph(&G, vexnum, arcnum);
int visited[MAX_VERTEX_NUM] = {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[i] = 0; // 重置标记数组
}
printf("广度优先遍历:");
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
BFS(G, i, visited);
}
}
printf("\n");
return 0;
}
```
注:这里的邻接表图中,顶点的数据类型为 `int`,可以根据需要修改。使用时,输入顶点的数据时,顺序为从第1个顶点到第n个顶点,弧的起点和终点位置也是从1开始编号的。
阅读全文