2012-03-22 4 views
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

при сравнении элемента _every_ в одной коллекции с элементом _every_ в другой коллекции должно быть ** две петли ** (где-то), а не одна. Так что, по крайней мере, половина этого. – 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 общий элемент, я просто пишу еще один цикл для проверки второго набора? – UnknownUser

0

ОК .. Это выглядит как домашнее задание .. так что я укажу несколько вещей, которые довольно очевидно, в приведенном выше

1) условие вы проверяете для значения (link2-> код = = link2-> value), вероятно, опечатка. Возможно, вы имели в виду значение link2-> value == link1->.
2) Вы выполняете итерирование по каждому элементу в списке 1, но не в списке 2. Таким образом, вы проверяете, только если первый элемент в списке 2 находится в списке 1.

Я думаю, что этого достаточно. .. :)

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

должен быть

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

Как указаны на gbulmer, вы должны также пройти по второму списку и сравнить его с первым.

+0

спасибо за это, не понял, что ошибка. – UnknownUser

Смежные вопросы