标签:实现 alt length 排队 空间 存储 数据存储 顺序存储 计算机
说白了,线性表的顺序存储结构,就是线性表的数据元素的内存地址是连续的。可以用占座来比喻一下,就是占了一块地方的几个位置。多数的计算机语言中,一维数组的底层实现即是线性表的顺序存储结构。
由于地址是连续的,所以第一个数据元素的地址就是比较重要的了。
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef int ElemType; /* ElemType类型根据实际情况而定,这里设定为int */
typedef struct
{
ElemType data[MAXSIZE]; /* 数据存储数据元素,最大值为MAXSIZE */
int length; /* 线性表当前长度 */
}SqlList
用占位来比喻就是最开始来的人占用位置的个数。
随着线性表插入和删除操作的进行,这个量是变化的。
用占位的例子来比喻的话就是实际来的人的个数。
正如你占了10个位置,结果来了11个人,肯定是坐不下的。(此处不考虑特殊情况,不抬杠)
存储器中的每个存储单元都有自己的编号,这个编号称为地址。假设第一个元素的地址为LOC(a1),每个数据元素占用c个存储单元,那么可以得到如下两个公式:
通过上面的公式,可以随时计算出线性表任意位置的地址,需要的时间几乎是相同的。根据前面学习的算法知识可知,获取元素(查询)的时间性能为O[1]。
由于地址是连续的,所以要插入元素,则需要插入位置之后的每个元素均后移才能实现。同样的道理,删除元素则删除后,删除的数据元素后面的均需要向前移动。
1、如果插入位置不合理,抛出异常
2、如果线性表长度不足,抛出异常或动态增加容量
3、从最后一个元素开始向前遍历到第i个元素,分别将他们移动一个位置
4、将要插入元素填入位置i处
5、表长加1
/* 初始条件:顺序线性表L已存在,1<= i <=ListLength(L) */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(SqlList *L,int i,ElemType e)
{
int k;
if(L->length==MAXSIZE) /*顺序线性表已满*/
return ERROR;
if(i<1||i>L->length+1) /* 当i不在范围内 */
return ERROR;
if(i<=L->length) /*若插入数据位置不在表尾*/
{
for(k=L->length;k>i-1;k--) /* 将要插入位置后的数据元素后移一位 */
L->data[k+1]=Ldata[k];
}
L->data[i-1]=e; /* 将新元素插入*/
L->length++;
return OK;
}
删除元素的思路与插入类似。
先来看最好的情况,如果要插入到最后一个元素,此时时间复杂度为O[1],因为不需要移动元素,就如同排队时直接排在最后一样
最坏的情况呢,如果要插入到第一个位置,此时的时间复杂度为O[n]
平均情况呢,需要移动次数为(n-1)/2,所以时间复杂度还是O[n]。
(1)无需为表中元素之间的逻辑关系而增加额外的存储空间
(2)可以快速的存取表中任意位置的元素
(1)插入和删除操作需要移动大量元素
(2)当线性表长度变化较大时,难以确定存储空间的容量
(3)造成存储空间的碎片
路漫漫其修远兮,吾将上下而求索。。。
标签:实现 alt length 排队 空间 存储 数据存储 顺序存储 计算机
原文地址:https://www.cnblogs.com/caozz/p/linear_list.html