2017-03-19 6 views
-1

私のコードは、リンクリストLから値targetを削除するためのものです。私が見つけることができない何らかの理由で、セグメンテーションフォールトを引き起こすか、または2番目のprintステートメントを実行することはありません。また、数値が削除されている場合は0を、そうでない場合は1を返します。コードがセグメンテーションフォールトを起こす、または実行を完了しない

unsigned int removeNumber(LL_t * L, int target) 

{ 
    int ret = 0; 
    node_t * current = L->head; 
    node_t * previous = NULL; 
    node_t * tmp = current; 

    for(current = L->head; current != NULL; previous = current, current->next) 
    { 
     if ((current->data == target) && (previous != NULL)) 
     { 
      free(current); 
      current = current->next; 
      previous = current; 
      ret += 1; 
     } 
     else if ((current->data == target) && (previous == NULL)){ 
      L->head = current->next; 
     } 
    } 
    if (ret > 0) 
    { 
     return 0; 
    } 
    return 1; 
} 
+3

問題を示す完全なプログラムを含めてください。ここに指示があります。[mcve] – sigjuice

+8

あなたはここで何をしていると思いますか? current = current-> next; ' –

+0

さらにいくつかのエラー:' current'を 'current-> next'に進めることはないので、実際にはリストを歩いていません。あなたのremove-from-head-of-listコードは 'ret'を増やさず、' free'を決して呼び出さないようにメモリをリークします。 –

答えて

-1

あなたのコードにはいくつかのエラーがあります。このコードを代わりに使用してください。

unsigned int removeNumber(LL_t * L, int target) 

{ 
    int ret = 0; 
    node_t * current = L->head; 
    node_t * previous = NULL; 
    node_t * tmp = current; 

if(current->data==target) 
{ 
L->head=current->next; 
    free(current); 
    ret++; 
} 

else 
{ 

    for(current = L->head; current->next != NULL; current= current->next) 
    { 
     if ((current->next->data == target)) 
     { 
      free(current); 
      previous = current->next; 
      current->next= previous->next; 
      free(previous); 
      ret++; 
     } 

    } 

} 
    if (ret > 0) 
    { 
     return 0; 
    } 
    return 1; 
} 
+0

「[答え]」をお読みください。スタックオーバーフローでは、コードのみの回答は、なぜ古いコードがうまくいかなかったのか、新しいコードが動作するのか説明していないので、一般的に役に立たないと考えられます。少なくとも、コードブロックにコメントを追加して変更をマークして説明してください。 –

+0

コードがコンパイルされません。 'head'は定義されていません(' L-> head'を意味すると思います)。また、 'target'が最初のノードに現れた場合、あなたの関数はすべての' return'ステートメントをスキップし、いくらかのガベージ値を返します。 'current'が指すメモリを'フリーズ 'し、読み書きを試みます。最後に、元の関数は 'target'値を含む_all_ノードを削除しようとします。 @Jimotheyturnerはこれに関する質問に答えなかったので、それが意図であるかどうかだけを推測することができます。質問に答えるための十分な情報がありません。 –

+0

訂正していただきありがとうございます。私はまた、目標値を持つすべてのノードを削除する必要があると仮定しました。また、彼のコードには多くの問題がありました。 –

関連する問題