线性表之顺序存储结构删除操作

来源:互联网 发布:软件bs架构 编辑:程序博客网 时间:2024/06/10 03:58

线性表之顺序存储结构删除操作



线性表顺序存储结构知识补充 

线性表顺序存储的结构代码:

#define MAXSIZE 20    

typedef int ElemType;

typedef struct

{

ElemType data[MAXSIZE];

int length;    // 线性表当前长度

} SqList;

 

顺序存储结构封装需要三个属性:

存储空间的起始位置,数组data,它的存储位置就是线性表存储空间的存储位置。

线性表的最大存储容量:数组的长度MaxSize。

线性表的当前长度:length。

注意:数组的长度与线性表的当前长度需要区分一下:数组的长度是存放线性表的存储空间的总长度,一般初始化后不变。而线性表的当前长度是线性表中元素的个数,是会变化的

 

顺序存储结构的优缺点:

优点:

无须为表示表中元素之间的逻辑关系而增加额外的存储空间。

可以快速地存取表中任意位置的元素。

缺点:

插入和删除操作需要移动大量元素。

当线性表长度变化较大时,难以确定存储空间的容量。

容易造成存储空间的“碎片”。

 

1.删除操作的算法思路

如果删除位置不合理,抛出异常;

取出删除元素;

从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;

表长length=length-1。

 

2.删除操作的时间复杂度

最好的情况:删除操作刚好要求在最后一个位置操作,因为不需要移动任何元素,所以此时的时间复杂度为O(1)。

最坏的情况:如果要删除的位置是第一个元素,那就意味着要移动所有的元素向后或者向前,所以这个时间复杂度为O(n)。

至于平均情况,就取中间值O((n-1)/2),平均情况复杂度简化后还是O(n)。

1.6代码清单

/** 初始条件:顺序线性表L已存在,1<=i<=ListLength(L) *操作结果:删除L的第i个数据元素,并用e返回其值,L的长度-1 */Status ListDelete(SqList *L, int i, ElemType *e){    int k;    if( L->length == 0 )    {        return ERROR;    }    if( i<1 || i>L->length )    {        return ERROR;    }    *e = L->data[i-1];    if( i < L->length )    {        for( k=i; k < L->length; k++ )        {            L->data[k-1] = L->data[k];        }    }    L->length--;    return OK;}

2.1插入算法的思路:

如果插入位置不合理,抛出异常;

如果线性表长度大于等于数组长度,则抛出异常或动态增加数组容量;

从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;

将要插入元素填入位置i处;

线性表长length=length+1

 

2.2插入算法的时间复杂度

最好的情况:插入操作刚好要求在最后一个位置操作,因为不需要移动任何元素,所以此时的时间复杂度为O(1)

最坏的情况:如果要插入的位置是第一个元素,那就意味着要移动所有的元素向后,所以这个时间复杂度为O(n)

至于平均情况,就取中间值O((n-1)/2),平均情况复杂度简化后还是O(n)

 

2.3代码清单

Status ListInsert(SqList *L, int i, ElemType e){    int k;    if( L->length == MAXSIZE )  // 顺序存储已满    {        return ERROR;    }    if( i<1 || i>L->length+1)   // 插入位置不在存储范围内    {        return ERROR;    }  if( i <= L->length )   // 插入位置在表长以内且不在表尾     {        for( k=L->length-1; k >= i-1; k-- )        {            L->data[k+1] = L->data[k];//将要插入的位置的数据元素向后移动一位        }    }    L->data[i-1] = e;  // 插入新元素    L->length++;    return OK;}


0 0
原创粉丝点击