目录
2.3 四种简单函数:销毁函数Destroy,清空函数Clear,求长度函数length,判断是否为空函数Isempty
1. 预定义常量与类型
2. 函数定义
2.1 函数目录
2.2 初始化函数init
1.定义时使用&L,会直接创建一个L
2.new成功,返回的是一片区域的首指针;失败返回的是null
所以if判断中(!L.elem),如果new分配成功,则括号内等于非;分配失败则括号内等于
(!null=true),随后exit-2跳出
2.3 四种简单函数:销毁函数Destroy,清空函数Clear,求长度函数length,判断是否为空函数Isempty
由于是new出的空间,可以使用delete释放
2.4 取值函数GetElem
注意:第n位的实际下标是n-1
所有操作只执行一次,算法时间复杂度为常量级O(1)
2.5 查找函数LocateElem
注意:返回的是序号,所以elem[i]满足应返回 i+1.
使用while语句的改写方法:
while(L.elem[i]!=e && i<L.length) i++;
if (i<L.length)
return i+1;
else
return False;
ASL: Average Search Length
平均搜索长度,可理解为数学期望
2.6 插入函数ListInsert
思路
开始编程
异常情况1:插入位置不对
假设有n个元素,原数组为a[n-1], 则合理的插入位置为a[0]~a[n],即第1位到n+1位
Status ListInsert_sq(SqList &L, int i, Elemtype e){
if(i<1||i>L.length+1)
return ERROR;
异常情况2:数组的存储空间已经放满了。
假设有n个元素,合理的元素数量应小于数组长度
if(L.length == MAXSIZE)
return ERROR;
从最后一位开始,从后往前将每一位后移:
for(j = L.length-1; j>=i-1; j--)
L.elem[j+1] = L.elem[j];
将新元素e放入i-1号位,数组长度+1:
L.elem[i-1] = e;
L.length ++;
return OK;}
时间复杂度分析 (平均时间复杂度)
老师版本
元素可插入的位置为第1位~第n+1位,每个位置的可能性为 。依次乘以每个位置所需的移动次数x, (共n+1位)可得,于是:
*图中老师画圈部分为Pi,横线部分为每项所需移动次数xi。是典型的数学期望计算式。
我的版本
最好的情况,插入在最后,共需移动0次;最差的情况,插入在最首,共需移动n次。
插入每个位置的几率相等,且对应移动次数为等差数列。所以数学期望为 .
时间复杂度为 级。
2.7 删除函数ListDelete
思路
本例中,第二步省略
程序示例
*注意:删除第i个,其实是删除数组中的a[i-1]。应从a[i-1]开始继承直接后继的值。
时间复杂度分析(平均时间复杂度)
元素可插入的位置为第1位~第n位,每个位置的可能性为 。依次乘以每个位置所需的移动次数。于是:
思路二:最好的情况,删除在最后,共需移动0次;最差的情况,删除在最首,共需移动n-1次。删除每个位置的几率相等,且对应移动次数为等差数列。所以数学期望为 。
时间复杂度为 级。
3. 顺序表的优缺点
优点
随机存取:可以任意存取值,每次只进行一次计算,时间复杂度为常量级。
缺点
1)插入,删除时,需要大量的移动操作
2)为了能有空间存下所有元素,我们一般定义数组时会给足空间。然而,当元素特别少时,就会浪费大量存储空间。