链表创建一个新指针以添加值但不起作用
Posted
技术标签:
【中文标题】链表创建一个新指针以添加值但不起作用【英文标题】:Linked List creating a new pointer to add value but not working 【发布时间】:2021-04-20 02:13:05 【问题描述】:void List::add_item(double new_value)
if (list == nullptr)
list = new ValueList;
list->value = new_value;
list->next = nullptr;
else
ValueList* track = list;
while (track != nullptr)
track = track->next;
track = new ValueList;
track->value = new_value;
track->next = nullptr;
size += 1;
使用上面的以下代码,我尝试通过循环遍历链表直到到达链表末尾,然后创建一个动态变量以将该值存储在链表中,从而将新值添加到链表中。
但是我不明白为什么当我输出链表时它不这样做。它只显示列表中的最后一项。这是否意味着track实际上指向list,当我循环通过track = track->next时,list也会改变?这对我来说根本没有意义。
【问题讨论】:
是的,它不起作用,而且很容易理解为什么它不起作用,只需观察一个简单的事实,即在任何地方都没有设置next
指针的代码行原始链表中的最后一个节点指向新节点。你new
下一个值,在else
部分,对吗?但是将最后一个节点的next
指针设置为new
ed 节点的代码在哪里?附:此操作不应超过四五行代码,并且不使用任何if
语句。这只是不必要地使其复杂化。
我认为下一个值已经是跟踪器,所以我直接对下一个本身进行更改。我的想法是,如果 list == nullptr 并且可以对其进行更改,为什么在 track == nullptr 时也不行呢?我还在消化链表的实现
这不是它的工作原理。如果你从左口袋里取出一个苹果,把它放在桌子上,然后用刀切开,你的左口袋里不会有苹果片。如果您将nullptr
复制到变量中,则将此变量设置为其他变量,无论您从何处复制变量也不会变成其他变量。 C++ 不能以这种方式工作。
oohhhh 我明白你的意思了。如果我理解正确,那是因为 track 是一个变量,所以当我将它设置为等于 new VariableList 时,这意味着它会从我设置它跟踪的链表中分离出来。这就是链表没有连接到新值的原因?
@swittuh 您可以大大简化此代码,以获得您最初设想的那种语义。您只需要使用额外级别的指针间接,例如:void List::add_item(double new_value) ValueList** track = &list; while (*track != nullptr) track = &((*track)->next); *track = new ValueListnew_value, nullptr; size += 1;
【参考方案1】:
因为您正在通过最后一个元素。您实际上应该检查下一个元素是否为nullptr
,而不是您所在的元素是否为nullptr
。
while (track != nullptr)
track = track->next;
应该是:
while (track->next != nullptr)
track = track->next;
track->next = new ValueList;
track->next->value = new_value;
track->next->next = nullptr;
【讨论】:
以上是关于链表创建一个新指针以添加值但不起作用的主要内容,如果未能解决你的问题,请参考以下文章