链表创建一个新指针以添加值但不起作用

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 指针设置为newed 节点的代码在哪里?附:此操作不应超过四五行代码,并且不使用任何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;

【讨论】:

以上是关于链表创建一个新指针以添加值但不起作用的主要内容,如果未能解决你的问题,请参考以下文章

jquery textarea 设置值但 \n 不起作用

MySQL数据库导入成功但不起作用

通知代码添加到服务中但不起作用

从控制器设置 ng-show 值但我的代码不起作用

创建新的 Rails 操作不起作用?

调整 UIScrollView 的大小以适应其内容……不起作用