intset.cpp

来自「某个实验事编写粗糙集智能信息处理的程序」· C++ 代码 · 共 213 行

CPP
213
字号
// IntSet.cpp: implementation of the CIntSet class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
//#include "KnowDis.h"
#include "IntSet.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CIntSet::CIntSet()
{
	//the sorted set
    cSize=0;
	pData=NULL;
	HaveData=false;
	//*/

}

CIntSet::~CIntSet()
{
	//the sorted set
	if(HaveData) delete[] pData;
}



bool CIntSet::Insert( WORD ele)
{//从小到大排序,按顺序插入pData[].成功:true  如有原数组中元素存在相同,不能插入.返回为false
	int i,k=0,j;
	WORD* pNewData;//word:A 16-bit unsigned integer
	//the sorted set
    if(cSize==0)
	{//pData重新分配空间
		cSize++;
		pData=new WORD[cSize];
		HaveData=true;
		pData[0]=ele;
		return true;
	}
	else
	{
		pNewData=new WORD[cSize+1];k=0;
		for(i=0;i<cSize;i++)
		{
			if(pData[i]<ele)
				pNewData[k++]=pData[i];
			else if(pData[i]==ele)
			{//如有相同,不能插入.返回为false
				delete[] pNewData;
				return false;
			}
			else
			{
				pNewData[k++]=ele;
				for(j=i;j<cSize;j++)
					pNewData[k++]=pData[j];
				cSize++;
				delete[] pData;
				pData=pNewData;
				return true;
			}

		}
		pNewData[k]=ele;//pData中数都比ele小,将ele插入末尾
		cSize++;
		delete[] pData;
		pData=pNewData;
		return true;
	}
}

void CIntSet::Display()
{   
}

bool CIntSet::Have(WORD ele)
{// 用2分法在pData中查找ele,找到返回true,否则返回false
   int start,end,mid;
   start=0;
   end=cSize-1;
   while(start<=end)
   {
	   mid=(start+end)/2;
	   if(pData[mid]<ele) start=mid+1;
	   else if(pData[mid]==ele) return true;
	   else end=mid-1;
   }
   return false;
}

bool CIntSet::IsSubSetOf(CIntSet& set)
{//当前集合是否包含于set中,包含返回为:true;else return false
	int i;
	if (cSize>set.cSize) return false;
   ///*the sorted set
    if(pData[0]<set.pData[0]) return false;//不包含,返回为false
	if(pData[cSize]>set.pData[set.cSize]) return false;
	for(i=0;i<cSize;i++)
	{ 
	   if(!set.Have(pData[i])) return false;
	} 
   return true;
}

void CIntSet::Clear()
{//释放内存
     if(HaveData) delete[] pData;
	 cSize=0;
	 HaveData=false;
}


bool CIntSet::IsEmpty()
{//判断是否为空,为空:return true; else return false
    return cSize==0;
}

int CIntSet::NumOfEle()
{//返回集合中的元素个数
    return cSize;
}

WORD CIntSet::DropOne()
{//淘汰集合中最后一个元素,返回集合中剩下的最后一个元素
	///*the sorted set
    if(cSize==0)
	{
		::AfxMessageBox("error",MB_ICONSTOP);
		return 0;
	}
	cSize--;
	return pData[cSize];
}

CIntSet& CIntSet::operator =(CIntSet& set)
{//集合相等赋值
  int i;
  if(!set.HaveData)
  {//set为空时,释放内存,返回
	  cSize=0;
	  HaveData=false;
	  delete[] pData;
	  pData=NULL;
	  return *this;
  }
  if(cSize>0)
  {
	  delete[] pData;
  }
  cSize=set.cSize;
  HaveData=true;
  pData=new WORD[cSize];
  for(i=0;i<cSize;i++)
     pData[i]=set.pData[i];
  return *this;
}

bool CIntSet::Equal(CIntSet &s)
{//判断集合是否相等,equal:return true;not equal: return false
	int i;
	if(cSize!=s.cSize)
	   return false;
	for(i=0;i<cSize;i++)
	{
		if(pData[i]!=s.pData[i])
			return false;
	}
	return true;
}
void CIntSet::From_Set_To_IntSet(Set* set)
{//集合相等,从set到本集合.类似于CIntSet& CIntSet::operator =(CIntSet& set)
	int i,k;
	int j;
	j=set->GetCard();
	if(j==0)
	{
		cSize=0;
		HaveData=false;
		delete[] pData;
	}
	else
	{
		HaveData=true;
		cSize=j;
		pData=new WORD[j];
		for(i=0;i<j;i++)
		{
			k=set->GetElement(i);
			pData[i]=k;
		}
	}	
}

void CIntSet::From_IntSet_To_Set(Set& set)
{//将集合所有元素赋给set集合 .从本集合到set
	int* temp=new int[cSize];
	int i;
	for(i=0;i<cSize;i++)
		temp[i]=pData[i];
	Set set1(temp, cSize);
	set=set1;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?