用c语言以邻接表方式建立有向图,分别利用深度优先遍历和广度优先遍历方法输出各结点元素
时间: 2024-02-26 21:57:08 浏览: 200
好的,我可以回答你的问题。以下是用C语言以邻接表方式建立有向图,分别利用深度优先遍历和广度优先遍历方法输出各结点元素的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXV 100 // 最大顶点数
typedef struct node {
int v; // 邻接点编号
struct node *next; // 指向下一个邻接点的指针
} Node;
typedef struct graph {
Node *adj[MAXV]; // 邻接表
int n; // 顶点数
} Graph;
int visited[MAXV]; // 记录节点是否已被访问
// 创建邻接表
void createGraph(Graph *G, int n) {
int i, u, v;
Node *p;
G->n = n;
for (i = 0; i < n; i++) {
G->adj[i] = NULL;
}
printf("请输入边的起点和终点,以-1结束:\n");
while (scanf("%d%d", &u, &v) == 2 && u != -1 && v != -1) {
p = (Node *)malloc(sizeof(Node));
p->v = v;
p->next = G->adj[u];
G->adj[u] = p;
}
}
// 深度优先遍历
void DFS(Graph *G, int v) {
Node *p;
visited[v] = 1;
printf("%d ", v);
for (p = G->adj[v]; p != NULL; p = p->next) {
if (!visited[p->v]) {
DFS(G, p->v);
}
}
}
// 广度优先遍历
void BFS(Graph *G, int v) {
int queue[MAXV];
int front = 0, rear = 0;
Node *p;
visited[v] = 1;
printf("%d ", v);
queue[rear++] = v;
while (front < rear) {
v = queue[front++];
for (p = G->adj[v]; p != NULL; p = p->next) {
if (!visited[p->v]) {
visited[p->v] = 1;
printf("%d ", p->v);
queue[rear++] = p->v;
}
}
}
}
int main() {
Graph G;
int n, v;
printf("请输入顶点数:");
scanf("%d", &n);
createGraph(&G, n);
// 深度优先遍历
printf("深度优先遍历结果:");
for (v = 0; v < G.n; v++) {
visited[v] = 0;
}
for (v = 0; v < G.n; v++) {
if (!visited[v]) {
DFS(&G, v);
}
}
printf("\n");
// 广度优先遍历
printf("广度优先遍历结果:");
for (v = 0; v < G.n; v++) {
visited[v] = 0;
}
for (v = 0; v < G.n; v++) {
if (!visited[v]) {
BFS(&G, v);
}
}
printf("\n");
return 0;
}
```
以上代码中,`Graph` 结构体表示图,包括邻接表和顶点数;`Node` 结构体表示邻接表中的一个结点,包括邻接点编号和指向下一个邻接点的指针;`visited` 数组记录节点是否已被访问;`createGraph` 函数用于创建图;`DFS` 函数用于深度优先遍历;`BFS` 函数用于广度优先遍历。
在 `main` 函数中,首先创建了一个图 `G`,然后对其进行了深度优先遍历和广度优先遍历。注意,在遍历之前需要将 `visited` 数组初始化为零,以确保每个节点都能被遍历到。遍历的顺序是从顶点0开始依次遍历,如果还有没有被遍历的节点,则从该节点开始继续遍历。
阅读全文