C ++中的简单链接列表实现

时间:2011-06-17 10:08:52

标签: c++ class pointers linked-list

我正在尝试使用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';
}

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

在你的情况下,持有3的节点最后被保存81的节点覆盖。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

void node::append(int d) {
    node *nw = new node(d);
    node *last = this;

    while((*last).next!=NULL) 
        last = (*last).next;

    (*last).next = nw;
}

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

答案 4 :(得分:0)

使用

node *nw=new node(d);

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

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

我的评论被封锁所以我写这是答案 很抱歉给您带来不便