Скажем, у вас есть связанный список 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;