c++实现链表的问题

Problem in implementing a linkedlist in c++

我正在学习 C++ 并尝试实现单链表。基本上是一个链表,提供两种简单的方法,插入和显示。下面是代码片段 --

class LinkedList {


public:
    int data;
    LinkedList *next;
    LinkedList() {

    }

    LinkedList(int d) {
        data = d;
        

    }

    void insert(int d) {
        LinkedList temp = *this;
        cout << "Calling insert "<< temp.data;
        while (temp.next != NULL) {
            cout << "Inside the while loop"<< temp.data;
            temp = *temp.next;

        }           
        temp.next = new LinkedList(d);      

        


    }

    void display() {
        LinkedList temp = *this;
        cout << temp.data;          
        

        while (&temp != NULL) {             
            cout << temp.data;    
            temp = *temp.next;
            cout << temp.data;              
        } 
        


    } 




};



int main()
{
    LinkedList head(1);
    head.insert(2);
    head.insert(3);
    head.insert(4);
    head.display();

    return 0;
}

但是,此插入方法未按预期工作。即使在多次调用 insert 之后,它也永远不会进入 while 循环,并且永远不会打印“Inside the while loop”。你能指导我的插入方法有什么问题吗?

您必须改进不止一件事才能保留代码 运行。

  1. 在构造函数中初始化next的值。否则你无法确定下一次创建 LinkedList 时设置为 NULL

    LinkedList(int d) : data(d), next(NULL) {}
    
  2. 使用 LinkedList* 而不是 LinkedList 作为 temp 类型。否则,您将不会修改列表节点,而是修改第一个节点的本地副本。请注意:

    • LinkedList temp = *this; 必须替换为 LinkedList* temp = this;
    • 所有出现的 temp.next 都必须替换为 temp->next
    • 所有出现的 temp.data 都必须替换为 temp->data
    • display 函数中的 while 条件必须替换:&temp != NULL -> temp != NULL
  3. 必须删除 display 函数中 while 循环的第三行,因为 temp 可能指向 NULL

次要的是您没有在输出中换行。请确保在您希望换行的地方添加 << endl

最大的问题是您仍然必须为 LinkedList 实现析构函数以释放分配的资源。根据 rule of three,对于析构函数,您还应该定义复制构造函数和赋值运算符。

另一种方法是使用像std::unique_ptr这样的智能指针来存储下一个节点的地址。

#include <iostream>
#include <memory>

using namespace std;

class LinkedList {
public:
    int data;
    std::unique_ptr<LinkedList> next;

    LinkedList(int d) : data(d) {}

    void insert(int d) {
        LinkedList* temp = this;
        cout << "Calling insert "<< d << std::endl;
        while (temp->next) {
            cout << "Inside the while loop: "<< temp->data << std::endl;
            temp = temp->next.get();

        }           
        temp->next = std::make_unique<LinkedList>(d);      
    }

    void display() {
        LinkedList* temp = this;
        
        while (temp != NULL) {             
            cout << temp->data << std::endl;
            temp = temp->next.get();
        } 
    } 
};

int main()
{
    LinkedList head(1);
    head.insert(2);
    head.insert(3);
    head.insert(4);
    head.display();

    return 0;
}