集合的并交差运算

总时间限制:1000ms 内存限制: 65536kB

描述

有两个整数集合A和B,现在要求实现集合的并、交、差运算。例如A={2,7,9} ,B={3,7,12,2},则集合的并C=A∪B={2,7,9,3,12},而集合的交 C=A∩B={2,7},集合的差C=A-B={9}。集合A和B中元素个数在1~100之间。要求设计一个集合类,集合类实现集合的并交差运算。

输入

三行

第一行分别为集合A,B的个数
第二行为A集合的数据
第三行为B集合的数据

输出

三行<
第一行集合并的结果:C的个数及C中的元素
第二行集合交的结果:C的个数及C中的元素
第三行集合差的结果:C的个数及C中的元素

样例输入

3 4
2 7 9
3 7 12 2

样例输出

5 2 7 9 3 12
2 2 7
1 9


ac代码

/*
@File     :   set.cpp
@Time     :   2020/03/24
@Desc     :   集合的并交差运算
*/
#include <iostream>
#include <stdlib.h>

using namespace std;
//集合结点
typedef struct Node
{
    int data;
    Node *next;
}*Set;
/**
 * @brief 初始化一个结点
 */
void InitNode(Node *&node);
/**
 * @brief 为node写入数据
 */
void ReadDataForNode(Node *&node, int data);
/**
 * @brief 向set后插入一个元素
 */
void InsertNode(Set &set, Node *node);
/**
 * @brief 查找集合中是否存在给定元素
 */
bool Find(const Node *node, const Set set);
/**
 * @brief 生成集合
 */
void CreatSet(Set &set, const int size);
/**
 * @brief 打印集合
 */
void PrintSet(const Set set);
/**
 * @brief 复制集合
 */
Set CopySet(const Set set);
/**
 * @brief 两个集合并
 */
Set Add(const Set A, const Set B, int &size);
/**
 * @brief 两个集合差
 */
Set Sub(const Set A, const Set B, int &size);
/**
 * @brief 两个集合交
 */
Set Mul(const Set A, const Set B, int &size);

int main(int argc, char const *argv[])
{
    int size_a, size_b, size_c = 0;
    Set A, B, C;
    cin >> size_a >>size_b;
    CreatSet(A,size_a);
    CreatSet(B,size_b);
    size_c = size_a;
    C= Add(A,B,size_c);
    cout << size_c << " "; PrintSet(C);
    size_c = 0;
    C= Mul(A,B,size_c);
    cout << size_c << " "; PrintSet(C);
    size_c = 0;
    C= Sub(A,B,size_c);
    cout << size_c << " "; PrintSet(C);
    system("pause");
    return 0;
}
void InitNode(Node *&node)
{
    node = (Node*)malloc(sizeof(Node));
    node->next = NULL;
}
void ReadDataForNode(Node *&node, int data)
{
    node->data = data;
}
void InsertNode(Set &set, Node *node)
{   
    Node *node_;
    for (node_ = set; node_->next ; node_ = node_ ->next);
    node_->next = node;
}
bool Find(const Node *node, const Set set)
{
    for (Set node_ = set->next; node_ ; node_ = node_->next)
        if (node->data == node_->data) return true;
    return false;
}
void CreatSet(Set &set, const int size)
{
    int data;
    Node *node;
    InitNode(set);
    for (int i = 0; i < size; i++) {
        cin >> data;
        InitNode(node);
        node->data = data;
        InsertNode(set,node);
    } 
}
void PrintSet(const Set set)
{
    for (Set node = set->next; node ; node = node->next)
        cout << node->data <<" ";
        cout << endl;
}
Set CopySet(const Set set)
{
    Set C, n;
    InitNode(C);
    for (Node* node = set->next; node; node = node->next) {
        InitNode(n);
        n->data = node->data;
        InsertNode(C,n);
    } 
    return C;
}
Set Add(const Set A, const Set B, int &size)
{
    Set C = CopySet(A);
    Node *n;
    for (Set node = B->next; node ; node = node->next) {
           if (!Find(node,A)) {
              InitNode(n);
              n->data = node->data;         //直接insert node会弄脏B地址
              InsertNode(C,n);
              size++;
           }
    }
    return C;
}
Set Sub(const Set A, const Set B, int &size)
{
    Set C, n;
    InitNode(C);
    for (Set node = A->next; node; node = node->next) {
        if (!Find(node,B)) {
            InitNode(n);
            n->data = node->data;
            InsertNode(C,n);
            size++;
        }
    }
    return C;
}
Set Mul(const Set A, const Set B, int &size)
{
    Set C, n;
    InitNode(C);
    for (Set node = A->next; node; node = node->next) {
        if (Find(node,B)) {
            InitNode(n);
            n->data = node->data;
            InsertNode(C,n);
            size++;
        }
    }
    return C;
}
原文地址:https://www.cnblogs.com/levarz/p/12781498.html