#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXV 100 // 最大顶点数 #define INF 0x3f3f3f // 无穷大 char vertex[MAXV][20]; // 顶点名称 int matrix[MAXV][MAXV]; // 邻接矩阵 int visited[MAXV]; // 标记数组,用于深度遍历 int queue[MAXV]; // 队列,用于广度遍历 int front = 0; // 队首指针 int rear = 0; // 队尾指针 struct Edge { int start; // 起点在vertex数组中的下标 int end; // 终点在vertex数组中的下标 int weight; // 权值 }; void createGraph(int m, int n) { int i,j; // 输入顶点名称 for (i = 0; i < m; i++) { scanf("%s", vertex[i]); } // 初始化邻接矩阵 memset(matrix, INF, sizeof(matrix)); // 输入边的信息 for (i = 0; i < n; i++) { char start[20], end[20]; int weight; scanf("%s %s %d", start, end, &weight); int u = -1, v = -1; for (j = 0; j < m; j++) { if (strcmp(start, vertex[j]) == 0) { u = j; } if (strcmp(end, vertex[j]) == 0) { v = j; } if (u != -1 && v != -1) { break; } } matrix[u][v] = matrix[v][u] = weight; } } void dfs(int u) { int v; visited[u] = 1; printf("%s ", vertex[u]); for (v = 0; v < MAXV; v++) { if (matrix[u][v] != INF && visited[v] == 0) { dfs(v); } } } void bfs(int u, int m) { int v,w; printf("%s ", vertex[u]); visited[u] = 1; queue[rear++] = u; while (front != rear) { v = queue[front++]; for (w = 0; w < m; w++) { if (matrix[v][w] != INF && visited[w] == 0) { printf("%s ", vertex[w]); visited[w] = 1; queue[rear++] = w; } } } } int main() { int m, n,i; scanf("%d %d", &m, &n); createGraph(m, n); memset(visited, 0, sizeof(visited)); char start[20]; scanf("%s", start); int u = -1; for (i = 0; i < m; i++) { if (strcmp(start, vertex[i]) == 0) { u = i; break; } } dfs(u); printf("\n"); memset(visited, 0, sizeof(visited)); front = rear = 0; bfs(u, m); printf("\n"); return 0; }看看这段代码有没有问题,并给出修改后的代码
时间: 2024-01-12 14:04:29 浏览: 93
SeqList.h #include <stdio.h> //包含标准输入输出流的头文件 #include <assert.h
这段代码看起来没有语法错误,但是存在一些潜在的问题:
1. 在邻接矩阵初始化时,使用了INF作为无穷大的值,但是INF的值过大,可能会导致计算时出现溢出的问题。
2. 在dfs和bfs函数中,都使用了MAXV作为循环的终止条件,这样会导致一些无效的循环,浪费计算资源。
3. 在bfs函数中,front和rear的初始值都为0,这样在队列中加入元素时可能会导致队列溢出的问题。
针对上述问题,修改后的代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXV 100 // 最大顶点数
#define INF 0x7fffffff // 无穷大,使用一个较大的值
char vertex[MAXV][20]; // 顶点名称
int matrix[MAXV][MAXV]; // 邻接矩阵
int visited[MAXV]; // 标记数组,用于深度遍历
int queue[MAXV]; // 队列,用于广度遍历
int front = -1; // 队首指针
int rear = -1; // 队尾指针
struct Edge {
int start; // 起点在vertex数组中的下标
int end; // 终点在vertex数组中的下标
int weight; // 权值
};
void createGraph(int m, int n) {
int i,j;
// 输入顶点名称
for (i = 0; i < m; i++) {
scanf("%s", vertex[i]);
}
// 初始化邻接矩阵
memset(matrix, INF, sizeof(matrix));
// 输入边的信息
for (i = 0; i < n; i++) {
char start[20], end[20];
int weight;
scanf("%s %s %d", start, end, &weight);
int u = -1, v = -1;
for (j = 0; j < m; j++) {
if (strcmp(start, vertex[j]) == 0) {
u = j;
}
if (strcmp(end, vertex[j]) == 0) {
v = j;
}
if (u != -1 && v != -1) {
break;
}
}
matrix[u][v] = matrix[v][u] = weight;
}
}
void dfs(int u) {
int v;
visited[u] = 1;
printf("%s ", vertex[u]);
for (v = 0; v < strlen(vertex); v++) { // 修改循环终止条件
if (matrix[u][v] != INF && visited[v] == 0) {
dfs(v);
}
}
}
void bfs(int u, int m) {
int v,w;
printf("%s ", vertex[u]);
visited[u] = 1;
queue[++rear] = u; // 修改队列初始值
while (front != rear) {
v = queue[++front];
for (w = 0; w < m; w++) {
if (matrix[v][w] != INF && visited[w] == 0) {
printf("%s ", vertex[w]);
visited[w] = 1;
queue[++rear] = w;
}
}
}
}
int main() {
int m, n,i;
scanf("%d %d", &m, &n);
createGraph(m, n);
memset(visited, 0, sizeof(visited));
char start[20];
scanf("%s", start);
int u = -1;
for (i = 0; i < m; i++) {
if (strcmp(start, vertex[i]) == 0) {
u = i;
break;
}
}
dfs(u);
printf("\n");
memset(visited, 0, sizeof(visited));
front = rear = -1; // 修改队列初始值
bfs(u, m);
printf("\n");
return 0;
}
```
阅读全文