2

所以我试图在 C++ 中实现磨链表的运行

template<class T>
class Node
{
private:
    Node *next;
    T item;

public:
    Node(T item)
        : item(item)
    {
        this->next = NULL;
    }

    Node<T> add(T item) {
         this->next = new Node(item);
         return *this->next;
    }

    bool hasNext()
    {
        return this->next == NULL;
    }

    Node<T> getNext()
    {
        return *this->next;
    }

    T value()
    {
        return this->item;
    }
};

void main()
{
    Node<int> node(3);
    node.add(3).add(4);

    cout << node.value();
    cout << node.getNext().value();
    cout << node.getNext().getNext().value();

    cin.get();
}

但我无法让它工作。特别是本节:

    node.add(3).add(4);

    cout << node.value();
    cout << node.getNext().value();
    cout << node.getNext().getNext().value();

如果我将我的addandgetNext函数更改为 returnNode<T>*而不是Node<T>,它可以正常工作。但是为什么取消引用会导致代码中断?我认为.符号比 更有意义->,但我无法让它工作。我究竟做错了什么?

4

1 回答 1

7

现在,您正在制作您添加的节点的副本,而不是返回您创建的实际节点。括号只是为以后必须查看您的代码的其他人增加了一点清晰度。add 函数需要像这样更改:

Node<T>& add(T item) {
     this->next = new Node(item);
     return *(this->next);
}

或者您可以返回一个指向新创建节点的指针,但这会中断使用.而不是->main。

也需要进行类似的更改next()

于 2013-05-09T15:55:44.427 回答