线性表(二)——顺序存储结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangguangchao/article/details/84302604

线性表的顺序存储结构

构造原理

用一组地址连续的存储单元依次存储线性表的数据元素,数据元素之间的逻辑关系通过数据元素的存储位置直接反映。
记做 ( a1,a2,a3,… … , an )
在这里插入图片描述
所谓一个元素的地址是指该元素占用的若干(连续的)存储单元的第一个单元的地址。记做LOC(ai)
若假设每个数据元素占用k个存储单元,并且已知第一个元素的存储位置LOC(a1),则有LOC(ai) = LOC(a1)+(i−1)×k
在C语言中,顺序存储结构的定义如下:

#define MaxSize 100
ElemType A[MaxSize];
int n;

其中,MaxSize表示预先分配给线性表的空间大小,n表示表的长度。

基本操作

1、确定元素item在长度为n的线性表A中的位置

int LOCATE( ElemType A[], int n, ElemType item ){ 
   inti;
   for(i=0;i<n;i++)
       if (A[i]==item) 
           return i+1;           /* 查找成功,返回在表中位置*/
   return -1;                    /*查找失败,返回信息-1 */
 }

时间复杂度O(n)
2、在长度为n的线性表A的第i个位置上插入一个新的数据元素item
正常情况下需要做的工作:
(1)将第i个元素至第n个元素依次后移一个位置;
(2)将被插入元素插入表的第i个位置;
(3)修改表的长度(表长增1);
异常情况:
(1)是否表满?n=MaxSize;
(2)插入位置是否合适?正常位置:1≤i≤n+1)

int INSERTLIST(ElemType A[], int &n, int i, ElemType item ){
     int j;
     if (n == MaxSize ||  i<1 || i>n+1)   //判断空间满否、插入位置合适否
         return -1;                                  //插入失败
     for( j=n-1; j>=i-1; j--)
         A[j+1]=A[j];            /* 元素依次后移一个位置*/
     A[i-1]=item;              /*将item插入表的第i个位置*/
     n++;                         //线性表长度加1
     return 1;                   /* 插入成功*/
 }

该算法的时间复杂度是O(n)
3、删除长度为n的线性表A的第i个数据元素
正常情况下需要做的工作:
(1)将第i+1个元素至第n个元素依次前移一个位置;
(2)修改表的长度(表长减1)。
需要考虑的异常情况:
(1)是否表空?(n=0?)
(2)删除位置是否合适?(正常位置:1≤i≤n)

int DELETELIST( ElemType A[], int &n, int i ){
    int  j;
    if( i<1 || i>n )       //判断表空和位置是否合适
        retutn -1;
    for( j=i; j<n; j++ )
        A[j−1]=A[j];          /* 元素依次前移一个位置*/
    n--;                   //线性表长度减1
    return 1;                 /* 删除成功*/
}

该算法的时间复杂度为O(n)

线性表的顺序存储结构的特点

1、优点
(1)构造原理简单、直观,易理解。
(2)元素的存储地址可以通过一个简单的解析式计算出来(LOC(ai)=LOC(a1)+(i−1)×k)。是一种随机存储结构,存储速度快。
(3)由于只需存放数据元素本身的信息,而无其他空间开销,相对链式存储结构而言,存储空间开销小(仅此而已!)
2、缺点
(1)存储分配需要事先进行。
(2)需要一片地址连续的存储空间。
(3)基本操作(如插入、删除)的时间效率较低。

猜你喜欢

转载自blog.csdn.net/jiangguangchao/article/details/84302604