两个排序链接列表C ++的交集

时间:2018-03-30 07:15:30

标签: c++

大家。我的交叉方法有些麻烦。它工作正常,但在程序结束后它会抛出错误。这是我的代码:

void SortedLinkedList::intersection(SortedLinkedList finalList, SortedLinkedList list1, SortedLinkedList list2) {
        Node *pointer1 = list1.first;
        Node *pointer2 = list2.first;
        int counter = 0;
        while (pointer1 != NULL && pointer2 != NULL) {
            if (pointer1->data < pointer2->data) {
                pointer1 = pointer1->next;
            }
            else if (pointer2->data < pointer1->data){
                pointer2 = pointer2->next;
            }
            else if (pointer1->data == pointer2->data){
                finalList.addItem(pointer1->data);
                pointer1 = pointer1->next;
                pointer2 = pointer2->next;
            }
        }
        finalList.printList();
    }

我需要在第三个列表中获得两个列表的交集。

2 个答案:

答案 0 :(得分:1)

主要的瞪眼错误:SortedLinkedList finalist 您必须更改该类中的值,它是您的输出数据结构。您必须通过引用传递它,否则传递给函数的实际列表永远不会被更改。

在某些情况下,您希望其他输入数据也传递给refs,就像使用“const”声明符一样,您必须只使用const方法。因为你实际上不使用任何方法而你的类相对简单,这并不重要

void SortedLinkedList::intersection(SortedLinkedList& finalList, 
                  const SortedLinkedList& list1,
                  const SortedLinkedList& list2) 

没有看到你班级的整体设计的任何其他事情都会让人猜测。问题可能在于您的AddItem方法或缺少类字段初始化。

答案 1 :(得分:0)

标准库为std::set_intersection

提供了一种方法

它恰好用于合并到已排序的容器。

这是从链接获取的片段:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
  std::vector<int> v1{1,2,3,4,5,6,7,8};
  std::vector<int> v2{        5,  7,  9,10};
  std::sort(v1.begin(), v1.end());
  std::sort(v2.begin(), v2.end());

  std::vector<int> v_intersection;

  std::set_intersection(v1.begin(), v1.end(),
                        v2.begin(), v2.end(),
                        std::back_inserter(v_intersection));
  for(int n : v_intersection)
    std::cout << n << ' ';
}

在链接中,您还可以找到几种可能的实现方式。但是,我的建议是:&#34;不要重新发明轮子,只需重新调整它即可。