C语言实现双端队列(Deque)调用deque_from_back()后程序直接退出问题排查
问题原因及修复方案
以下是触发程序异常退出的4个核心问题及对应修复方法:
1. 主函数循环逻辑错误
当前main函数的while循环条件写为while(opr_cd != 4),且opr_cd未初始化就参与判断,只要选择操作码4(尾部出队),执行完对应逻辑后就会直接跳出循环,程序自动结束,表现为调用尾部出队功能就立即退出。
修复方案:将循环条件改为while(1)即可,操作码0的分支已经包含return 0主动退出的逻辑。
2. 尾部出队逻辑顺序错误
主函数中操作码4的当前逻辑是先访问rear->data再判断队列是否为空,若队列为空时直接访问空指针会立刻触发崩溃。
修复方案:调整顺序,先判空再访问数据:
// deque data from end else if(opr_cd == 4){ // 先判空再操作 if(front == NULL){ printf("\nQueue is underflow nothing to delete."); continue; } num = rear->data; deque_from_back(&front,&rear); printf("\n%d removed from queue",num); }
3. deque_from_back()未处理单节点边界
当队列只有1个节点时,while(node_to_delete->next != NULL) 循环不会执行,sec_last是未初始化的野指针,后续操作sec_last->next = NULL会直接访问非法内存崩溃。同时删除最后一个节点后没有将front和rear同时置空,会留下野指针隐患。
修复后的deque_from_back()实现:
// function to delete from end void deque_from_back(Queue **front, Queue **last){ // 处理队列仅剩1个节点的场景 if((*front)->next == NULL){ free(*front); *front = NULL; *last = NULL; return; } Queue *sec_last = *front; Queue *node_to_delete = *front; while (node_to_delete->next != NULL){ sec_last = node_to_delete; node_to_delete = node_to_delete->next; } sec_last->next = NULL; *last = sec_last; free(node_to_delete); }
4. 头部出队函数存在野指针隐患
deque_from_front()删除最后一个节点后,仅将front置为NULL,rear仍指向已释放的内存,后续操作尾部时会触发野指针访问。
修复方案:
- 修改函数原型,新增
rear参数:
void deque_from_front(Queue **front, Queue **rear);
- 调整函数实现:
//function to delete data from start void deque_from_front(Queue **front, Queue **rear){ Queue *tem_front = *front; *front = tem_front->next; free(tem_front); // 队列为空时同步置空rear if(*front == NULL){ *rear = NULL; } }
- 主函数中调用该函数的地方补充传参:将
deque_from_front(&front);改为deque_from_front(&front, &rear);
内容的提问来源于stack exchange,提问作者user15375057
相关产品推荐
相关产品推荐

