>我已经为链表创建了这个结构。
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设置为头的下一个节点",这是没有意义的,因为如果你没有头,你怎么能访问下一个节点?