#if 1
#include <iostream>
#include <stdlib.h>
using namespace std;
class List
{
public:
//默认构造函数集合大小为6个元素
List();
//构造函数重载,可接受参数,改变集合大小
List(int size);
//析构函数释放str,
~List()
{
delete []str;
}
//打印数据
void print(int size);
//集合元素增加
void add();
//集合元素删除
void dlt();
//集合元素修改
void alter();
//查找元素
void Seek();
//运算符重载
int operator +(List &str_2);
private:
int *str; //集合
int Length; //数组集合的大小
};
//构造函数初始化(集合2)
List::List()
{
//输入数据
Length=6; //初始化
str=new int[Length]; //在堆里申请空间
cout<<endl<<"请输入集合2(每输入一个按Enter):";
cout<<endl;
//读入六位数据,重复数据删除
for(int i=0;i<Length;i++)
{
cin>>str[i]; //读入六位数据
//若输入数据重合,不录入该数据
for(int j=0;j<i;j++)
{
if(str[j]==str[i])
{
i--;
cout<<"输入非法,请再次输入,此次重复的集合元素是: "<<str[j]<<endl;
break;
}
}
}
}
//构造函数重载,可接受参数,改变集合大小(集合1)
List::List(int size)
{
Length=size;
str=new int[Length+100]; //在堆里申请空间
cout<<"请输入整数集合(每输入一个按Enter):";
cout<<endl;
//读入六位数据,重复数据删除
for(int i=0;i<Length;i++)
{
cin>>str[i]; //读入六位数据
//若输入数据重合,不录入该数据
for(int j=0;j<i;j++)
{
if(str[j]==str[i])
{
i--;
cout<<"输入非法,请再次输入,此次重复的集合元素是: "<<str[j]<<endl;
break;
}
}
}
cout<<"集合1为:";
print(Length);
}
//增加数据
void List::add()
{
int flag=0,loop=1; //flag为重合标志,loop用于循环输入
int data; //插入的数据
//检测添加元素是否合法
while(loop)
{
cout<<"请输入你要增加的元素:";
cin>>data;
for(int i=0;i<Length;i++)
{
if(data==str[i])
{
flag=1; //找到集合相同数据
}
}
if(!flag)
{
str[Length]=data; //输入的数据不重合,将其添加至数组末尾
Length++; //数据增加
loop=0; //退出循环输入
print(Length); //打印
}
else //若输入重合重新输入
{
cout<<"输入非法,数据重合!"<<endl;
loop=1; //继续下一次输入
flag=0;
}
}
}
//删除数据
void List::dlt()
{
int data,j=0,idx=0; //data是需要删除的数据,j是原数组下标从0开始,idx为元素存在的标志
cout<<"请输入你要删除的元素:";
cin>>data;
for(int i=0;i<Length;i++)
{
if(data!=str[i]) //从第一个元素开始遍历,未找到删除数据进行数组赋值
{
str[j]=str[i];
j++;
}
if(data==str[i])
idx=1;
}
if(idx)
Length--;//数组元素减一
else
cout<<"未找到该元素!!!"<<endl;
print(Length);
}
//修改数据
void List::alter()
{
int temp,temp1,flag=0; //temp要修改的值,temp1为修改的数据,flag为重合标志
cout<<"请问你要修改第几个元素:";
cin>>temp;
cout<<"请输入变更值:";
cin>>temp1;
for(int i=0;i<Length;i++)
{
if(str[i]==temp1)
{
cout<<"变更数据非法,集合中已有该数据!!!"<<endl;
flag=1;
break;
}
}
if(!flag)
{
str[temp-1]=temp1;
}
print(Length);
}
//查询数据
void List::Seek()
{
int i,data; //data为查找的数据
int idx=0; //idx存放下标
cout<<"请输入你要查找的数据: ";
cin>>data;
for(i=0;i<Length;i++)
{
if(str[i]==data)
{
idx=i+1;
break;
}
}
if(idx)
cout<<"你查找的数据在"<<idx<<"个元素"<<endl;
else
cout<<"未找到该数据!!!"<<endl;
}
//运算符重载
int List::operator +(List &str_2)
{
int Len_1=this->Length; //集合1的元素个数
int Len_2=str_2.Length; //集合2的元素个数
int flag=0; //元素重合标志
int *str1=this->str; //集合1
int *str2=str_2.str; //集合2
//集合合并,集合2合并至集合1中
for(int i=0;i<Len_2;i++)
{
for(int j=0;j<Len_1;j++)
{
//如果有相等元素就退出,并打上flag标记
if( str2[i]==str1[j] )
{
flag=1;
break;
}
}
//如果没有相同元素就把集合2的值放入集合1的末尾,长度加1;
if(!flag)
{
str1[Len_1]=str2[i];
Len_1++;
}
flag=0; //下一次比较开始
}
return Len_1;
}
//打印数据同时排序
void List::print(int size)
{
//冒泡排序
for(int i=0;i<size;i++)
{
for(int j=0;j<size-i-1;j++)
{
if(str[j]>str[j+1])
{
int temp=str[j];
str[j]=str[j+1];
str[j+1]=temp;
}
}
}
//打印数据
cout<<'{';
for(int i=0;i<size;i++)
{
cout<<" "<<"'"<<str[i]<<"'"<<" ";
}
cout<<'}'<<endl;
}
void main()
{
int size; //集合元素个数
cout<<"请输入集合1个数:";
cin>>size;
List str(size); //生成集合1
str.add(); //增加元素
str.dlt(); //删除元素
str.alter(); //改变数据
str.Seek(); //查找数据
List str_2; //生成集合2
cout<<"集合2为:";
str_2.print(6);
cout<<"两集合合并为:";
str.print(str+str_2); //利用运算符重载实现集合合并至集合1的str
system("pause");
}
#endif
//析构器析构时由于集合合并,原先集合1申请的空间不足会报错,已申请【100+Length】