一、扩容
若容量已满,则使用realloc()函数进行扩容,每次将空间扩大为2倍。
SeqList.h
void SLCheckCapacity(SL* p);
SeqList.c
void SLCheckCapacity(SL* ps)
{
//判断扩容
if (ps->size == ps->capacity)
{
SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2 * (sizeof(SLDataType)));
if (tmp == NULL)
{
perror("realloc failed");
exit(-1);
}
ps->a = tmp;
ps->capacity *= 2;//对后续判断扩容,起计数的作用。
}
}
realloc函数:
用于重新分配之前通过malloc
、calloc
或realloc
分配的内存块的大小。
原型:void *realloc(void *ptr, size_t size);
参数
ptr
是一个指向之前分配的内存块的指针,size
是新的内存块的大小。realloc
函数会尝试将之前分配的内存块的大小调整为size
,并返回一个指向新分配的内存块的指针。
使用:
- 如果
ptr
是NULL
,则realloc
的行为等同于malloc(size)
,即分配一个新的内存块。- 如果
size
为0,且ptr
不是NULL
,则realloc
的行为等同于free(ptr)
,即释放之前分配的内存块。- 如果
ptr
不是NULL
,且size
不为0,realloc
会尝试将之前分配的内存块的大小调整为size
。如果调整成功,则返回一个指向新分配的内存块的指针;如果调整失败,则返回NULL
,并且之前分配的内存块仍然有效。
原地扩容与异地扩容:
二、尾插
尾插操作即在顺序表的末尾插入一个新的元素。首先需要判断顺序表是否已满,如果已满则无法插入新元素(需进行扩容);如果未满,则将新元素插入到数组的末尾。
SeqList.h
void SLPushBack(SL* p, SLDataType x);
SeqList.c
void SLPushBack(SL* ps, SLDataType x)
{
SLCheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;
}
test.c
void TestSeqList1()
{
SL sl;
SLInit(&sl);
SLPrintf(&sl);
SLPushBack(&sl, 0);
SLPushBack(&sl, 1);
SLPushBack(&sl, 2);
SLPushBack(&sl, 3);
SLPushBack(&sl, 4);
SLPushBack(&sl, 5);
SLPushBack(&sl, 6);
SLPushBack(&sl, 7);
SLPushBack(&sl, 8);
SLPushBack(&sl, 9);
SLPrintf(&sl);
}