如何在面向对象的形式(OOP)中用C++递归打印链表

如何在面向对象的形式(OOP)中用C++递归打印链表,c++,C++,我只是使用链表在堆栈上创建,但当我使用递归打印元素时,它会在geany中以随机代码退出 #include <iostream> using namespace std; class Node { public: int data; Node* next; }; class Stack { public: Node* Top; void stack() { Top = NULL; } void po

我只是使用链表在堆栈上创建,但当我使用递归打印元素时,它会在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;
}
我在里面使用了一个打印函数,我调用了另一个临时打印函数,它用于打印元素,如果我使用迭代方法打印,效果会很好

输出: 冻结3sec

然后打印这个

程序已退出,代码为:-1073741819

按任意键继续

您没有在代码中初始化Top,因此第一次从中读取时,您正在调用未定义的行为。带有UB的程序的结果可能是任何情况,包括冻结一段时间,或带错误代码退出

此功能:

void stack()
    {
        Top = NULL;
    }
看起来很像构造器。如果是这样,您需要写:

Stack()
    {
        Top = NULL;
    }
或者更好:

Stack() : Top(NULL) {}
事实上,如果在类中声明Top时只初始化它,甚至不需要构造函数

此外,在pop函数中,即使Top为NULL,也可以访问next。相反,您需要一个else语句:

void pop()
    {
        if(Top == NULL)
        {
            cout<<"\nstack empty";
        }
        else   // needed to avoid UB
            Top = Top->next;
    }
这是一个例子

此外,您应该避免在代码中使用NULL:改用nullptr。最后,请避免使用命名空间std;,这是一个坏习惯。

您没有在代码中初始化Top,因此第一次从中读取时,您正在调用未定义的行为。带有UB的程序的结果可能是任何情况,包括冻结一段时间,或带错误代码退出

此功能:

void stack()
    {
        Top = NULL;
    }
看起来很像构造器。如果是这样,您需要写:

Stack()
    {
        Top = NULL;
    }
或者更好:

Stack() : Top(NULL) {}
事实上,如果在类中声明Top时只初始化它,甚至不需要构造函数

此外,在pop函数中,即使Top为NULL,也可以访问next。相反,您需要一个else语句:

void pop()
    {
        if(Top == NULL)
        {
            cout<<"\nstack empty";
        }
        else   // needed to avoid UB
            Top = Top->next;
    }
这是一个例子


此外,您应该避免在代码中使用NULL:改用nullptr。最后,请避免使用命名空间std;,这是一个坏习惯。

您的弹出函数执行Top=Top->next;即使Top==NULL。

您的pop函数执行Top=Top->next;即使Top==NULL。

请共享输出您的代码中没有任何部分会初始化下一个设置为NULL的节点,因此您的条件永远不会是真的。我还相当确定,您的意思是void stack是构造函数堆栈,而不是headin push function i initialized newNode->next=Top,其中Top为null,因此在添加新节点时,我们会自动将最后一个节点设置为null。在您的代码中,Top从不为null,因为您从未将其设置为soPlease share输出您的代码中没有任何部分会初始化下一个设置为null的节点,所以你的条件永远不可能是真的我也很确定你的意思是void stack是构造函数堆栈,而不是headin push函数我初始化了newNode->next=Top,其中Top为null,所以在添加新节点时,我们会在代码中自动将最后一个节点设置为null,因为您从未将其设置为null,所以将添加return语句。所以它不会执行该行。感谢您的帮助并利用您的时间进行检查:数据将添加return语句。所以它不会执行该行。感谢您的帮助并利用您的时间进行检查:DWY您为什么删除了所有评论..:据我回忆,DI没有删除这些评论:我不记得这些评论是关于什么的,但是如果它们与帖子无关,它们就会被删除。你为什么要删除所有评论据我回忆,DI没有删除这些评论:我不记得这些评论是关于什么的,但如果它们与帖子无关,就会被删除。