Книга, которую я изучаю #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
продолжаем его использовать, что «похоже» на ошибку.
Пожалуйста, если вы готовы помочь, объясните мои возражения или напишите новый код. Спасибо.