猿问

使用指针从单链列表中删除项目

在最近的Slashdot访谈中, Linus Torvalds举例说明了一些人如何使用指针,表明他们并不真正了解如何正确使用它们。


不幸的是,由于我是他所谈论的人之一,所以我也无法理解他的榜样:


我见过太多的人通过跟踪“上一个”条目来删除单链接列表条目,然后删除该条目,例如


if (prev)

    prev->next = entry->next;

else

    list_head = entry->next;

每当我看到这样的代码时,我都会说“这个人不理解指针”。可悲的是,这很普遍。理解指针的人只使用“指向入口指针的指针”,并使用list_head的地址对其进行初始化。然后,当他们遍历列表时,只需执行以下操作即可删除条目而无需使用任何条件


*pp = entry->next

有人可以提供更多有关这种方法为什么更好的解释,以及在没有条件语句的情况下如何工作的更多解释吗?


慕码人8056858
浏览 471回答 3
3回答

慕村225694

一开始,您会pp = &list_head;并且,当您遍历列表时,可以使用pp = &(*pp)->next;这样,您始终可以跟踪“您来自”的点,并可以修改居住在那里的指针。因此,当您找到要删除的条目时,您可以*pp = entry->next这样,您就可以处理Afaq在另一个答案中提到的所有3种情况,从而有效地消除了对的NULL检查prev。

手掌心

我更喜欢虚拟节点方法,一种示例布局:|Dummy|->|node1|->|node2|->|node3|->|node4|->|node5|->NULL&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^&nbsp; &nbsp; &nbsp; &nbsp; ^&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;curr&nbsp; &nbsp;curr->next // << toDel然后遍历要删除的节点(toDel = curr> next)tmp = curr->next;curr->next = curr->next-next;free(tmp);这样,您无需检查它是否是第一个元素,因为第一个元素始终是Dummy并且永远不会被删除。
随时随地看视频慕课网APP
我要回答