用一组地址连续的存储单元依次存放线性表中的数据元素,此时逻辑上连续的线性表在物理地址上连续
template
class SqList
{
public:
SqList(int m = 0);
~SqList();
bool IsEmpty()const { return len <= 0; }
int Length()const { return len; }
void Clear() { len = 0; }
bool GetElem(ElemType&, int) const;
bool SetElem(const ElemType&, int);
int LocatePrior(const ElemType&) const;
int LocateNext(const ElemType&) const;
void Traverse(void(*visit)(const ElemType &)) const;
bool OrderInsert(const ElemType&, int);//插入算法
bool OrderDelete(ElemType&, int);
int LocateElem(const ElemType&) const;
bool TailInsert(const ElemType&);//追加
int BinarySearch(ElemType &); //折半查找 // bool sort(); //升序、降序
int del(SqList &L); //新增方法,删除顺序表中值相同的元素的函数
void reverse(SqList &L); //新增方法,对顺序表中元素进行逆置的函数
void Del_x(ElemType x); //删除顺序表中和给定值相同的数据元素
void del2(SqList &L);//将无序顺序表中值相同的元素删除部分,保留一个
private:
int len;
int size; //分配给顺序表的空间大小
ElemType *elem; //elem一维数组
};
template
SqList::SqList(int m)
{
len=0;//初始化时数组长度位0
if(m==0)//如果m为0则不创建
elem=NULL;//将数组置为空
else
elem=new ElemType[m];//如果不为0则开辟数组空间为大小为m
size=m;//将数组长度size计为m
}
/*析构函数*/
template
SqList::~SqList()
{
delete []elem;//释放空间
}
/*取元素*/
template
bool SqList::GetElem(ElemType &e,int i)const
{
if(i<1||i>len)//合法性判断
return false;
else
e=elem[i-1];
return true;
}
/*设置元素*/
template
bool SqList::SetElem(const ElemType &e,int i)
{
if(i<1||i>len)
retrun false;
elem[i-1]=e;//将e存放在elem的第i个位置,由于数组是从0位置起
return true;
}
/*查找元素*/
template
int SqList::LocateElem(const ElemType &e)const
{
int i=1;
while(i
int SqList::LocatePrior(const ElemType &e)const
{
int i=LocateElem(e);
if(i>1)//第一个元素没有前驱
return i-1;
return 0;
}
/*查找元素的后继*/
template
int SqList::LocateNext(const ElemType &e)const
{
int i=LocateNext(e);
if(i
bool SqList::OrderInsert(const ElemType&, int)
{
if(i>len+1||i<1)//合法性判断
return false;
if(len>=size)//表满则扩展
{
ElemType *newbase;
newbase=new ElemType[size+10];
if(!newbase)
return false;
for(int j=0;j=i-1;--p)//从最后一个移动后移
elem[p+1]=elem[p];
elem[i-1]=e;//将i号元素赋值e
++len;//长度加1
return true;
}
/*删除元素*/
template
bool SqList::OrderDelete(ElemType&, int)
{
if(i>len||i<1)//判断合法性
return false;
for(int p=i;p<=len;p++)//从前往后移动
elem[p-1]=elem[p];//赋值
--len;//长度减少1
return true;
}
temaplate
bool SqList::TailInsert(const ElemType&)//追加
{
if(len>=size)
{
ElemType *newbase;
newbase=new ElemType[size+10];
if(!newbase)
return false;
for(int j=0;j
/*折半查找*/
template
int SqList::BinarySearch(ElemType &key)
{
int low=0,high=len-1;
while(low<=high)//循环条件
{
int mid=(low+high)/2;
if(elem[mid]==key)
return mid;
else if(elem[mid]
int SqList::del(SqList &L)
{
int i,j;
for(i=0;i