顺序表中的尾插中细节的思考与其头插一样,要考虑顺序表容量问题,因此仍需要检查其容量的函数来判断其容量大小是否足够
//扩容
void SeqListCheckCapacity(SL* L)
{
//没有空间或空间不足 --> 我们就扩容
if (L->size == L->capacity)
{
int newcapacity = L->capacity == 0 ? 4 : L->capacity * 2; //三维运算符 一下扩二倍空间(最适合)
SLDateType* tmp = (SLDateType*)realloc(L->a, newcapacity * sizeof(SLDateType));
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1); //结束程序-->异常退出程序
}
L->a = tmp;
L->capacity = newcapacity;
}
}
顺序表的尾插相对头插要简单,只需要管其最后一个数据,不需要挪动其他数据,但仍需记得要改变size的值
//尾部插入
void SeqListPushBack(SL* L, SLDateType x)
{
// 检查增容
SeqListCheckCapacity(L);
//空间足够
L->a[L->size] = x;
L->size ++;
}
顺序表的尾删也更简单(相比于头删),只需要改变size的值,便达成了尾删
尾删仍需考虑越界问题,一下展示出两种方法判断是否越界
温柔的if判断和暴力的assert判断
对于assert--->需要头文件#include<assert.h> ,条件为真,没事;条件为假,终止程序。
//尾部删除
void SeqListPopBack(SL* L) //需要考虑有无越界的情况
{
//温柔的处理方式
//if (L->size > 0)
//{
// L->size--;
//}
//暴力的处理方式
assert(L->size > 0);
L->size--;
}