总时间限制: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;
}