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
相关产品推荐
相关产品推荐

