2.9 在指定位置之前插入数据
// 在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x);
步骤:
① 程序开始前,我们要断言一下,确保指针是有效的,不是NULL;
② 我们还要断言一下,指定的位置下标 pos 得有效;
③ 下标 0~ps->size 都是有效的;
④ 检查内存是否足够;
⑤ 插入数据之前,得把pos位置及之后的位置的数据往后挪动一位;
⑥ 最后把数据 x 插入到 pos 下标,插完之后,数组元素总个数 ps->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]; // 最后一次:arr[pos + 1] = arr[pos]
}
ps->arr[pos] = x; // 插入数据
ps->size++;
}
测试程序:第一步测试头插
void SLTest02()
{
SL sl;
SLInit(&sl);
// 尾插4个数据
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPrint(sl);
// 测试指定位置之前插入数据
// 头插
SLInsert(&sl, 0, 66);
SLPrint(sl);
// 顺序表销毁
SLDestroy(&sl);
}
int main()
{
SLTest02();
return 0;
}
运行结果:
测试程序:第二步测试尾插
void SLTest02()
{
SL sl;
SLInit(&sl);
// 尾插4个数据
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPrint(sl);
// 测试指定位置之前插入数据
// 尾插
SLInsert(&sl, sl.size, 1000);
SLPrint(sl);
// 顺序表销毁
SLDestroy(&sl);
}
int main()
{
SLTest02();
return 0;
}
运行结果:
测试程序:第三步测试指定位置插入
void SLTest02()
{
SL sl;
SLInit(&sl);
// 尾插4个数据
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPrint(sl);
// 测试指定位置之前插入数据
SLInsert(&sl, 2, 6);
SLPrint(sl);
// 顺序表销毁
SLDestroy(&sl);
}
int main()
{
SLTest02();
return 0;
}
运行结果:
2.10 删除指定位置的数据
// 删除指定位置的数据
void SLErase(SL* ps, int pos);
步骤:
① 程序开始前,我们要断言一下,确保指针是有效的,不是NULL;
② 我们还要断言一下,指定的位置下标 pos 得有效;
③ 下标 0~ps->size - 1 都是有效的;
④ 然后把 pos 位置之后的数据往前挪动一位
⑤ 最后数组元素总个数 ps->size 得减1。
// 删除指定位置的数据
void SLErase(SL* ps, int pos)
{
assert(ps);
assert(pos >= 0 && pos < ps->size);
// 让pos位置之后的数据往前挪动一位
for (int i = pos; i < ps->size - 1; i++)
{
ps->arr[i] = ps->arr[i + 1]; // 最后一次:arr[size - 2] = arr[size - 1]
}
ps->size--;
}
测试程序:第一步测试头删
void SLTest02()
{
SL sl;
SLInit(&sl);
// 尾插4个数据
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPrint(sl);
// 删除指定位置的数据
// 测试头删
SLErase(&sl, 0);
SLPrint(sl); // 2 3 4
// 顺序表销毁
SLDestroy(&sl);
}
int main()
{
SLTest02();
return 0;
}
运行结果:
测试程序:第二步测试尾删
void SLTest02()
{
SL sl;
SLInit(&sl);
// 尾插4个数据
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPrint(sl);
// 测试尾删
SLErase(&sl, sl.size - 1);
SLPrint(sl); // 1 2 3
// 顺序表销毁
SLDestroy(&sl);
}
int main()
{
SLTest02();
return 0;
}
运行结果:
测试程序:第三步测试指定位置删除
void SLTest02()
{
SL sl;
SLInit(&sl);
// 尾插4个数据
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPrint(sl);
// 删除指定位置的数据
// 测试删除指定位置的数据
SLErase(&sl, 2);
SLPrint(sl); // 1 2 4
// 顺序表销毁
SLDestroy(&sl);
}
int main()
{
SLTest02();
return 0;
}
运行结果:
2.11 顺序表查找数据
// 顺序表的查找
int SLFind(SL* ps, SLDataType x);
步骤:
① 程序开始前,我们要断言一下,确保指针是有效的,不是NULL;
② 遍历数组,找到了 x,就返回对应的下标;没有找到就返回 -1。
// 顺序表的查找
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;
}
测试程序:能找到数据
void SLTest02()
{
SL sl;
SLInit(&sl);
// 尾插4个数据
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPrint(sl);
// 测试顺序表的查找
int find = SLFind(&sl, 4);
if (find >= 0)
printf("找到了,下标为:%d", find);
else
printf("没有找到!\n");
// 顺序表销毁
SLDestroy(&sl);
}
int main()
{
SLTest02();
return 0;
}
运行结果:
测试程序:找不到数据
void SLTest02()
{
SL sl;
SLInit(&sl);
// 尾插4个数据
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPrint(sl);
// 测试顺序表的查找
int find = SLFind(&sl, 5);
if (find >= 0)
printf("找到了,下标为:%d", find);
else
printf("没有找到!\n");
// 顺序表销毁
SLDestroy(&sl);
}
int main()
{
SLTest02();
return 0;
}
运行数据: