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】

  

posted @ 2019-03-20 13:20  学之初  阅读(1196)  评论(0编辑  收藏  举报