如何从链表的特定节点中删除和清除内存?

时间:2018-05-25 02:24:07

标签: c list linked-list nodes free

所以,我有一个有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? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

假设您有一个链接列表A->B->C。 当您通过代码释放B节点(上一个节点A)时,它仍指向旧内存位置B,而不是新节点C。随机数,如果不是分段错误,只是垃圾存储器,其中B曾经被读取。

通过指向auxahead两个指针来修复它。 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;