我研究的#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()
使用entry
,但继续使用它,这"感觉"像是一个错误。
如果你愿意帮忙,请解释我的反对意见或写一个新代码。谢谢
- 此代码实际上包含两个指针
entry
和list
您需要构建一个使用单个指针的算法。在您的情况下,虽然看起来像两个,但entry
是算法使用的一个指针,而list
实际上是包含算法的函数的输入。
- 我们正在
free()
处理条目,但继续使用它,这"感觉"像是一个错误
释放后,代码不使用entry
。释放后,由于break
语句在调用free
后立即中断循环。