我之前从未使用过智能指针,因此我决定尝试实现一个基本的小链表,只是为了看看它是如何工作的。下面的程序只输出列表的第一个元素,即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;
}
答案 0 :(得分: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);