c++ - 如何以面向对象的形式(OOP)使用 C++ 递归打印链表
问题描述
我只是使用链表创建我的堆栈,但是当我使用递归打印元素时,它在 geany 中以随机代码退出。
#include <iostream>
using namespace std;
class Node
{
public:
int data;
Node* next;
};
class Stack
{
public:
Node* Top;
void stack()
{
Top = NULL;
}
void pop()
{
if(Top == NULL)
{
cout<<"\nstack empty";
}
Top = Top->next;
}
void push(int data)
{
Node* newNode = new Node();
newNode->data = data;
newNode->next = Top;
Top = newNode;
}
bool isEmpty()
{
if(Top == NULL)
{
return true;
}
else
{
return false;
}
}
void print()
{
tem_print(Top);
}
void tem_print(Node* t_top)
{
if(t_top == NULL)
{
return;
}
tem_print(t_top->next);
cout<<t_top->data;
}
};
int main()
{
Stack s;
s.push(1);
s.push(2);
s.print();
return 0;
}
我在其中使用了一个 print() 函数我调用了另一个用于打印元素的临时打印函数,如果我使用迭代方法打印它工作正常
输出: 冻结3秒
并打印这个
(程序退出代码:-1073741819)
按任意键继续 。. .
解决方案
您没有Top
在代码中进行初始化,因此第一次从中读取时,您正在调用未定义的行为 (UB)。带有 UB 的程序的结果可能是任何东西,包括冻结一段时间,或退出并出现错误代码。
这个功能:
void stack()
{
Top = NULL;
}
看起来可疑地像一个构造函数。如果是这样,您需要编写:
Stack()
{
Top = NULL;
}
甚至更好:
Stack() : Top(NULL) {}
Top
事实上,如果你只是在类中声明它时进行初始化,你甚至不需要构造函数。
此外,在您的pop
函数中,next
即使Top
is ,您也正在访问NULL
。相反,您需要一个else
声明:
void pop()
{
if(Top == NULL)
{
cout<<"\nstack empty";
}
else // needed to avoid UB
Top = Top->next;
}
这是一个演示。
此外,您应该避免NULL
在代码中使用:nullptr
改为使用。最后,请避免使用using namespace std;
,这是一个坏习惯。
推荐阅读
- html - 如何定位与同一层次结构中的其他元素共享其类名的元素?
- pyspark - 带有 pyspark 的 Pylint 会引发不正确的警告
- sql - 创建单个查询的问题
- vue.js - 在 main.js 中使用 Moment.js 作为插件
- html - 在 Angular HTML 中动态添加翻转卡片
- javascript - 单击第二个按钮后服务器端的隐藏字段更新
- python - 为什么随机给出错误的输出
- python - 在 sklearn 和 skmultilearn 中以离线模式加载数据集
- reactjs - Reactjs 集中组件
- c++ - 用于 C++ 中普通结构数组的通用 TableView/DataFrame 功能