You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于单链表与两个类的最值查找程序崩溃无输出问题排查

问题分析与修复

你的程序运行后直接关闭无输出,核心原因是链表遍历逻辑错误导致空指针访问(程序崩溃),还有一些细节问题拖垮了流程,我逐个给你拆解并修复:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:37:59