基于单链表与两个类的最值查找程序崩溃无输出问题排查
问题分析与修复
你的程序运行后直接关闭无输出,核心原因是链表遍历逻辑错误导致空指针访问(程序崩溃),还有一些细节问题拖垮了流程,我逐个给你拆解并修复:
1. 链表遍历的致命逻辑错误
在Min和Max类的构造函数里,你写了这样的遍历代码:
while(Counter != nullptr) { if(Counter->Number < Result->Number) Result = Counter; Result = Result->Point; // 这行位置完全错误! }
这行代码的问题在于:
- 不管有没有找到更小/更大的节点,你都会立刻移动
Result指针,导致遍历流程彻底混乱,很快Result就会变成nullptr,后续访问Result->Number直接触发空指针异常,程序崩溃退出,自然看不到任何输出。 - 正确逻辑应该是:用
Counter指针遍历整个链表,Result只在找到更小/更大值时更新,全程只移动Counter。
2. 遍历初始指针的遗漏问题
你初始化Counter = Result->Point,这会直接跳过链表的第一个节点(Result初始指向链表头End),导致第一个节点的值永远不会参与比较,可能漏掉真正的最小/最大值。
修复后的完整代码
我把所有问题都修正了,还优化了几个体验细节:
#include<iostream> using namespace std; struct Node { double Number; struct Node *Point; } *End = nullptr; typedef struct Node node; namespace Min_Max { class Min { node *Result = End; public: Min() { if(Result == nullptr) { cout << "You didn't enter anything!\a"; system("pause"); exit(EXIT_FAILURE); } // 从链表头开始遍历所有节点 node *Counter = Result; while(Counter != nullptr) { if(Counter->Number < Result->Number) Result = Counter; // 只移动Counter指针完成遍历,Result保留当前最小节点 Counter = Counter->Point; } } node* Show() { return Result; } }; class Max { private: node *Result = End; public: Max() { if(Result == nullptr) { cout << "You didn't enter anything!\a"; system("pause"); exit(EXIT_FAILURE); } node *Counter = Result; while(Counter != nullptr) { if(Counter->Number > Result->Number) Result = Counter; Counter = Counter->Point; } } node* Show() { return Result; } }; }; int main() { node *linker = nullptr; register short int Counter = 1; while(1) { linker = new node; if(linker == nullptr) { cout << "An error occurred during allocating memory." << endl << endl; system("pause"); return 0; } cout << "Number " << Counter << ": Enter your number: "; cin >> linker->Number; // 先判断是否输入0,再清屏,避免用户刚输入0就看不到反馈 if(linker->Number == 0) { delete linker; break; } system("cls"); linker->Point = End; End = linker; Counter++; } // 提前判断链表是否为空,避免重复逻辑 if(End == nullptr) { cout << "You didn't enter anything!\a"; system("pause"); return 0; } Min_Max::Min Min; Min_Max::Max Max; cout << "The smallest number is " << (Min.Show())->Number << endl; cout << "The largest number is " << (Max.Show())->Number << endl; system("pause"); // 新增:防止程序输出后直接关闭,方便查看结果 return 0; }
额外优化说明
- 在
main末尾加了system("pause"),确保输出结果能被看到,不会一闪而过。 - 调整了清屏时机:原来输入0后先清屏再退出,导致用户看不到任何终止提示,现在先判断输入再处理清屏。
- 提前判断链表是否为空,避免创建
Min/Max对象时的重复检查。
现在运行程序,输入若干数字(最后输入0结束),就能正常输出最小和最大值了!
内容的提问来源于stack exchange,提问作者Amir Mohsen Ghasemi
相关产品推荐
相关产品推荐

