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