c++ 集合的增删改查,与两集合的合并 缺陷(空间大小不灵活)
#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】