【发布时间】:2020-03-24 13:41:02
【问题描述】:
我研究的这本书#include 是一个练习,要求我们修改以下代码,该代码从链表中删除一个节点,并构建另一个只用一个指针完成精确操作的函数:
struct node {
int value;
struct node * next;
};
struct node delete_from_list( struct node * list , int n){
struct node *cur, *prev;
for (cur = list, prev = NULL;
cur != NULL && cur -> value != n;
prev = cur, cur -> next)
;
if(cur == NULL)
return list;
else if(prev == NULL)
list = list -> next;
else
prev -> next = cur -> next;
free(cur);
return list;
}
我在网上看到的一些代码是:
struct node *delete_from_list(struct node **list, int n) {
struct node *entry = *list;
while (entry) {
if (entry->value == n) {
*list = entry->next;
free(entry);
break;
}
list = &entry->next;
entry = entry->next;
}
return *list;
}
但我对此有两个反对意见:
这段代码实际上包含两个指针
entry和list。我们正在
free()ingentry但继续使用它,“感觉”像一个错误。
如果您愿意提供帮助,请解释我的反对意见或编写新代码。谢谢。
【问题讨论】:
-
我先用一张纸和一支铅笔画出情况。
-
ad.2:一旦释放,您就没有使用该条目。有一个
break; -
是的,我画了它,但它实际上是让我质疑它的原因。我画了
entry指向一个由两个框组成的块,这意味着struct node结构。而使用free(entry)只是用一个巨大的十字架替换了两个盒子的块。没错,不是吗? -
@PaulOgilvie 哦,好的。现在这更有意义。谢谢,但代码不是还有2个指针吗?
-
欢迎来到stackoverflow!这是一个不错的小练习。我知道你对这两个指针的意思,但我认为问题设置器不包括参数。如果包含参数,那么原始代码有三个:list、cur、prev。
标签: c data-structures linked-list