2016-12-21 11 views
1

二重のリストの符号の変更回数を取得する必要があります。たとえば、「1、-1、-1,1」のようなリストがある場合、隣接する要素の間に2つの符号の変更があります。私はこのようにそれを試してみましたが、私はそれをコンパイルしようとした場合、何らかの理由でプログラムがクラッシュする:Cのリストの符号の変化を数える

int number_of_sign_changes(DoubleList* list) { 
    int changes = 0; 
    for (DoubleNode *n = list->first; n != NULL; n = n->next) { 
     if ((n->value >= 0) && (n->next->value < 0)) { 
      changes += 1; 
     } else if ((n->value < 0) && (n->next->value >= 0)) { 
      changes += 1; 
     } 
    } 
    return changes; 
} 

ループは間違いなく動作します。私は他の機能で試してみましたが、ここではうまくいきません。誰にもアイデアはありますか?あなたは実際に2つのif文を1に入れることができました。

+1

は 'N'がリスト内の最後のノードであるときに何が起こるかについて考え、そして 'N-> next'はヌルポインタです。 –

+0

ありがとうございました! – NoIdea

答えて

2

これは本質的にフェンスポストの問題です。可能な符号の変更の数は、リスト内の要素の数よりも1つ少ないため、各項目をチェックするときに間違っていることを示すことができます。問題は実際にはリストの最後の項目をチェックするときに発生します。つまり、n->nextNULLであるため、次の項目への符号変更をチェックしようとします。

この

は、次のように forループで終了条件に簡単な変更で固定することができます。

int number_of_sign_changes(DoubleList* list) { 
    int changes = 0; 
    for (DoubleNode *n = list->first; n != NULL && n->next != NULL; n = n->next) { 
     if ((n->value >= 0) && (n->next->value < 0)) { 
      changes += 1; 
     } else if ((n->value < 0) && (n->next->value >= 0)) { 
      changes += 1; 
     } 
    } 
    return changes; 
} 
関連する問題