提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本篇是对上篇顺序表结构的构建的补充!!!
一、在指定位置前插入数据
前面我们讲了前删和尾删,如果我们想实现指定位置数据的删除该如何做呢?
基本思路:
- 构建函数,函数的参数包括顺序表的结构体指针(用来查找数据),指定位置,要插入的数据
- 要实现上述的功能,要对相应的参数进行诊断,防止出错
- 最后理清插入数据后,其他数据的位置变化
注意:别忘记size的大小变化
//在指定位置前插入数据
void SLIninsert(SL* ps, int pos, SQL x)//引入插入数据的位置
{
assert(ps);
assert(pos >= 0 && pos <= ps->size);//pos指的是对应的下标
//注意从前面插入,数据要从前往后移动
SLCheckCapacity(ps);//首先要判断一下内存够不够
for (int i = ps->size; i >= pos+1; i--)
ps->arr[i] = ps->arr[i-1];//arr[pos+1]=arr[pos]
ps->arr[pos] = x;
ps->size++;
}
如图,从pos前插入数据,其他的数据都要往后移动,但是只能从后面的数据开始往后移,否则前面的数据会覆盖后面的数据
二、在指定位置处删除数据
基本思路:在指定位置删除数据,我们只需要找到顺序表中对应的数据删除即可,然后其他数据向前移动
//删除指定位置的数据
void SLErase(SL* ps, int pos)
{
assert(ps);
assert(pos >= 0 && pos < ps-> size);//注意要用指针找到数据表中的元素
for (int i = pos; i < ps->size - 1; i++)//注意这里删除时数据的移动要从前往后移
{
ps->arr[i] = ps->arr[i+1];
}
ps->size--;//记得最后将数据个数--
};
注意:此时size的下标位置处是不存在数据的,所以pos不能==ps->size
我们可以通过最后一次的交换下标确定循环的结束条件,也就是i的取值
如图,所有元素向前移动,只能先将前面的数往前移
三、查找到指定的元素
查找元素的思想非常简单,就是利用循环遍历数组即可,然后将元素下标返回
int SLFind(SL* ps, SQL x)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
if (ps->arr[i] == x)
{
return i;
}
}
return -1;//返回一个无效的值
};
然后我们就可以在测试函数中判断是否找到了指定的元素
总结
以上就是有关顺序表查找删除的所有内容,实现顺序表的构建其实非常简单,大家从这几个方面理解原理即可