【问题标题】:C++ Linked list - inserting node function doesn't update values out of function scopeC++ 链表 - 插入节点函数不会更新函数范围之外的值
【发布时间】:2014-02-27 23:07:21
【问题描述】:

我正在编写一个程序,它在包含以下结构的节点的单链表上执行功能:

typedef int ITEM;
typedef struct NODE* NODEptr;

struct NODE
{
    ITEM data;
    NODEptr next;
};

这是我调用的将节点添加到列表头部的函数(hdList 指向列表的头部):

void addToHead(NODEptr &hdList, ITEM input)
{
    NODEptr newNode = new NODE; 
    newNode->data = input;
    newNode->next = nullptr;
    hdList = newNode; 
}

但是我在使用调试器时发现,当程序离开函数时 hdList 的值没有更新,即使它是通过引用传递的,我不知道为什么。

非常感谢您的帮助和建议。

编辑:根据要求,完整代码在这里:http://pastebin.com/bLv0S2QG 我也在用 Visual Studio 2013 编译

【问题讨论】:

  • 看起来您应该将 newNode->next 设置为 hdList 只需确保将 hdList 初始化为 nullptr
  • @ooga 回答这个问题!
  • 为宏保留全部大写有助于避免名称冲突和无意的文本替换,并且也更方便眼睛和耳朵。为了与代码维护者进行良好的沟通,说 T* 比说 typedef T* T_ptr 然后 T_ptr 更短更清晰。
  • Re "hdList is not updated",如果正确则需要完整的代码示例来诊断。请张贴这样的例子。但无论如何,请注意,如果使用公共起始指针作为实际参数调用该函数,则该函数保证一个只有一个节点的列表——这是意图吗?
  • 好的,谢谢,我不知道大写的事情另外,我实际上被教导做 typedefs 以使其更具可读性,但我知道你来自哪里,也许我会改变它

标签: c++ pointers reference linked-list singly-linked-list


【解决方案1】:

正确的函数如下所示

void addToHead(NODEptr &hdList, ITEM input)
{
    NODEptr newNode = new NODE; 
    newNode->data = input;
    newNode->next = hdList;
    hdList = newNode; 
}

或者,如果您的编译器支持 C++ 2011,那么

void addToHead(NODEptr &hdList, ITEM input)
{
    NODEptr newNode = new NODE { input, hdList }; 
    hdList = newNode; 
}

最初hdList 必须由nullptrNULL 初始化。例如

NODEptr hdList = nullptr;

【讨论】:

  • “正确”取决于函数的调用方式:此答案中给出的代码对于 OP 的调用模式可能是错误的。这就是为什么我要求 OP 提供完整的代码示例。例如,可以使用hdlist 引用列表最后一个节点中的next 指针来调用该函数,并且对于OP 的实现,这种调用方式是有意义且正确的。
  • 另请注意,OP 的声明“hdList 未更新”不受更改/修复列表链接的任何影响。因此,对于问题描述或选择此答案作为解决方案,OP 保证是错误的。因此,这将有助于答案中明确陈述的假设,即关于函数调用的假设(并且 OP 的声明是不正确的)。
  • @Cheers 和 hth。 - Alf ""正确" 取决于函数的调用方式:此答案中给出的代码对于 OP 的调用模式可能是错误的。" 该函数是否正确,与 OP 如何调用它无关。只能是函数的无效使用,仅此而已。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多