Как я могу удалить узел из связанного списка с одним указателем? - PullRequest
1 голос
/ 24 марта 2020

Книга, которую я изучаю #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;
}

Но у меня есть два возражения по этому поводу:

  1. Этот код на самом деле содержит два указателя entry и list.

  2. Мы free() пока entry продолжаем его использовать, что «похоже» на ошибку.

Пожалуйста, если вы готовы помочь, объясните мои возражения или напишите новый код. Спасибо.

1 Ответ

1 голос
/ 24 марта 2020
  1. Этот код содержит два указателя на самом деле entry и list.

Вам необходимо создать алгоритм, который использует один указатель. В вашем случае, хотя это выглядит как два, entry - это один указатель, который алгоритм использует , кроме list, который фактически является входом для функции , содержащей алгоритм .

Мы free() вводим запись, но продолжаем ее использовать, что «похоже» на ошибку.

Код не использует entry после освобождения. После освобождения l oop немедленно прерывается из-за оператора break, следующего за вызовом free.

...