提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
顺序表各接口代码网址:https://gitee.com/zfranklin/seq-list_byhand
提示:以下是本篇文章正文内容,下面案例可供参考
一、使用未初始化的指针变量
当我构建好顺序表结构体SL后,准备将一个顺序表变量初始化。
SL* sl;
报错显示:使用未初始化的指针变量。
指针变量初始化要指向一片确切的空间或者NULL。
如果这里指向NULL,就和顺序表销毁后的地址一样,与后续调用接口函数assert()冲突。
如果malloc一片空间,由于顺序表里的元素在变化,增添元素可能会超过给出的空间
干脆初始化结构体变量,函数传参再传&sl。
SL st;
SLInit(&st);
二、容量
在插入数据时,要考虑容量是否足够,此时会有两种情况:1、ps->capacity == ps->size == 0。2、ps->capacity == ps->size != 0。为了保证一定程度的效率,我们把newCapacity设置为原容量的1.5倍,如果原容量是零,则需单独开若干个空间,否则0 * 1.5 为0。
if (ps->size == ps->capacity)
{
int newCapacity = ps->size == 0 ? 4 : ps->capacity * 1.5;
...
}
三、realloc开辟新空间
当容量增加,我们要realloc开辟新空间,应先定义中间变量将新空间地址保存,防止旧空间因开辟失败而丢失
SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newCapacity);
if (tmp == NULL)
{
printf("realloc failed\n");
exit(-1);
}
ps->a = tmp;
四、下标确定
顺序表支持随机访问(下标访问),我们要明确需要增删查改的下标数。例如PushBack后插函数里面,已有ps->size个数据,但是下标从0开始,所以第ps->size个数据(最后一个数据)下标为ps->size-1。插入新数据的下标为ps->size。
ps->a[ps->size] = x;
ps->size++;
在PushFront函数里,需要注意的下标则是位移下标,我们需要将尾下标的数据移到下一位,再将尾前一个数据移至尾,不妨设当前尾的下标为 int end = ps->size-1,直到end == 0。
五、是否有数据可以删除
在PopBack 和PopFront 函数和Push相对应的,应该检查容量是否有剩余
assert(ps->size);
六、缩容
除此之外为保证空间的合理利用,当大量数据被删除时,应该缩小ps->a指向的空间大小
void FreeCapacity(SL* ps)
{
int newCapacity = ps->capacity * 0.67;
if (ps->size <= newCapacity)
{
SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * newCapacity);
if (tmp == NULL)
{
printf("realloc failed\n");
exit(-1);
}
ps->a = tmp;
ps->capacity = newCapacity;
}
}
我的学习模板并没有缩容这一步,可能是考虑到异地缩容需要消耗时间性能。下面是另外一篇关于realloc的文章摘取:
1)关于缩容的问题
如果我们realloc的新的内存块的大小<比之前动态内存malloc的大小,可不可以做到缩容来节省空间呢?
它有可能会原地缩容,也有可能会异地缩容。但我们一般不考虑缩容的问题,因为如果系统是异地缩容,它需要找一块空间,把原数据考虑过来,然后再把原空间释放,这样会有性能,时间上的代价。而且如果我们之后又要插入数据,那我们又要进行扩容。
总结一下来说:
缩容:以时间换空间
不缩容:以空间换时间
六、任意位置增删查
想要实现任意位置的增删,则需要该位置的下标。我们也不能乱改,而是先用SLFind函数获取某个具体数值的位置pos。遍历整个顺序表,返回指定数据的下标。若无该数值,返回NoData = -1。在SLInsert和SLErase函数里由于查找的值并不存在于原顺序表中,要断言pos>=0,即不为-1。以及SLInsert的pos要<= ps->size,SLErase的值要<= ps->size-1。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_63449996/article/details/124363899