向循环队列中插入数字会导致无限循环

问题描述 投票:0回答:1

我正在开发一个实现队列的 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。

c queue infinite-loop circular-queue
1个回答
2
投票

无限循环是因为

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++ 在一行中声明和定义多个变量?

© www.soinside.com 2019 - 2024. All rights reserved.