可以以一种更简洁的方式写吗
时间: 2024-01-21 20:04:48 浏览: 16
当然可以,以下是更简洁的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct ArcNode {
int adjvex;
struct ArcNode *next;
} ArcNode;
typedef struct VNode {
int data;
ArcNode *firstarc;
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices;
int vexnum, arcnum;
} ALGraph;
void InitGraph(ALGraph *G) {
G->vexnum = G->arcnum = 0;
for (int i = 0; i < MAX_VERTEX_NUM; i++) {
G->vertices[i].data = 0;
G->vertices[i].firstarc = NULL;
}
}
void AddArc(ALGraph *G, int v, int w) {
ArcNode *p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = w;
p->next = G->vertices[v].firstarc;
G->vertices[v].firstarc = p;
}
void DFS(ALGraph *G, int v, int visited[]) {
visited[v] = 1;
printf("%d ", G->vertices[v].data);
for (ArcNode *p = G->vertices[v].firstarc; p; p = p->next) {
if (!visited[p->adjvex]) {
DFS(G, p->adjvex, visited);
}
}
}
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 k = queue[front++];
for (ArcNode *p = G->vertices[k].firstarc; p; p = p->next) {
if (!visited[p->adjvex]) {
visited[p->adjvex] = 1;
printf("%d ", G->vertices[p->adjvex].data);
queue[rear++] = p->adjvex;
}
}
}
}
int main() {
ALGraph G;
InitGraph(&G);
printf("请输入连通图的顶点数和边数:\n");
scanf("%d%d", &G.vexnum, &G.arcnum);
printf("请输入连通图的顶点:\n");
for (int i = 0; i < G.vexnum; i++) {
scanf("%d", &G.vertices[i].data);
}
printf("请输入连通图的边(以v w的方式输入):\n");
for (int i = 0, v, w; i < G.arcnum; i++) {
scanf("%d%d", &v, &w);
AddArc(&G, v, w);
AddArc(&G, w, v); // 无向图需要添加反向边
}
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;
}
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
BFS(&G, i, visited);
}
}
printf("\n");
return 0;
}
```
这份代码与之前的代码几乎一样,只是将一些变量的声明和初始化放在了同一行,使得代码更加简洁。