下面是链接列表代码中的删除节点,它将头指针和要删除的位置作为参数(链接列表中的位置索引从零开始)。删除后,返回指向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。
这是代码的模拟运行:
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错误