#ifndef _SQLIST_H_
#define _SQLIST_H_
#include <iostream>
using namespace std;
const DEFAULT_SIZE=10;
enum StatusCode{RANGE_ERROR,SUCCESS,NOT_PRESENT,ENTRY_FOUND,OVER_FLOW};
template<class ElemType>
class SqList
{
protected:
ElemType *ptr;
int count;
int maxSize;
void init(int size);
bool full()const;
public:
SqList(int size=DEFAULT_SIZE);
virtual ~SqList();
int length()const;
bool isEmpty()const;
void clear();
StatusCode setElem(int position,const ElemType &e);
StatusCode getElem(int position,ElemType &e)const;
StatusCode Insert(int position,const ElemType &e);
StatusCode Delete(int position,ElemType &e);
SqList(const SqList<ElemType> ©);
SqList<ElemType>& operator = (const SqList<ElemType> ©);
void Traverse(void(*visit)(ElemType & ))const;
};
template<class ElemType>
bool SqList<ElemType>::full()const
{
return count==maxSize;
}
template<class ElemType>
SqList<ElemType>::SqList(int size)
{
ptr=NULL;
init(size);
}
template<class ElemType>
void SqList<ElemType>::init(int size)
{
maxSize=size;
count=0;
if(ptr!=NULL)
delete []ptr;
else
ptr=new ElemType[maxSize];
}
template<class ElemType>
SqList<ElemType>::~SqList()
{
delete []ptr;
}
template<class ElemType>
void SqList<ElemType>::clear()
{
count=0;
}
template<class ElemType>
int SqList<ElemType>::length()const
{
return count;
}
template<class ElemType>
bool SqList<ElemType>::isEmpty()const
{
return count==0;
}
template<class ElemType>
void SqList<ElemType>::Traverse(void(* visit)(ElemType & ))const
{
for(int curPosition=0;curPosition<count;curPosition++)
(* visit)(ptr[curPosition]);
}
template<class ElemType>
StatusCode SqList<ElemType>::setElem(int position,const ElemType &e)
{
if(position<1||position>count)
return RANGE_ERROR;
else
{
ptr[position-1]=e;
return SUCCESS;
}
}
template<class ElemType>
StatusCode SqList<ElemType>::getElem(int position,ElemType &e)const
{
if(position<1||position>count)
return RANGE_ERROR;
else
{
e=ptr[position-1];
return SUCCESS;
}
}
template<class ElemType>
StatusCode SqList<ElemType>::Delete(int position,ElemType &e)
{
if(position<1||position>count)
return RANGE_ERROR;
e=ptr[position-1];
for(int curPosition=position;curPosition<=count;curPosition++)
ptr[curPosition-1]=ptr[curPosition];
count-=1;
return SUCCESS;
}
template<class ElemType>
StatusCode SqList<ElemType>::Insert(int position,const ElemType &e)
{
//if((position+1)<2||(position+1)>Length())
if(position<1||position>length()+1)
return RANGE_ERROR;
if(full())//注意判断是否线性表已经满了
return OVER_FLOW;
for(int curPosition=count;curPosition>=position;curPosition--)
ptr[curPosition+1]=ptr[curPosition];
ptr[curPosition]=e;
count+=1;
return SUCCESS;
}
template<class ElemType>
SqList<ElemType>::SqList(const SqList<ElemType> ©)
{
init(copy.maxSize);
count=copy.count;
for(curPosition=0;curPosition<count;curPosition++)
ptr[curPosition]=copy.ptr[curPosition];
}
template<class ElemType>
SqList<ElemType>& SqList<ElemType>::operator = (const SqList<ElemType> ©)
{
if(©!=this)//注意判断copy是否等于本身
{
init(copy.maxSize);
count=copy.count;
for(curPosition=0;curPosition<count;curPosition++)
ptr[curPosition]=copy.ptr[curPosition];
}
return *this;
}
#endif
#include "SqList.h"
using namespace std;
template<class ElemType>
void Difference(SqList<ElemType> &la,SqList<ElemType> &lb,SqList<ElemType> &lc)
{
lc.clear();//先把lc的线性表清空
ElemType aElem,bElem;
int flag;
for(int aPosition=1;aPosition<=la.length();aPosition++)
{
flag=0;
la.getElem(aPosition,aElem);
for(int bPosition=1;bPosition<=lb.length();bPosition++)
{
lb.getElem(bPosition,bElem);
if(aElem==bElem)
{
flag=1;
break;
}
}
if(flag==0)
lc.Insert(lc.length()+1,aElem);
}
}
void main()
{
SqList<int> la,lb,lc;
int cElem;
for(int i=0;i<5;i++)
la.Insert(i+1,i);
for(int j=3;j<7;j++)
lb.Insert(j-2,j);
Difference(la,lb,lc);
for(int h=1;h<=lc.length();h++)
{
lc.getElem(h,cElem);
cout<<cElem<<" ";
}
cout<<endl;
}