用C语言写遍历有向图的程序,要求能实现两种遍历方式
时间: 2024-03-11 17:50:05 浏览: 66
好的,我来回答你的问题。
首先,遍历有向图有两种方式:深度优先遍历(DFS)和广度优先遍历(BFS)。下面是用C语言实现这两种遍历方式的代码:
深度优先遍历:
```c
#define MAX_VERTEX_NUM 100 // 最大顶点数
int visited[MAX_VERTEX_NUM]; // 记录顶点是否已经访问过
// 邻接表存储有向图的结构体定义
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *next; // 指向下一条弧的指针
} ArcNode;
typedef struct VNode {
char data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和弧数
} ALGraph;
// 深度优先遍历
void DFSTraverse(ALGraph *G, int v) {
visited[v] = 1; // 标记顶点v已经访问过
printf("%c ", G->vertices[v].data); // 输出顶点v的信息
ArcNode *p = G->vertices[v].firstarc; // 指向顶点v的第一条弧
while (p) {
int w = p->adjvex; // w为顶点v的邻接点
if (!visited[w]) {
DFSTraverse(G, w); // 递归访问邻接点w
}
p = p->next; // 指向顶点v的下一条弧
}
}
// 深度优先遍历入口函数
void DFS(ALGraph *G) {
for (int i = 0; i < G->vexnum; i++) {
visited[i] = 0; // 初始化visited数组
}
for (int i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
DFSTraverse(G, i); // 从未访问过的顶点开始深度优先遍历
}
}
}
```
广度优先遍历:
```c
#define MAX_VERTEX_NUM 100 // 最大顶点数
int visited[MAX_VERTEX_NUM]; // 记录顶点是否已经访问过
// 邻接表存储有向图的结构体定义
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *next; // 指向下一条弧的指针
} ArcNode;
typedef struct VNode {
char data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和弧数
} ALGraph;
// 广度优先遍历
void BFSTraverse(ALGraph *G, int v) {
int queue[MAX_VERTEX_NUM]; // 队列
int front = 0, rear = 0; // 队列的头和尾
visited[v] = 1; // 标记顶点v已经访问过
printf("%c ", G->vertices[v].data); // 输出顶点v的信息
queue[rear++] = v; // 将顶点v入队列
while (front != rear) {
int w = queue[front++]; // 出队列
ArcNode *p = G->vertices[w].firstarc; // 指向顶点w的第一条弧
while (p) {
int u = p->adjvex; // u为顶点w的邻接点
if (!visited[u]) {
visited[u] = 1; // 标记顶点u已经访问过
printf("%c ", G->vertices[u].data); // 输出顶点u的信息
queue[rear++] = u; // 将顶点u入队列
}
p = p->next; // 指向顶点w的下一条弧
}
}
}
// 广度优先遍历入口函数
void BFS(ALGraph *G) {
for (int i = 0; i < G->vexnum; i++) {
visited[i] = 0; // 初始化visited数组
}
for (int i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
BFSTraverse(G, i); // 从未访问过的顶点开始广度优先遍历
}
}
}
```
以上就是用C语言实现遍历有向图的程序,能够实现深度优先遍历和广度优先遍历的代码。希望对你有所帮助!
阅读全文