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】

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM