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);elseprintf("没有找到!\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);elseprintf("没有找到!\n");// 顺序表销毁SLDestroy(&sl);
}int main()
{SLTest02();return 0;
}
运行数据: