递归实现循环队列入队无输出问题排查(BST遍历练习)
问题分析与修正
你的代码存在三个关键问题,导致无法正确输出队列内容:
- 缺少
is_empty函数实现:queue_print中调用了is_empty判断队列是否为空,但代码未定义该函数。编译器会将其视为未声明函数,可能返回错误值,进而跳过打印逻辑。 queue_print循环条件错误:原代码中while (i == q->rear)逻辑完全颠倒,正确的循环终止条件是当i等于rear时停止,因此循环条件应为while (i != q->rear)。- 递归入队包含多余元素:当前
q_factorial_enqueue会将0也入队,若仅需5到1的序列,需调整递归触发条件。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #define MAX_QUEUE_SIZE 10 // 补充定义队列最大容量 typedef int element; typedef struct { element data[MAX_QUEUE_SIZE]; int front, rear; } QueueType; // 补充错误处理函数 void error(const char* msg) { fprintf(stderr, "%s\n", msg); exit(1); } void init_queue(QueueType* q) { q->front = q->rear = 0; } // 补充队列空判断函数 int is_empty(QueueType* q) { return q->front == q->rear; } int is_full(QueueType* q) { return ((q->rear + 1) % MAX_QUEUE_SIZE == q->front); } void enqueue(QueueType* q, element item) { if (is_full(q)) error("Queue is full"); q->rear = (q->rear + 1) % MAX_QUEUE_SIZE; q->data[q->rear] = item; } void q_factorial_enqueue(QueueType* q, int data) { enqueue(q, data); if (data > 1) { // 调整递归条件,避免入队0 q_factorial_enqueue(q, data - 1); } } void queue_print(QueueType* q) { printf("QUEUE(front=%d rear=%d) = ", q->front, q->rear); if (!is_empty(q)) { int i = q->front; do { i = (i + 1) % MAX_QUEUE_SIZE; printf("%d | ", q->data[i]); } while (i != q->rear); // 修正循环条件 } printf("\n"); } int main(void) { QueueType queue; int element; init_queue(&queue); //Initialization q_factorial_enqueue(&queue, 5); queue_print(&queue); }
说明
- 补充
is_empty函数,实现队列空的判断逻辑:当front等于rear时队列为空。 - 修正
queue_print的循环条件,确保遍历所有队列元素。 - 调整递归入队的条件,仅在
data > 1时继续递归,避免将0加入队列。 - 补充
error函数实现与MAX_QUEUE_SIZE定义,完善代码完整性。
内容的提问来源于stack exchange,提问作者bFur4list
相关产品推荐
相关产品推荐

