• 集合的并交差运算


    总时间限制: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;
    }
    
  • 相关阅读:
    鸡啄米vc++2010系列19(常用控件:静态文本框)
    鸡啄米vc++2010系列18(颜色对话框)
    鸡啄米vc++2010系列17(字体对话框)
    鸡啄米vc++2010系列16(文件对话框)
    鸡啄米vc++2010系列15(消息对话框)
    鸡啄米vc++2010系列14(一般属性页对话框的创建)
    鸡啄米vc++2010系类13(向导对话框的创建)
    鸡啄米vc++2010系列12(属性页对话框)
    鸡啄米vc++2010系列11(非模态对话框的创建)
    鸡啄米vc++2010系列10(模态对话框及其弹出过程)
  • 原文地址:https://www.cnblogs.com/levarz/p/12781498.html
Copyright © 2020-2023  润新知