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

C语言实现循环队列时元素显示异常、出队后输出混乱问题排查

问题原因
  • 核心错误:enQueue函数的第三个条件判断误将相等运算符==写为赋值运算符=,且由于&&优先级高于=,每次判断都会先修改rear的值,导致插入的中间元素全部被覆盖到同一个数组位置,是首次打印仅显示首尾元素的直接原因。
  • 次要错误1:printQueue判断队列为空后没有return,空队列仍会执行后续打印逻辑,可能输出非法内存值。
  • 次要错误2:printQueue中当rear < front时,遍历低地址段的循环终止条件为i < queue->rear,会漏掉rear下标对应的有效元素。
修正后代码
#include<stdio.h>
#include<stdlib.h>

struct Queue{
    int rear, front;
    unsigned capacity;
    int *arr;
};

struct Queue* createQueue(unsigned capacity)
{
    struct Queue* queue = (struct Queue*)malloc(sizeof(struct Queue));
    queue->front = queue->rear = -1;
    queue->capacity = capacity;
    queue->arr = (int*)malloc(sizeof(int)*capacity);
    return queue;
}

struct Queue* enQueue(struct Queue* queue, int data)
{
    if(queue->front == 0 && queue->rear == queue->capacity -1)
    {
        printf("Queue is full.");
    }
    else if(queue->front == -1)
    {
        queue->front = queue->rear = 0;
        queue->arr[queue->rear] = data;
    }
    // 修正:将赋值改为相等判断
    else if(queue->rear == queue->capacity -1 && queue->front != 0)
    {
        queue->rear = 0;
        queue->arr[queue->rear] = data;
    }
    else
    {
        queue->rear++;
        queue->arr[queue->rear] = data;
    }
    return queue;
}

struct Queue* deQueue(struct Queue* queue)
{
    if(queue->front == -1)
    {
        printf("Error: Queue underflow.");
    }
    else if(queue->front == queue->rear)
    {
        queue->front = queue->rear = -1;
    }
    else
    {
        if(queue->front == queue->capacity -1)
        {
            queue->front = 0;
        }
        else
        {
            queue->front++;
        }
    }
    return queue;
}

void printQueue(struct Queue* queue)
{
    if(queue->front == -1)
    {
        printf("Queue is empty.");
        // 修正:空队列直接返回,不执行后续打印逻辑
        return;
    }

    if(queue->rear >= queue->front )
    {
        for(int i = queue->front; i <= queue->rear; i++)
        {
            printf("%d ", queue->arr[i]);
        }
    }
    else
    {
        for(int i = queue->front; i< queue->capacity; i++)
        {
            printf("%d ", queue->arr[i]);
        }
        // 修正:循环终止条件改为<=,不遗漏rear位置元素
        for (int i = 0; i <= queue->rear; i++)
        {
            printf("%d ", queue->arr[i]);
        }    
    }
}

int main(){
    int num, data;
    printf("Enter the size of your queue:");
    scanf("%d", &num);
    struct Queue* queue = createQueue(num);

    printf("Start filling the queue:\n");
    for (int i = 0; i < num; i++)
    {
        printf("\nEnter the element:");
        scanf("%d", &data);
        enQueue(queue, data);
    }

    printQueue(queue);

    deQueue(queue);
    printf("\nAfter deleting one element:\n");
    printQueue(queue);

    printf("\nEnter one element:");
    scanf("%d", &data);
    enQueue(queue, data);

    printf("\nThe final queue is:\n");
    printQueue(queue);

    return 0;
}
运行效果(使用你提供的测试输入)
Enter the size of your queue:5
Start filling the queue:

Enter the element:1     

Enter the element:2

Enter the element:3

Enter the element:4

Enter the element:5
1 2 3 4 5 
After deleting one element:
2 3 4 5 
Enter one element:4                 
The final queue is:
2 3 4 5 4 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:15:00