2

我以前从未使用过智能指针,所以我决定尝试实现一个基本的小链表,看看它是如何工作的。下面的程序只输出列表的第一个元素,即5,然后退出。

print()函数中,while循环只迭代一次,这意味着列表只包含一个元素,即使它应该包含 3。

这是代码:

#include <iostream>
#include <memory>

class list {
private:
    struct node {
        int val;
        std::shared_ptr<node> next;
        node(int _val) : val(_val), next(nullptr) {}
    };
    std::shared_ptr<node> head;

public:
    list() {
        head = nullptr;
    }

    void push_back(int val) {
        std::unique_ptr<node> new_node(new node(val));
        if(head == nullptr) {
            head = std::move(new_node);
        } else {
            std::shared_ptr<node> curr(head);
            while(curr != nullptr) {
                curr = curr->next;
            }
            curr = std::move(new_node);
        }
    }

    void print() {
        std::shared_ptr<node> curr(head);
        while(curr != nullptr) {
            std::cout << curr->val << " ";
            curr = curr->next;
        }
        std::cout << std::endl;
    }
};

int main() {
    std::unique_ptr<list> lst(new list());

    lst->push_back(5);
    lst->push_back(10);
    lst->print();

    return 0;
}
4

1 回答 1

3

您没有正确地将节点附加到末尾。这部分代码:

while(curr != nullptr) {
    curr = curr->next;
}
curr = std::move(new_node);

应该改为:

while(curr->next != nullptr) {
    curr = curr->next;
}
curr->next = std::move(new_node);
于 2013-10-09T16:02:47.797 回答