Как я могу удалить и очистить память из отдельного узла связанного списка? - PullRequest
0 голосов
/ 25 мая 2018

Итак, у меня есть связанный список с 47 тысячами кивков.у каждого узла есть год, месяц и день.Я хочу удалить узлы, которые не вписываются в [месяц, месяц, месяц].Поэтому, если я выбрал месяц, в качестве начального значения 3, а в качестве конечного 8, например, я хочу удалить те, которые не подходят, в зависимости от того, какой год и день.Я хочу, но вместо того, чтобы очистить их, он просто добавляет случайные числа. Любые предложения?Заранее спасибо.

1 Ответ

0 голосов
/ 25 мая 2018

Скажем, у вас есть связанный список A->B->C.Когда вы освобождаете узел B, предыдущий узел A вашим кодом, он все еще указывает на старую область памяти B, а не на новый узел C.Случайные числа, если не ошибки сегментации, это просто мусорная память, в которой раньше читалось B.

Исправьте это, используя два указателя, aux и ahead.Указатель aux остается за ahead одним узлом, и, если ahead проходит неудачное ограничение, free it, присваивает ahead ahead->next и обновляет aux соответственно.

LISTAPAISES* ahead = NULL;
aux = head;
// Special case if head passes the failing constain
if(head != NULL && (head->country.month>month_final || head->country.month<month_init)){
    aux = aux->next;
    free(head);
    head = aux;
}
if(aux != NULL){
    ahead = aux->next;
}
while(ahead != NULL){
    if(ahead->country.month>month_final || ahead->country.month<month_init){
        // Create a tmp pointer to hold the node after 'ahead'
        LISTAPAISES* tmp = ahead->next;
        free(ahead);
        // Reassign the previous pointer to now point to `tmp`
        aux->next = tmp;
        // Update 'ahead' to be 'tmp' for the next iteration
        ahead = tmp;
    }
    else{
        ahead = ahead->next;
        aux = aux->next;
    }
}

return head;
...