线性表的顺序存储结构
构造原理
用一组地址连续的存储单元依次存储线性表的数据元素,数据元素之间的逻辑关系通过数据元素的存储位置直接反映。
记做 ( 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)基本操作(如插入、删除)的时间效率较低。