从时间的角度考虑,在按位置查找数据,或在查找元素的前驱和后继等方面,顺序存储有着较大的优势。在插入数据,删除数据时,链式存储就有较大优势,这是由于在链表中只要修改指针即可实现这些操作;而在顺序表中进行插入和删除,平均要移动表中将近一半的数据元素。
从空间的角度考虑,顺序表的存储空间是静态分配的,在程序执行之前必须规定其存储规模。而动态链表的存储空间是动态分配的,只要内存空间有空闲,就不会产生溢出。
顺序表的插入,删除操作:
在顺序表第i个元素前插入结点,需要把i到n的所有元素都向后移动一位,最后把新元素插入到第i个位置。需要注意的是,在进行移动的时候,必须是从n到i依次向后移动,如果从i到n依次向后移动,则最后i+1到n+1个位置的所有元素的值都是一样的,即原来第i个元素的值
删除第i个元素时,需要将i+1到n的所有元素依次向前移动。移动顺序与插入相反,是从前向后进行,即从i到n依次向前移动一个位置。
顺序表中查找元素,获取表长非常容易,但是要插入或删除一个元素却需要移动大量元素;相反链表中却可以方便地插入或者删除元素,但在查找元素时需要进行遍历。因此,当所涉及的问题常常需要进行查找等操作,而插入,删除操作相对较少的时候,适合采用顺序表;当常常需要进行插入,删除操作的时候,适合采用链表
顺序表的插入参考程序:
insertlist(v,n,i,x)/*插入前:v[1]~v[n]*/
int n,i;
float x,v[];
{
if (i<1)||(i>n+1)printf("error");
else
for(j=n;j>=i;j--)(从最后一个元素开始移动)
v[j+1]=v[j];
v[i]=x;n++;/*i=n+1补在最后*/(总的元素个数多一个)
}
顺序表的删除参考程序:
deletelist(v,n,i)/*删除前:v[1]~v[n],删除第i(1~n)个*、
int n,i;
/*v任一类型的数组*/
{……
if (i>n)||(i<1)printf("no this end');
else {
for (j=i;j<=n-1;j++)(从第一个元素开始移动)
v[j]=v[j+1];
}
n--;(总的元素个数少一个)
}
顺序存储:假设表中的每个结点占有相同的存储空间,如一个存储单元,则第i个元素ai的地址为:
LOC(ai)=LOC(a1)+(i-1)*1
顺序表插入和删除一个元素算法的时间复杂度为:O(n)