将头连接到链表中的其他节点



>我已经为链表创建了这个结构。

struct Node
{
string name;
int id;
double price;
struct Node * next;
};
private:
struct Node* head;  
...

我试图在列表的头部获取"下一步"以指向我正在创建和插入的第一个节点,但我似乎只是将头节点设置为第一个节点。为什么我不能填写头部的"下一个"部分?

我试过了

if (head == NULL)               
{
head->next = newNode;             
}

结果为"线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x28(">

if (head == NULL)               
{
head = newNode;             
}

这使得头部成为新节点, 以及其他一些解决方案,但似乎都没有奏效。

有人有什么建议吗?

这段代码肯定是错误的,因为它试图取消引用 NULL 指针——这是调用未定义行为和(可能(崩溃的经典方法,如您所见:

if (head == NULL)               
{
head->next = newNode;             
}

如果您的列表当前为空(如果head为 NULL,则应该如此(,则您的第二次尝试(如下(是正确的:

if (head == NULL)
{
head = newNode;             
}

需要注意的一个潜在问题是确保在上述情况下也设置了newNode->next = NULL,因为在只有一个项目的列表中,它没有指向的后续Node,但是如果您将其next指针保持未初始化状态,您将在稍后尝试取消引用该未初始化指针时调用未定义的行为(并且可能会崩溃(。

OTOH 如果链表中有"其他节点",您尝试将新的头节点附加到其中,那么head应该已经是非 NULL(它应该指向当前列表中的第一项(,因此您需要设置newNode->next = head;以便您的新节点指向列表的前一个头, 然后设置head = newNode;,因为您希望新节点成为列表的头部。

如果你在纸上画出一些简单的例子(使用圆圈表示Nodes,用箭头来表示它们的next指针指向的位置,如果有的话(,所有这些事情都会变得更容易思考。 如果你还没有这样做,我推荐它。

你的第二次尝试是正确的:

if (head == NULL)               
{
head = newNode;             
}

您需要将head设置为newNode。在这里,你说的是"如果没有头,就让newNode成为头">

您的错误尝试:

if (head == NULL)               
{
head->next = newNode;             
}

在这里你说"如果没有头,将newNode设置为头的下一个节点",这是没有意义的,因为如果你没有头,你怎么能访问下一个节点?

相关内容

  • 没有找到相关文章

最新更新