#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】