链表 C++ insertback

Linked list c++ insertback

我对数据结构真的很陌生。我想弄清楚为什么我的 insertback() 函数不起作用。第一个打印 3,2,1 但第二个不打印任何东西。我认为这与 head 有关,但我不太确定。请帮忙。

#include <iostream>
using namespace std;

struct Node
{
    int data;
    Node* next;
};

class lst
{
public:
    void Insertfron(int x);
    void Print();
    void Insertback(int x);
private:
    Node* head;
};

void lst::Insertfron(int x)
{
    Node* temp = new Node;
    temp->data = x;
    temp->next = head;
    head = temp;
}

void lst::Print()
{
    Node* temp = head;
    while(temp->next!=NULL)
    {
        cout<<temp->data<<' ';
        temp=temp->next;
    }
    cout<< endl;
}

void lst::Insertback(int x)
{
    Node* backinst = new Node;
    backinst->data = x;
    backinst->next = NULL;
    Node* temp = head;
    while(temp->next!=NULL)
    {
        temp = temp->next;
    }
    temp->next = backinst;
}

int main()
{
    lst listt;
    listt.Insertfron(1);
    listt.Insertfron(2);
    listt.Insertfron(3);
    listt.Print();
    listt.Insertback(4);
    listt.Print();
    return 0;
}

您没有将 head 初始化为 NULL 以指示空列表,因此 ``head` 将具有随机垃圾值,因此您的所有方法都显示 未定义的行为.

修复后,您在 Print()Insertback() 中的 while 循环都是错误的,因为它们没有考虑到 headNULL当列表为空时。

此外,您正在泄露您创建的每个节点。使用完列表后,您需要添加一个析构函数来释放节点。

话虽如此,请尝试更类似的方法:

#include <iostream>
using namespace std;

struct Node
{
    int data;
    Node* next;
};

class lst
{
public:
    lst();
    ~lst();
    void Insertfron(int x);
    void Print();
    void Insertback(int x);
private:
    Node* head;
};

lst::lst()
    : head(NULL)
{
}

lst::~lst()
{
    while (head != NULL)
    {
        Node *next = head->next;
        delete head;
        head = next;
    }
}

void lst::Insertfron(int x)
{
    Node* temp = new Node;
    temp->data = x;
    temp->next = head;
    head = temp;
}

void lst::Print()
{
    Node* temp = head;
    while (temp != NULL)
    {
        cout << temp->data << ' ';
        temp = temp->next;
    }
    cout << endl;
}

void lst::Insertback(int x)
{
    Node* backinst = new Node;
    backinst->data = x;
    backinst->next = NULL;
    if (head == NULL)
    {
        head = backinst;
    }
    else
    {
        Node* temp = head;
        while (temp->next != NULL)
        {
            temp = temp->next;
        }
        temp->next = backinst;
    }
}

int main()
{
    lst listt;
    listt.Insertfron(1);
    listt.Insertfron(2);
    listt.Insertfron(3);
    listt.Print();
    listt.Insertback(4);
    listt.Print();
    return 0;
}

也就是说,Insertback() 可以通过使用额外的指针间接级别来简化以避免额外的 if

void lst::Insertback(int x)
{
    Node **temp = &head;
    while (*temp != NULL)
    {
        temp = &((*temp)->next);
    }
    Node* backinst = new Node;
    backinst->data = x;
    backinst->next = NULL;
    *temp = backinst;
}