集合的並交差運算


總時間限制: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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM