zoukankan      html  css  js  c++  java
  • 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】
    

      

  • 相关阅读:
    WinForm中快捷键与组合按键的设置方法
    WinForm窗体间传值的方法
    System.Data.SqlClient 命名空间
    登录
    查找和替换
    进制转换
    对话框
    Object基类
    抽象类与抽象方法
    千位数减百位数不退位 区间代换
  • 原文地址:https://www.cnblogs.com/huxiaobai/p/10564327.html
Copyright © 2011-2022 走看看