2012-03-22 14 views
2

私は2つのリンクされたリストを持っている、私は両方のリストを比較し、両方のリストに表示されるすべての共通の要素を印刷したい。すべてがそれを働かせることができない試みた。リンクリストに2つのセットの共通要素を取得するにはどうすればよいですか?

struct Node *calcIntersection(struct Node *headA, struct Node *headB) 
{ 

struct Node * link1 = headA; 

struct Node * link2 = headB; 

while(link1 != NULL) 
{ 

    if (link2->value == link2->value) 
    { 

     printf("%d", link1->value); 

    }  

    link1 = link1 -> pNext; 

} 

    return link1; 

} 
+0

この宿題はありますか?もしそうなら、そのようにタグを付けてください。 –

+0

それは宿題ではなく、自分自身にアルゴリズムとデータ構造を教えようとしています。 – UnknownUser

+0

1つのコレクションの_every_ itemを別のコレクションの_every_ itemと比較すると、**ではなく** 2つのループ**(どこか)が存在する必要があります。それで、少なくとも半分はそれがあります。 – gbulmer

答えて

0

あなたはあなたの方法は次のようになります。実際に、接近している:

struct Node *calcIntersection(struct Node *headA, struct Node *headB) 
{ 
    struct Node *link1 = headA; 

    while(link1 != NULL) 
    { 
     struct Node *link2 = headB; 

     while (link2 != NULL) 
     { 
      if (link1->value == link2->value) 
      { 
       printf("%d", link1->value); 
      }  

      link2 = link2->pNext; 
     } 

     link1 = link1->pNext; 
    } 

    return link1; 
} 

私はあなたがそこに戻っているか、非常にわからないんだけど、あなたがNULLを返すことになるほとんどの状況で、私はありませんそれがあなたの望むものなのかどうかは確かです。

+0

これは、両方のポインタが同時に進行するため、正しい解決策ではありません。要素ごとに比較します。 [1,2,3]、[2、1、3]のようなもので失敗する – vascop

+0

あなたの答えを編集したのを見ました。私が指摘したエラーはもはや適用されません。また、この方法を使用して繰り返し値が印刷されることに注意してください。 – vascop

+0

ありがとうございました。現在は動作しています。戻り値は共通の値を返すサポートです。両方のセットに共通の要素が1つ以上ある場合、2番目のセットを確認するためにループを作成するだけですか? – UnknownUser

0

OK。これは...宿題のように見えるので、私は

1上記のコードではかなり明白であるいくつかのことを指摘する)あなたは=(link2->値をチェックしている状態= link2-> value)はおそらくタイプミスです。あなたはlink2-> value == link1-> valueを意味するかもしれません。
2)リスト1のすべての要素を繰り返しますが、リスト2ではなくリスト2の最初の要素がリスト1にある場合にのみチェックします。 .. :)

0
if (link2->value == link2->value) 

はgbulmerで指摘したように、あなたはまた、第二のリストを反復処理すると、最初の1にそれを比較する必要があり

if (link1->value == link2->value) 

であるべき。

+0

そのおかげで、そのエラーは実現しなかった。 – UnknownUser

関連する問題