2017-04-18 1 views
-6
Node* RemoveDuplicates(Node *head) 
{ 
    if (head == NULL || head->next == NULL) 
    { 
     return head; 
    } 
    else 
    { 
     Node *ptr = head; 
     Node *tmp = head->next; 
     int a = ptr->data; 
     int b = tmp->data; 
     while (ptr->next != NULL) 
     { 
      if (a == b) 
      { 
       while (a == b) 
       { 
        ptr->next = tmp->next; 
        tmp = tmp->next; 
       } 
      } 
      else 
      { 
       ptr = ptr->next; 
       tmp = tmp->next; 
      } 

     } 
     return head; 
    } 
} 

GDBのOUTPUT:リンクリストの重複要素を削除するためにこのメソッドを書いたが、セグメンテーションフォルトが表示されるのはなぜですか?

GDB trace: 
Reading symbols from solution...done. 
[New LWP 11656] 
Core was generated by `solution'. 
Program terminated with signal SIGSEGV, Segmentation fault. 
#0 RemoveDuplicates (head=0x150fd00) 
    at solution.cc:31 
31   ptr->next=tmp->next; 
#0 RemoveDuplicates (head=0x150fd00) 
    at solution.cc:31 
#1 main() at solution.cc:80 

は、私は本当に、誰かが私を助けてください理由を理解することはできません、hackerrankとそのは次の出力を示した上で、このコードを書きました!このコードでは

+4

[mcve] please – StoryTeller

+1

まず、[ラバーダックのデバッグ](https://en.wikipedia.org/wiki/Rubber_duck_debugging)を試してみてください。そして、アルゴリズムを紙に詳述し、デバッガで行ごとにコードを実行して、実行することを確認します。あなたが最後のことをしたら(デバッガでコードをステップ実行する)、あなたは非常に迅速に問題を見つけることができるはずです!ヒント:無限ループがあります。 –

答えて

1

ルック:

 if (a == b) 
     { 
      while (a == b) 
      { 
       ptr->next = tmp->next; 
       tmp = tmp->next; 
      } 

aあなたはwhile (a == b)を実行bに等しいです。 whileの本文にaまたはbを変更しないため、無限ループが発生します。

遅かれ早かれtmpNULLになり、プログラムがクラッシュします。

おそらく、ループ内にaまたはbのいずれかを更新したかったでしょう。さらに、あなたは、次のセグメンテーションフォールトを与える>abは以下if条件のTEM = tmp-に同じである場合はptr->next = tmp->next

0

を行う前に、NULLをチェックする必要があります。

if (a == b) 
{ 
    while (a == b) 
    { 
     ptr->next = tmp->next; 
     tmp = tmp->next; 
    } 

場合abtmp = tmp -> nextがセグメンテーションフォールトを与えるelse状態では同じではありません。

else 
    { 
     ptr=ptr->next; 
     tmp=tmp->next; 
    } 

ab両方がループ全体に一定のままであるので。そして、このロジックは最初の2つのノードの値だけをチェックします。 ノードを1つ確認した後、abの両方の値を変更する必要があります。

関連する問題