所以,我有一个有47,000个点头的链表。每个节点都有年月和日。 我想删除不适合[月初始,月末]的节点。因此,如果我选择初始月份为3,将最终月份选为8,例如,我想删除那些不适合的年份和日期。
LISTAPAISES *Filtra_month(LISTAPAISES * head, int month_init, int month_final) {
LISTAPAISES *aux=NULL, *elim=NULL, *aux2=NULL;
aux=head;
while(aux !=NULL){
if(aux->country.month>month_final || aux->country.month<month_init){
elim=aux;
aux=aux->next;
free(elim);
}
else{
if(aux2==NULL){
aux2=aux;
}
aux=aux->next;
}
}
return aux2;
}
这似乎没有得到我想要的点头,但不是清除它只是随机数字。 任何sugestions? 提前谢谢。
答案 0 :(得分:0)
假设您有一个链接列表A->B->C
。
当您通过代码释放B
节点(上一个节点A
)时,它仍指向旧内存位置B
,而不是新节点C
。随机数,如果不是分段错误,只是垃圾存储器,其中B
曾经被读取。
通过指向aux
和ahead
两个指针来修复它。 aux
指针位于ahead
个节点后面,如果ahead
通过了失败的约束free
,则将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;