bugfix> c > 投稿

だから、私は47000のうなずきを持つリンクリストを持っています。各ノードには年月日があります。 [最初の月、最後の月]に収まらないノードを削除したい。たとえば、最初の月を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;
}

これは私が望むうなずきを取得していないようですが、それらをクリアする代わりに、単に乱数を入れます。 疑いはありますか? 前もって感謝します。

回答 1 件
  • リンクリスト A->B->C があるとします 。 B を解放するとき  ノード、前のノード A 、あなたのコードでは、それはまだ古いメモリ位置 B を指します  新しいノード C ではありません 。乱数は、セグメンテーション障害ではない場合、 B の単なるガベージメモリです  以前は読まれていました。

    2つのポインター aux を使用して修正します 、および ahead 。ザ・ aux  ポインタが ahead の後ろに留まる  1つのノード、および 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;
    
    

あなたの答え