【问题标题】:A simple Linked List implementation in C++一个简单的 C++ 链表实现
【发布时间】:2011-09-17 01:48:28
【问题描述】:

我正在尝试使用 c++ 实现一个简单的链表。我可能在某个地方犯了一个愚蠢的错误。通过这个我想学习 C++ 中的类和指针。 对于代码

#include <iostream>
using namespace std;

class node
{
public: 
    node* next;
    int data;

    node(int d);
    void append(int d);
}; 

node::node(int d)
{
    data = d;
    next = NULL;
}


void node::append(int d)
{
    node nw = node(d);
    if(next==NULL)
        next = &nw;
    else
    {
        node *n = next;
        while((*n).next!=NULL)
        {
            n = (*n).next;
        }
        (*n).next = &nw;
    }
}

我得到 81 作为 1 旁边的节点。

int main()
{
    node n = node(1);
    n.append(3);
    n.append(2);
    n.append(81);
    n = *(n.next);
    cout<< n.data << '\n';
}

请帮我弄清楚我在哪里犯了错误。

【问题讨论】:

    标签: c++ class pointers linked-list


    【解决方案1】:

    通过使用

    node *nw=new node(d);
    

    每次都指向相同的位置,这会导致数据被覆盖。 所以即使使用 new ,输出也是 81

    找到一种方法来创建一个指向不同内存地址的新节点

    我的 cmets 被阻止了,所以我写了这是答案 给您带来的不便敬请谅解

    【讨论】:

      【解决方案2】:

      我是否还建议您将 LinkedList 类与 Node 类分开?然后,您可以将 append() 方法移至该类并让它管理您的节点。

      【讨论】:

        【解决方案3】:
        void node::append(int d) {
            node *nw = new node(d);
            node *last = this;
        
            while((*last).next!=NULL) 
                last = (*last).next;
        
            (*last).next = nw;
        }
        

        是的,如果您的对象打算在函数完成后保留,您应该在堆上创建它们(new 关键字),而不是在堆栈上。

        【讨论】:

        • 我不得不使用 node * nw = (node*) operator new (sizeof(node));新(nw)节点(d);
        • @Nitin 这很奇怪。你用什么编译器?
        【解决方案4】:

        您的错误是您在堆栈上创建了一个对象,然后存储了一个指向它的指针。堆栈被覆盖,您的对象被覆盖,您的指针无效。

        在您的情况下,拥有 3 的节点最终被拥有 81 的节点覆盖。

        【讨论】:

          【解决方案5】:

          可能还有其他错误,但这非常危险:您正在创建一个局部变量来表示新节点:node nw = node(d);,然后您使列表中的最后一个节点指向nw。然而,由于nw 是一个局部变量,当函数返回时它将不复存在。所以最后一个节点的next 指针现在指向不再存在的东西。您需要使用new node(d)(它返回一个指向node 的指针)来创建一个在函数返回后将继续存在的对象。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-28
            • 2019-05-17
            • 1970-01-01
            • 2015-08-18
            • 2013-12-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多