校尉羽书飞瀚海,顺序表中增删改(Pt.2)

简介: 正片开始👀头插操作👏继上一章内容,继续讲讲顺序表的基础操作。

正片开始👀

头插操作👏

继上一章内容,继续讲讲顺序表的基础操作。


和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没听说过哪个接口可以在数据前面开一片空间吧,那我们思路就只有一个了——挪数据。那应该从第一位开始挪吗?注意,这和 memcpy 函数机制是一样的,并不意味着后面数据一起挪动,也不会彼此独立,而是相互影响,挪动的数据会对后面数据进行覆盖。

image.png

那我们的逻辑就应该是从后往前挪,那我们就直接定一个下标,指向这段空间的最后一个位置即可,再利用香香 while 循环一手

void pushfront(st* s, type x)
{
  assert(s);
  int end = s->size - 1;
  while (end >= 0)
  {
    s->a[end + 1] = s->a[end];//将从后往前的数据都向后挪一位
    end--;
  }
  s->a[0] = x;
  s->size++;
}

我们的 end 下标不是指向 size ,而是size后面一位也就是我们初始的capacity,end = 0时处理的是第一位之后的数据,那么我们while循环时就应该循环到 end<0为止。挪完了就可以sei数据,最后不要忘了让size++。

结果如下:

image.png

我们如果对之前写尾插时的细节记得的话,我们是需要有扩容操作的,这么写过去写过来很难受啊,我们就直接做成接口直接调用岂不美哉?

void enough(st* s)
{
  if (s->size == s->capacity)
  {
    s->capacity *= 2;
    s->a = (type*)realloc(s->a, sizeof(type) * s->capacity);
    if (s->a == NULL)
    {
      printf("扩容失败\n");
      exit(0);
    }
  }
}

头删操作👏

一样的,在头删操作时不仅要像尾删一样置0,还得把数据挪回去,注意是从前往后挪,不然数据又会被覆盖,最后size–一下就搞定:

void popfront(st* s)
{
  assert(s);
  enough(s);
  int head = 0;
  while (head < s->size - 1)
  {
    s->a[head] = s->a[head + 1]; //从前往后的数据依次向前挪一位
    head++;
  }
  s->size--;
}

结果如下:

image.png

小小总结

综上所述,顺序表其实就是在数组的基础上保留了一个特性——数据是连续的,但又摆脱了数组固定大小的限制,他适应性超强,随插随删随改。


但是顺序表不是十全十美,我们数据量足够庞大,比如已有一万条数据的空间,我要插入一万零一条,增容就会增到两万,空间浪费率极高。另外,尾插尾删操作是很快的,直接放入拿走数据,这是顺序表最常见的操作,这是他的特长。


但是话说回来,头插头删也很快吗?显然不是,头插头删的时间复杂度是O(n), 代价全在数据挪动上,所以如果要想不挪动的话,就要涉及到链表的引入。但链表在二分查找,排序等方面都有致命缺陷,他不能随机访问,所以链表和顺序表是相辅相成的。

相关文章
|
存储 Kubernetes 网络协议
【K8S系列】深入解析有状态服务
【K8S系列】深入解析有状态服务
526 1
|
人工智能 自然语言处理 搜索推荐
AI原生企业级Agent构建平台具备哪些特性?一篇文章看明白
AI原生企业级Agent构建平台有哪些特性?澜码正式发布AskXBOT平台为业界揭晓答案。
1009 0
|
UED
在钉钉宜搭中,要实现单选关联选项设置与图文展示的关联
【10月更文挑战第5天】本文通过具体案例介绍如何在钉钉宜搭中实现单选字段与其他字段的联动功能。以旅行社旅游线路报名表单为例,详细说明了创建单选字段、图文展示字段及设置联动逻辑的具体步骤。通过简单的配置,实现了用户选择目的地后自动展示相关信息的效果,提升了用户体验和数据录入准确性。适用于希望通过低代码平台优化工作流程的企业。
900 6
|
11月前
|
消息中间件 运维 监控
从开源到创业:掌握 Websoft9 托管平台上的开源工具,就业到创业的路径
在云原生与低代码技术驱动下,开源工具已成为企业数字化转型的核心引擎。本文以Websoft9(集成200+开源应用)为案例,探讨从技术学习到商业实践的完整路径。内容分为四个阶段:技术筑基(场景化部署)、业务解构(需求洞察)、创业孵化(MVP构建与验证)及规模化扩张(架构升级与商业化)。通过低成本部署、数据驱动优化及生态共建,展示开源工具如何助力个体与团队实现能力跃迁和商业创新,证明开源是技术自由与商业加速的双重杠杆。
165 0
|
开发框架 小程序 测试技术
排队免单小程序开发模式案例
排队免单小程序通过线上排队系统,为用户提供便捷的免单机会。主要功能包括用户注册与登录、商家入驻与管理、排队系统、通知与提醒、活动记录与查询。技术实现涉及微信小程序原生开发框架、后端技术、API接口和第三方服务。开发过程还包括全面的测试与优化,确保稳定运行和良好体验。最后,通过提交审核、上线运营和推广策略,吸引更多用户和商家入驻。
|
人工智能
在stable diffussion中完美修复AI图片
无论您的提示和模型有多好,一次性获得完美图像的情况很少见。修复小缺陷的不可或缺的方法是图像修复(inpainting)
在stable diffussion中完美修复AI图片
|
前端开发 JavaScript
HTML情人节爱心代码
HTML情人节爱心代码
616 2
|
存储 人工智能 安全
区块链与元宇宙
**区块链与元宇宙相互促进:**区块链作为去中心化、安全的分布式账本,支撑元宇宙内虚拟资产交易与智能合约执行,确保经济系统的透明度。元宇宙则为区块链技术提供应用舞台,推动其在虚拟世界中的创新与融合,共同塑造未来数字经济的基石。
|
存储 缓存 安全
阿里云服务器通用型g7、通用型g8a、通用型g8i实例区别及选择参考
阿里云服务器通用型g7、通用型g8a、通用型g8i是目前阿里云的活动中可选的通用型实例规格,他们都同属于通用型实例,但是通用型g7属于第七代云服务器,而通用型g8a、通用型g8i属于第八代云服务器,是最新一代的云服务器实例。那么它们之间具体有哪些区别呢?作为用户的我们应该如何选择呢?
1182 0
阿里云服务器通用型g7、通用型g8a、通用型g8i实例区别及选择参考
|
机器学习/深度学习 自然语言处理 数据挖掘
huggingface.transformers任务简介
本部分介绍了一些常见NLP任务使用transformers包的解决方案。本文使用的AutoModel具体内容可以参阅其文档,也可以参考我此前的撰写的transformers包文档笔记,我介绍了一些相关的用法和示例代码。
huggingface.transformers任务简介