顺序表中基本操作
因为表的长度是顺序表的一个“属性”,所以可以通过返回length的值实现求表长的操作,通过判断length的值是否为0判断表是否为空,这些操作算法的时间复杂度都是0(1)。下面讨论顺序表其他几个主要操作的实现。
1.初始化
顺序表的初始化操作就是构造一个空的顺序表。
Status InitList (SqList &L)
{//构造一个空的顺序表L
L.elem=new ElemType [MAXSIZE];//为顺序表分配一个大小为MAXS IZE的数组空间
if (!L.elem) exit (OVERFLOW) ;/ /存储分配失败退出
L. length=0;//空表长度为0
return OK;
}
动态分配线性表的存储区域可以更有效地利用系统的资源,当不需要该线性表时,可以使用销毁操作及时释放占用的存储空间。
2.取值
取值操作是根据指定的位置序号i,获取顺序表中第i个数据元素的值。
由于顺序存储结构具有随机存取的特点,可以直接通过数组下标定位得到,elem[i-1]单 元存储第i个数据元素。
Status GetElem(SqList L,int i, ElemType &e)
{
if (i<1| | i>L. length) return ERROR;
//判断i值是否合理,若不合理,返回ERROR
e=L.elem[i-1];
//elem[i-1]单元存储第i个数据元素
return OK;
}
3.查找
查找操作是根据指定的元素值e,查找顺序表中第1个与e相等的元素。若查找成功,则返回该元素在表中的位置序号;若查找失败,则返回0。
int LocateElem(SqList L, ElemType e)
{//在顺序表L中查找值为e的数据元素,返回其序号
for(i=0;i< L.length;i++)
if (L.elem[i]==e) return i+1;//查找成功,返回序号i+1
return 0;/ /查找失败,返回0
}
在查找时,为确定元素在顺序表中的位置,需和给定值进行比较的数据元素个数的期望值称为查找算法在查找成功时的平均查找长度
4.插入
线性表的插入操作是指在表的第i个位置插入一个新的数据元素e,使长度为n的线性表
(a1,……ai-1,ai,……,an)
变成长度为n+ 1的线性表
(a1,……ai-1,e,ai,……,an)
数据元素ai-1 和ai之间的逻辑关系发生了变化。在线性表的顺序存储结构中,由于逻辑上相邻份他于面先的数据元素在物理位置上也是相邻的,因此,除非i=n+ 1,否则必须移动元素才能反映这个逻辑关系的变化。
一般情况下, 在第i( 1≤i≤n)个位置插人-一个元素时,需从最后一个元素即第n个元素开始,依次向后移动一个位置,直至第i个元素(共n-i+ 1个元素)。
StatusListInsert (SqList &L,int i ,ElemType e)
{//在顺序表L中第i个位置插人新的元素e,i值的合法范围是1≤i≤L.length+1
if((i<1) ||(i>L. length+1)) returnERROR;//i 值不合法if (L. length==MAXSIZE) return ERROR;//当前存储空间已满
for(j=L. length-1;j>=i-1;j--)
L.elem[j+1]=L.elem//插人位置及之后的元素后移
L.elem[i-1]=e;//将新元素 e放人第i个位置
++L. length;//表长加1
return OK;
}
5.删除
线性表的删除操作是指将表的第i个元素删去,将长度为n的线性表
(a1,……ai-1,ai,ai+1,……,an)
变成长度为n- 1的线性表
(a1,……ai-1,ai+1,……,an)
数据元素ai-1、ai和ai+1之间的逻辑关系发生了变化,为了在存储结构上反映这个变化,同样需要移动元素。
一般情况下, 删除第i( 1≤i≤n)个元素时需将第i+ 1个至第n个元素(共n-i个元素)依次向前移动一个位置( i=n时无需移动)。
Status ListDelete (SqList &L, int i)
{//在顺序表L中删除第i个元素,i值的合法范围是1≤i≤L. lengthif((i<1)
if (i>L. length)) return ERROR; //i 值不合法for(j=i;j<=L.length-l;j++)L.elem[j-1]=L.elem[j] ;//被删除元素之后的元素前移
--L. length;//表长减 1
return OK;
}