C++链表冒泡排序bubbleSort()无输出程序终止问题求助
原bubbleSort()函数存在多个致命逻辑错误,触发空指针访问导致程序直接崩溃无输出,具体问题与修复方案如下:
存在的问题
- 空指针访问:初始定义
list* p = NULL,后续未给p赋值就直接执行p->next = r,访问空指针成员触发段错误,程序直接终止。 - 条件判断语法错误:
if(q=first)是赋值操作,表达式永远为真,else分支永远不会执行,逻辑完全失效。 - 缺少边界校验:未处理链表为空、仅含1个节点的场景,此时
r = q->next为NULL,后续访问r的成员会直接崩溃。 - 排序逻辑不完整:冒泡排序需要多轮遍历链表直到无交换发生,原代码仅做了单次相邻节点比较,无法完成整体排序。
- 指针维护逻辑错误:遍历过程中未正确更新三个指针的指向,交换节点后没有调整指针位置,后续遍历逻辑完全混乱。
修复后的bubbleSort()代码
void bubbleSort(){ // 边界处理:空链表或只有1个节点无需排序 if (first == NULL || first->next == NULL) { cout << "\n当前列表无需排序:"; list* iterator = first; while(iterator != NULL) { cout << iterator->data << " "; iterator = iterator->next; } return; } bool swapped; list* sorted_end = NULL; // 标记每轮已排序的末尾边界 do { swapped = false; list* prev = NULL; // 当前节点的前驱指针 list* curr = first; // 当前比较的节点 // 遍历到已排序边界就停止,避免重复比较 while (curr->next != sorted_end) { list* next_node = curr->next; if (curr->data > next_node->data) { // 交换curr和next_node两个节点 curr->next = next_node->next; next_node->next = curr; if (prev == NULL) { // 交换的是头节点,更新全局头指针 first = next_node; } else { prev->next = next_node; } // 交换后next_node成为当前位置节点,更新curr curr = next_node; swapped = true; } // 指针统一后移 prev = curr; curr = curr->next; } sorted_end = curr; // 本轮最后一个节点已完成排序,更新边界 } while (swapped); // 本轮无交换说明整体有序,退出循环 // 输出排序结果 cout << "\n排序后列表: "; list* iterator = first; while(iterator != NULL) { cout << iterator->data << " "; iterator = iterator->next; } }
额外注意
原代码中遍历链表统一使用了do-while,如果链表为空时会直接访问空指针成员,建议统一替换为while判断指针非空后再操作。
内容的提问来源于stack exchange,提问作者Alliyan Waheed
相关产品推荐
相关产品推荐

