顺序表学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

顺序表各接口代码网址: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值