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