You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向循环队列插入数据时触发无限循环问题求助

循环队列插入无限循环问题的解决

核心问题根源

代码中错误使用逗号表达式,导致队列的rear指针未被正确初始化/修改,进而引发遍历阶段的无限循环。

具体错误与修正

  1. 插入函数的初始化错误
    在insert函数的空队列初始化分支中,rear, front = 0;是错误写法。C语言中逗号运算符优先级最低,这行仅会将front设为0,rear仍保持初始值-1。插入第一个元素后,front=0而rear=-1,遍历函数中while(i != rear)的条件永远成立(i从0循环,永远无法等于-1),触发无限循环。
    修正为:

    rear = 0;
    front = 0;
    
  2. 删除函数的清空错误
    delete函数中rear, front = -1;存在同样问题,仅会修改front,rear值不变,后续操作会导致队列状态混乱。
    修正为:

    rear = -1;
    front = -1;
    

修正后的完整代码

#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 = 0;
        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 = -1;
        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]);
    }
}

额外优化建议

  • 遍历输出时添加空格分隔数值,提升可读性(已在修正代码中补充)。
  • 可在main函数中添加菜单逻辑,支持多次执行插入、遍历、删除操作,方便测试队列完整功能。

内容的提问来源于stack exchange,提问作者Partha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:16:23