前言
上一节我们讲解了顺序表的原理以及它最基本功能的实现,那么本节我们书接上文,继续的往后学习,更加深入的了解顺序表(没有看过我写的顺序表1的小伙伴麻烦点击我的主页去看1)
在顺序表的指定位置插入数据
首先,我们首先需要确定这个函数需要什么参数,ps指针肯定是不可或缺的,然后我们需要一个变量去存入我们想要插入数据的位置,我们将其命名为pos;最后我们需要一个类型为 SLDataType 的变量 x ,我们在 x 变量中存入要插入的数据
在开始插入之前我们需要判断一下,ps指针一定不能是空指针;还有插入数据的位置 pos 必须是一个大于 0 的数,而且 pos 要小于有效空间 size
到这里我们就可以写出代码如下:
//在指定位置前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
}
在正式的代码开始编写前,我们先来理一下这个代码的基本逻辑:
举个例子:
若数组中的空间为 6 ,数组中的有效空间个数为 4 ,我们需要在下标为 3 的地方插入 x = 6
0 | 1 | 2 | 3 |
0 1 2 3 4 5
pos size
要想在 pos 前插入一个数据,那么 pos 及其以后的数据需要整体向后挪动一位,此时 pos 位置空出来了,我们需要在 pos 的位置插入数据 x = 6,同时我们要把 size 的值+1,我们并不需要遍历数组中的全部元素
我们此时就可以开始代码的编写了:
//在指定位置前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
SLCheckCapacity(ps);
//pos后数据整体后挪
for (int i = ps->size; i > pos; i--)
{
ps->arr[i] = ps->arr[i - 1];
}
ps->arr[pos] = x;
ps->size++;
}
我们来编写一下测试代码,检查一下代码的运行是否成功
我们设插入数据为 6 ,插入到下标为 3 的位置:
void SLTest02()
{
SL s1;
SLInit(&s1);
测试尾插代码
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPushBack(&s1, 4);
SLPrint(s1);
//测试指定位置前插入
SLInsert(&s1, 3, 6);
SLPrint(s1);
SLDestory;
}
int main()
{
SLTest02();
return 0;
}
运行没有错误,我们在顺序表指定位置前插入数据的代码编写成功
在顺序表的指定位置删除数据
在删除前。我们同样需要对 ps 和 pos进行判断,判断的方法与插入数据相同
我们假设数组的 size 大小为 5,数组里的有效空间为 6 ,我们需要删除的数据下标为 3
0 | 1 | 2 | 3 | 4 |
0 1 2 3 4 5
pos size
在删除后,我们需要把 pos 后面的数据整体向前挪动一位,同时需要把 size--
//删除指定位置的数据
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--;
}
代码写完后,我们再次进行测试;若原数组里面有4个元素。分别为1、2、3、4,我此时需要删除数据 4 ,他的下标为 3
void SLTest02()
{
SL s1;
SLInit(&s1);
测试尾插代码
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPushBack(&s1, 4);
SLPrint(s1);
//测试删除指定位置数据
SLErase(&s1, 3);
SLPrint(s1);
SLDestory;
}
int main()
{
SLTest02();
return 0;
}
我们可以看到,代码的实现相当完美,这样我们就顺利的完成了删除指定位置的数据的任务
顺序表的查找
我们在编写顺序表的查找前。首先需要明确查找需要用到的参数:
ps 指针肯定是必不可少的,然后我们需要一个变量为 x ,里面存的是想要查找到的数据
int SLFind(SL* ps, SLDataType x);
查找的逻辑非常简单,我们可以很快速的写出代码:
//顺序表的查找
int SLFind(SL* ps, SLDataType x)
{
assert(ps);
for (int i = 0; i < ps->size; i++)
{
if (ps->arr[i] == x)
{
//此时已经找到了
return i;
}
}
//没有找到
return -1;
}
我们在来测试一下我们写的代码:设数组里面有 1、2、3 三个元素,我们要查找出元素 1 在数组中的下标是多少
void SLTest02()
{
SL s1;
SLInit(&s1);
测试尾插代码
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPushBack(&s1, 4);
SLPrint(s1);
//测试删除指定位置数据
SLErase(&s1, 3);
//查找数组中的元素1的下标
SLPrint(s1);
int find = SLFind(&s1, 1);
if (find < 0)
{
printf("没有找到\n");
}
else
{
printf("找到了,下表为%d\n", find);
}
SLDestory;
}
int main()
{
SLTest02();
return 0;
}
倘若我们需要找数据 8 ,因为此时数组里面没有数据为 8 的元素,若代码编写成功,将会提示出找不到数据的信息:
我们来修改一下代码:
void SLTest02()
{
SL s1;
SLInit(&s1);
测试尾插代码
SLPushBack(&s1, 1);
SLPushBack(&s1, 2);
SLPushBack(&s1, 3);
SLPushBack(&s1, 4);
SLPrint(s1);
//测试删除指定位置数据
SLErase(&s1, 3);
//查找数组中的元素1的下标
SLPrint(s1);
int find = SLFind(&s1, 8);
if (find < 0)
{
printf("没有找到\n");
}
else
{
printf("找到了,下表为%d\n", find);
}
SLDestory;
}
int main()
{
SLTest02();
return 0;
}
代码完美运行,我们关于顺序表的查找功能编写也就到此结束了
结尾
关于顺序表的实现的内容到这里就全部结束了,下一节将为大家带来顺序表的应用--通讯录的编写,谢谢大家的浏览