前言
接上文(线性表与顺序存储结构(上))。
这些顺序存储结构的方法在顺序表上下卷中已经提到过,但是有些许不同,可以为理解顺序表提供更丰富的视角。(不过最主要的区别在于顺序表上下卷中的顺序表是动态开辟的而这里底层的是定长数组。)
正文
顺序存储结构的插入与删除
获得元素操作
对于线性表的顺序存储结构而言,要实现GetElem操作,即将线性表L中的第i个元素值返回,只要i的数值在数组下标范围内,把数组第i-1下标的值返回即可:
#define OK 1
#define ERROR 0
typedef int Status;//Status是函数的返回值类型,其值是函数执行状态代码,如OK等
//初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
//操作结果:用e返回L中第i个数据元素的值,注意i指的不是下标
Status GetElem(SqList L, int i, ElemType* e)//假设已有结构体类型SqList,元素类型ElemType
{
if (L.length == 0 || i<1 || i>L.length)//无法成功获取的各种情况
{
return ERROR;//获取失败
}
*e = L.data[i - 1];//得到元素值
return OK;//获取成功
}
注意
我们真正返回的数据其实是*e,而return的不过是函数处理的状态,返回值类型Status是一个整型,返回OK即1,ERROR即0。
插入操作
在上篇文章中我们提到的ListInsert(*L,i,e),即在线性表L中的第i个位置插入新元素e,应该如何实现呢?
这有点像插队,在某个位置插入数据,那么这个位置及之后的数据都得往后移动一位。
现在我们更具体和全面地来梳理一下插入算法的思路:
1.如果插入位置不合理,抛出异常;
2.如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;
3.从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;
4.插入数据
5.表长加1(记录当前长度的变量+1)
代码参考:
删除操作
思路:
1.如果删除位置不合理,抛出异常;
2.取出删除元素;
3.从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;(注意与插入操作区分开来)
4.表长减1
代码参考:
本文到此结束,祝阅读愉快^_^