C++链表实现冒泡排序时最后一个节点未参与排序问题求解
问题原因及修复方案
错误分析
代码核心问题出在BubleSort函数的内层循环终止条件:
- 内层循环当前写的是
for (j = i->next; j->next != NULL; j = j->next),当j指向最后一个节点时,j->next为NULL,循环直接终止,最后一个节点永远不会进入比较逻辑,所以不会参与排序,一直留在链表尾部。 - 额外说明:你当前的排序逻辑本质是选择排序(固定位置i,和后续所有节点比较,把最小值放到i位置),不是标准冒泡排序(相邻节点两两比较交换,大值向后冒泡),但逻辑本身是成立的,只需要修正循环条件即可正常运行。
修复方法
把内层循环的终止条件从j->next != NULL改为j != NULL,让j可以遍历到链表的最后一个节点,参与比较交换。
修改后的排序函数代码
void BubleSort(Node *&head){ struct Node *i ,*j; int num; for (i = head; i->next != NULL;i=i->next){ // 终止条件改为j != NULL,遍历到最后一个节点 for (j = i->next; j != NULL; j = j->next){ if (i->data > j->data){ num = j->data; j->data = i->data; i->data = num; } } } }
验证结果
用你给出的输入示例测试,修改后输出为:
1-> 3-> 4-> 6-> 7-> 9->
符合升序排序要求。
内容的提问来源于stack exchange,提问作者edw
相关产品推荐
相关产品推荐

