C++ c++;集合-使用链表的数据结构

C++ c++;集合-使用链表的数据结构,c++,set,set-difference,C++,Set,Set Difference,Tm试图获得链表中两个集合的差异 示例: 输入: A组:1-2-3-5 B组:2-4-5 输出: 工会:5-4-2-5-3-2-1 交叉口:5-2 差异:3-4-1(这里的问题)矿井产出差异:5-3-2-1 此代码位于“LinkedList.h”下 您对差异的实现太复杂了:因为列表已经排序,所以您需要做的就是查找不匹配的元素。这需要一个循环,在每次迭代中移动一个循环 两个迭代器,如果元素在两个集合中,即它不是差异的一部分 第一个列表的迭代器,在这种情况下,元素位于第一个集合中,但不在第二个集

Tm试图获得链表中两个集合的差异

示例:
输入:
A组:1-2-3-5
B组:2-4-5

输出:
工会:5-4-2-5-3-2-1
交叉口:5-2
差异:3-4-1(这里的问题)矿井产出差异:5-3-2-1

此代码位于“LinkedList.h”下


您对
差异的实现太复杂了:因为列表已经排序,所以您需要做的就是查找不匹配的元素。这需要一个循环,在每次迭代中移动一个循环

  • 两个迭代器,如果元素在两个集合中,即它不是差异的一部分
  • 第一个列表的迭代器,在这种情况下,元素位于第一个集合中,但不在第二个集合中
  • 第二个列表的迭代器,在这种情况下,有一个元素在第二个集合中,但不在第一个集合中

交叉点的实现同样太复杂,而且只需要一个循环:在没有为
Difference()
存储元素的情况下,它只存储公共值。最后,
Union()
也太复杂了:它会在每次迭代中存储一个元素,要么是公共元素,要么是跳过的元素,具体取决于采用哪个分支。这也将产生正确的结果

显然,您真正想要使用的是

std::set_intersection(s0.begin(), s0.end(), s1.begin(), s1.end(),
                      std::back_inserter(result_intersection));
std::set_union(s0.begin(), s0.end(), s1.begin(), s1.end(),
               std::back_inserter(result_union));
std::set_symmetric_difference(s0.begin(), s0.end(), s1.begin(), s1.end(),
                              std::back_inserter(result_difference));

假设您为列表和迭代器提供了一个标准接口。

7年后,这里是您的答案

void Difference(Set& ListA, Set& ListB)
    {
        for (member* i5 = ListA.head; i5 != NULL; i5 = i5->next)
        {

            for (member* i6 = ListB.head; i6 != NULL; i6 = i6->next)
            {
                if (i6->data != i5->data && ListA.find(i6) != 1 && ListB.find(i5) != 1) {
                    List::insert(i5->data);
                    List::insert(i6->data);
                }
                else {
                    continue;
                }
            }
        }
    }

在标准定义中,“联合”输出也是错误的——不应该有重复的元素。
std::set_intersection(s0.begin(), s0.end(), s1.begin(), s1.end(),
                      std::back_inserter(result_intersection));
std::set_union(s0.begin(), s0.end(), s1.begin(), s1.end(),
               std::back_inserter(result_union));
std::set_symmetric_difference(s0.begin(), s0.end(), s1.begin(), s1.end(),
                              std::back_inserter(result_difference));
void Difference(Set& ListA, Set& ListB)
    {
        for (member* i5 = ListA.head; i5 != NULL; i5 = i5->next)
        {

            for (member* i6 = ListB.head; i6 != NULL; i6 = i6->next)
            {
                if (i6->data != i5->data && ListA.find(i6) != 1 && ListB.find(i5) != 1) {
                    List::insert(i5->data);
                    List::insert(i6->data);
                }
                else {
                    continue;
                }
            }
        }
    }