我正在开发一个实现队列的 C 程序,并且遇到了无限循环的问题。
程序应该对队列执行插入、遍历和删除操作。
但是,我观察到程序在某些条件下会进入无限循环。
#include <stdio.h>
#define N 10
int queue[N];
int front = -1;
int rear = -1;
void insert();
void traverse();
void delete();
int main() {
insert();
traverse();
delete();
return 0;
}
void insert() {
int item;
if ((rear + 1) % N == front) {
printf("overflow");
} else if (front == -1 && rear == -1) {
scanf("%d", &item);
rear, front = 0;
queue[rear] = item;
} else {
scanf("%d", &item);
rear = (rear + 1) % N;
queue[rear] = item;
}
}
void delete() {
int item;
if (rear == -1 && front == -1) {
printf("underflow");
} else if (rear == front) {
rear, front = -1;
} else {
item = queue[front];
front = (front + 1) % N;
}
}
void traverse() {
int i = front;
if (front == -1 && rear == -1) {
printf("underflow");
} else {
while (i != rear) {
printf("%d", queue[i]);
i = (i + 1) % N;
}
printf("%d", queue[i]);
}
}
我试图在队列中输入一个数字,但它没有显示该数字,而是进入了无限循环。
我正在使用 VS Code。
无限循环是因为
rear
仅永久设置为-1。问题在于 insert()
函数中的这行 C 代码,当将元素插入空队列时,该行应该将 rear
和 front
设置为 0:
rear, front = 0;
上面的说法可能并不像你想象的那样有效。只有
front
会被设置为 0。我在 Linux 上使用过 gcc
编译器,这样的语句不会将 0 赋给 rear
。我不确定你的 VS Code 编译器对这样的语句做了什么。您可以在 VS Code 中的空队列条件下插入元素期间尝试 printf
rear
的值,并查看执行代码时 rear
是否发生变化。
将
insert()
函数中的代码更改为:
rear = front = 0;
上面的内容应该可以消除您所看到的无限循环。
为了更清楚地了解,您可能想查看之前关于同一问题的问答: 如何使用 C++ 在一行中声明和定义多个变量?