顺序表的基本运算方法
1)初始化线性表运算方法
将顺序表L的length域设置为0,对应的算法如下。
void InitList(SqList &L)
{
L.length=0;
}
本算法的时间复杂度为O(1)。
2)销毁线性表运算算法
这里顺序表L作为自动变量,其内存空间是由系统自动分配的,在不需要时会由系统自动释放空间,所以函数不含任何语句。对应的算法如下
void DestroyList(SqList L)
{ }
3)求线性表长度运算算法
返回顺序表L的length域值,对应的算法如下
void GetLength(SqList L)
{
return L.length;
}
本算法的时间复杂度为O(1)。
4)求线性表中第 i 个元素运算算法
对于顺序表L,算法在逻辑序号 i 无效时返回特殊值0(假),有效时返回1(真),并用引用型形参 e 返回第 i 个元素的值。对应的算法如下
int GetElem(SqList L,int i,ElemType &e)
{
if(i<1||i>L.length)
return 0; //取无效的值返回0
else
{
e=L.data[i-1];
return 1; //取元素值返回1
}
}
本算法的时间复杂度为O(1)。
5)按值查找运算算法
在顺序表L中找第一个值为 x 的元素,找到后返回其逻辑序号,否则返回0(由于线性表的逻辑序号从1开始,这里用0表示没有找到值为 x 的元素)。对应的算法如下。
int Locate(SqList L,ElemType x)
{
int i=0;
while(i<L.length&&L.data[i]!=x) //查找第一个值为x的元素查找范围0~L.length-1
i++;
if(i>=L.length) //未找到返回0
return (0);
else
return (i+1); //找到后返回其逻辑序号
}
本算法的时间复杂度为O(n), 其中 n 为 L 中的元素个数。
6)插入元素运算算法
将新元素 x 插入到顺序表 L 中逻辑序号为 i 的位置(如果插入成功,元素 x 成为线性表的第 i 个元素)。当 i 无效时返回0(表示插入失败),i 有效时将 L.data[i-1…L.length-1]均后移一个位置,再在 L.data[i-1]处插入 x ,顺序表长度增1,并返回1(表示插入成功)。对应的算法如下
int InsElem(SqList &L,ElemType x,int i)
{ int j;
if(i<1||i>L.length+1) //无效参数i
return 0;
for(j=L.length;j>i;j--)
L.data[j]=L.data[j-1]; //将位置为i的元素及之后的元素均后移
L.data[i-1]=x; //在位置i处放入x
L.length++; //线性表长度增1
return 1;
}
本算法的平均时间复杂度为O(n)。
7)删除元素运算算法
删除顺序表 L 中逻辑序号为 i 的元素。在 i 无效时返回0,i 有效时将 L.data[i…L.length-1]均前移一个位置,顺序表长度减1,并返回1。对应的算法如下
int DelElem(SqList &L,int i)
{
int j;
if(i<1||i>L.length) //无效的参数i
return 0;
for(j=i;j<L.length;j++) //将位置i的元素之后的元素均前移
L.data[j-1]=L.data[j];
L.length--; //线性表长度-1
return 1;
}
本算法的平均时间复杂度为O(n)。