首页 > 解决方案 > 如何以面向对象的形式(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)

按任意键继续 。. .

标签: c++

解决方案


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

这个功能:

void stack()
    {
        Top = NULL;
    }

看起来可疑地像一个构造函数。如果是这样,您需要编写:

Stack()
    {
        Top = NULL;
    }

甚至更好:

Stack() : Top(NULL) {}

Top事实上,如果你只是在类中声明它时进行初始化,你甚至不需要构造函数。


此外,在您的pop函数中,next即使Topis ,您也正在访问NULL。相反,您需要一个else声明:

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

这是一个演示


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


推荐阅读