C语言如何从队列中出队最小元素并正确调整front和rear指针
问题解决
现有代码待修正点
- 函数声明不匹配:头部声明的
void deQueue();和实现的int返回值冲突,需修改为int deQueue(); - 依赖头文件缺失:调用
exit()函数需要引入<stdlib.h>头文件,否则编译会报错 - 最小元素检索逻辑缺陷:
min初始值应设为front而非0,否则会检索到队列有效范围外的无效数据- 循环遍历范围需覆盖到
rear位置,原条件i < rear会漏掉队尾元素,应改为i <= rear
删除最小元素后的指针处理逻辑
找到最小元素的索引min后,按以下步骤操作即可:
- 把
min + 1到rear区间的所有元素依次向前移动一位,覆盖掉min位置的元素,完成删除操作 - 队尾指针
rear自减1,对应队列元素总数减1 - 空队列判断:如果更新后
rear < front,说明队列已无有效元素,将front和rear都重置为初始值-1
修正后的deQueue函数代码
int deQueue() { if (front == -1) exit(1); else { // 修正最小元素检索逻辑 int min = front; for(int i = front; i <= rear; i++){ if(items[min] > items[i]) min = i; } int value = items[min]; // 移动元素覆盖待删除位置 for(int i = min; i < rear; i++){ items[i] = items[i + 1]; } // 更新队尾指针 rear--; // 空队列重置 if(rear < front){ front = -1; rear = -1; } return value; } }
按你的测试用例执行后,输出结果为Deleted value is 1,符合预期,剩下的队列元素为3、5、4、2。
内容的提问来源于stack exchange,提问作者KVL
相关产品推荐
相关产品推荐

