0

C でリンクリストを指定して deleteDuplicates を実装しようとしています。segFault で問題が発生していますが、その理由がわかりません。それぞれがデータ3を持つ2つのノードを持つリンクリストを与える私のテストケースは以下の通りです。私の deleteDups では、コメント化された 2 つの if ブロックが表示されます。コメントを外すと、segFault は発生せず、コードは正常に動作しているように見えます。

なぜそうなのですか?if ステートメントは、while ループがチェックするものとまったく同じように思えます...

前もって感謝します!

私のノード構造とコード

typedef struct node{
  int data;
  struct node *next;
} *node;


void deleteDups(node *head)
{
   if (!*head)
        return;
   node current = *head;
   node runner;
   while (current)
   {
        runner = current;
        while (runner->next)
        {
            if (runner->next->data == current->data)
            {
                node tmp = runner->next;
                runner->next = runner->next->next;
                free(tmp);
            }
            /*if(runner->next == NULL)
            {
                break;
            }*/
            runner = runner->next;

        }
        /*if (current->next == NULL)
        {
            break;
        }*/ 
        current = current->next;
    }

}

int main(int argc, char*argv[])
{

node one = (node) malloc (sizeof (struct node));
one->data = 3;
one->next = NULL;

node head = (node) malloc (sizeof (struct node));
head->data = 3;
head->next = one;

printList(head);
deleteDups(&head);
printList(head);

return 0;

}

4

3 に答える 3

1

問題は内側のループ条件と代入にあります

runner = runner->next;

ノードが 2 つしかなく、最後のノードを削除すると、上記の割り当ては とrunner等しくなりNULLます。runner->next次に、ループ条件でチェックします。

これは、特にデバッガを使用してコードを 1 行ずつステップ実行して何が起こったかを確認する場合は、非常に簡単に見つけることができます。次回はそれを試してみることをお勧めします。

于 2013-11-13T19:23:35.163 に答える
0

問題は、runner->next の NULL チェックにあるようです。リストの最後のノードに対してこれらの 2 行を実行すると、ランナーが NULL になります。

runner->next = runner->next->next;<--- ここではランナーの次は NULL です。

.....

runner = runner->next;<-- ランナーは現在 NULL です。

次の繰り返しで、runner->next がクラッシュします。while ループ条件は次のようになります。 while(runner & runner->next)

-MS

于 2013-11-13T19:36:43.757 に答える