gpt4 book ai didi

c++ - 如何使用C++递归以面向对象形式(OOP)打印链接列表

转载 作者:行者123 更新时间:2023-12-02 09:52:32 25 4
gpt4 key购买 nike

我只是使用链表创建堆栈,但是当我使用递归打印元素时,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函数中,即使 nextTop,您也正在访问 NULL。相反,您需要一个 else语句:
void pop()
{
if(Top == NULL)
{
cout<<"\nstack empty";
}
else // needed to avoid UB
Top = Top->next;
}
这是 demo

另外,您应该避免在代码中使用 NULL:改为使用 nullptr。最后,请避免使用 using namespace std;,这是一个坏习惯。

关于c++ - 如何使用C++递归以面向对象形式(OOP)打印链接列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63317148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com