当前位置: 首页 > 知识库问答 >
问题:

链表删除节点。空闲(指针)在下一个节点中打印0

井礼骞
2023-03-14

下面是链接列表代码中的删除节点,它将头指针和要删除的位置作为参数(链接列表中的位置索引从零开始)。删除后,返回指向head的指针。

Node* delete(Node* head, int position) 
{
    Node *p = head;
    if(!position)
    {
        p = p->next;
    }
    else
    {
        while(position--)
        {
            if(!position) head->next = head->next->next; 
            head = head->next;
        }
    }
    free(head);
    return p; 
}

假设列表:20-2-19-7-3-6。要删除的位置是2(节点19要删除,因为索引从零开始)。

删除并打印后,它会显示:20-2-0-3-6。(即,直接位于已删除节点旁边的节点打印0)

但是如果我删除“free(head)”行,那么它将打印:20-2-7-3-6(正确)。

请帮忙解释一下原因。

PS:删除头部节点或尾部节点时没有问题。但中间的任何其他节点在下一个节点中显示0。

共有1个答案

宇文勇
2023-03-14

这是代码的模拟运行:

20 --> 2 --> 19 --> 7 --> 3 --> 6
^
head

while(position--) // position == 2
{
    if(!position) // position == 1, condition is false
        head->next = head->next->next; 
    head = head->next;
}

20 --> 2 --> 19 --> 7 --> 3 --> 6
       ^
       head

while(position--) // position == 1
{
    if(!position) // position == 0, condition is true
        head->next = head->next->next;
    head = head->next;
}

            /-----\
20 --> 2 --/ 19 --> 7 --> 3 --> 6    // 2's next is pointing to 7 now
                    ^
                    head

现在free(head)将被执行,这将删除包含数字7的节点。现在,当你打印时,你可能会得到:

20 -> 2 -> (reference to deleted node) -> 3 -> 6

我认为这是一种未定义的行为,即您正在引用已删除的节点,并且它正在打印0

 类似资料:
  • 我的问题是,如果用户输入一个姓氏,并且在链接列表中有多个相同的姓氏,并且其中一个姓氏在head节点中。如何在不删除头部节点的情况下删除另一个姓氏。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头部节点(这不是我想要的…)

  • 我正在用C语言创建一个单链表,它有头部和尾部指针,其中头部指针指向SLL的起始节点,尾部指针指向SLL的最后一个节点。我不想使用head指针遍历到列表末尾来删除节点。有没有办法让我可以使用尾指针删除SLL的最后一个元素? 下面是节点添加函数。头部和尾部初始化为NULL。 要删除第一个节点,使用以下函数:

  • 我正在为我的Data Structures类编写一个项目,该项目要求我编写一个类来实现INT的链接列表。 为节点使用内部类 包括以下方法 编写一个测试程序,使您能够以任意顺序使用所需的任何数据测试所有方法 我必须创建一个名为“public int deleteFromFront()”的方法。此方法旨在“删除列表前面的节点,并返回其中的int,如果列表为空,则返回null。”下面是我的代码。然而,当

  • 输入: 如何删除列顺序中没有值的记录? 期望输出: 我当前的XSL只删除空节点 我似乎无法掌握模板匹配来删除整个“记录”标签。。。非常感谢你!

  • 我有一个基本的链表问题,我在下面试图解决。如果您能为我的方法、算法的正确性(甚至是编码风格)提供任何信息,我将不胜感激。该问题需要一个函数,该函数删除循环链表中所有出现的int,并返回列表中的任何节点或NULL(当列表为NULL时)。 以下是我目前掌握的一些C代码:

  • 这是我的remove函数,用于删除具有元素的节点。我得到了一个seg错误,我很确定这是因为temp->prev是前面的哨兵,所以从技术上来说,它不在双链表中。如果这是正确的,我实际上如何防止这种情况?如有任何帮助,不胜感激。 编辑:刚刚更新了代码,但仍然出现了Seg错误