顺序表插入算法思路
- 如果插入位置不合理,抛出异常。
- 如果线性表的长度大于数组的长度,则抛出异常或者动态增加容量。
- 从最后一个元素遍历到第i个,然后将它们分别往后移动一个位置。
- 将要插入的元素插入i 处,表长加1.
举例:在食堂打饭的时候有个同学来插队,后面的同学需要往后移动一个位置。
实现代码:
// 初始条件,顺序线性表已经存在,1<= i <=ListLength( L )
// 操作结果:在L中第i个位置之前插入新的数据元 素e,L的长度加1 。
Status ListInsert( SqList * L, int i, ElemType e )
{
int k;
// 顺序线性表已经满
if (L->length == MAXSIZE)
return ERROR;
// 当i不在范围内时
if (i < 1 || i >L->length + 1)
return ERROR;
// 若插入数据位置不在表尾
if (i <= L->length)
{
/*将要插入位置后数据元素向后移动一位 */
for (k = L->length - 1; k >= i - 1; k--)
L->data[k + 1] = L->data[k];
}
/* 将新元素插入 */
L->data[i - 1] = e;
L->length++;
}
删除算法的思路
- 如果删除位置不合理,抛出异常;
- 取出删除元素;从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
- 表长减1
举例:在食堂打饭的时候有个同学来插队,后面的同学需要往后移动一个位置。
实现代码如下:
/* 初始条件:顺序线性表L已存在,1≤i≤ ListLength(L) */
/* - 操作结果:删除L的第i个数据元素,并用e返回 其值,L的长度减1 */
Status ListDelete(SqList *L, int i, ElemType *e)
{
int k;
/*线性表为空 */
if (L->length ==0)
return ERROR;
/* 删除位置不正确 */
if (i < 1 || i > L->length)
return ERROR;
*e = L->data[i - 1];
/* 如果删除不是最后位置 */
if (i < L->length)
{
for (k = i; k < L->length; k++)
L->data[k - 1] = L->data[k];
}
L->length--;
return OK;
}