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 + -
显示快捷键?