链表和线性表的优缺点

作为我们最先接触的两个数据结构,链表和线性表的优缺点都较为明显,并且二者互相补足

文章目录

  • 链表和线性表的优缺点
  • 线性表
    • 线性表的组成
    • 线性表的缺点
    • 线性表的优点
  • 链表
    • 链表的组成
    • 链表的优点
    • 链表的缺点
  • 总结

线性表

线性表的组成

首先,我们来谈谈线性表SeqList
线性表 (linear list) 是 数据结构 的一种,一个线性表是n个具有相同特性的数据元素的有限序列。类似于数组,其本质是一块连续的地址空间

图片来自百度

因为其内容包含多个变量,所以C语言使用结构体来构造
共三个变量:
1.所存储数据类型的指针,用来接收之后malloc,动态开辟的空间
2.Size,表示当前线性表所存储元素个数
3.Capacity,表示当前线性表所能存储的最大元素个数

详细的实现这里就不赘述了

接下来是就来讲解线性表的缺点

线性表的缺点

如线性表的本质所表现的,线性表是一块连续的空间,如同数组一样,我们需要手动开辟,而且需要指定大小的开辟。
那么就出现第一个问题,开辟多大的空间呢?
这只是问题的表层,很多人也知道,即使我们开辟的过大,过小,我们都可以通过realloc,重新开辟空间,并且realloc可以帮我们copy原先的数据.
但这又有个问题,realloc多大呢,我们总不能插入一个数据,就重新realloc一块比原先空间多一的空间吧?比较适合的扩大数目是—原先的两倍。
但这样也会在后来造成内存浪费,比如我要存130,原先100,那就要realloc200的空间,70个空间将造成浪费
所以,线性表的第一个缺点:容易造成空间浪费
PS:realloc会考察原先空间后是否有足够的空间,若有,是原地扩容。
若没有足够空间,则会在别处申请一块空间,并拷贝原先的值
第二个缺点:头部中间插入和删除效率低
当我们要在线性表的头部或中间插入和删除元素时,我们需要将位置后的元素,往后移动,这就导致效率低

但是,线性表也并不是一无是处

线性表的优点

同样,因为线性表的本质,是一块连续的空间
线性表可以通过下标访问元素,很多算法是需要兼容这一点的,比如快排和二分查找

链表

链表和线性表有很大不同
最明显的还是数据的存储,链表并不是连续的地址空间,他是无序的,散的,但这并不违反其线性结构,因为其组成有指针指向当前链表的下一个节点,实现数据的线性联系

链表的组成

链表内部主要有三大区分
循环 非循环
带哨兵卫的头 不带头
单向 双向

因此,链表有八种类型
其中单向,不带头,非循环链表是oj题最常见的,因为其结构简单,功能少,所以相应的题考验学生的思维能力。
而双向,带头,循环链表是结构最复杂,全面的链表,所以其功能较为强大
此处举例双向,带头,循环链表

图片来自百度

链表的优点

任意位置插入删除效率高
因为链表并不是连续的空间,插入和删除只要对指定位置的前后做操作就好
并且通过封装的FindList函数,O(N)的查找,再在指定位置插入删除O(N)即可
按需申请释放空间
每一次的插入删除,只需要申请一块空间即可,和原本的空间没有影响
实际操作,链表会更为的舒服

但链表的缺点也很明显

链表的缺点

不支持随机访问。(用下标访问)
意味着,一些排序,二分查找,等算法在这种结构不适用

总结

大致的线性表和链表的总结就到这。
一句话,数据结构是数据存储,应用的框架,容器。
具体使用要依情况而定

文章如果有不对或者不足的地方,欢迎大佬们指正,补充。感谢大家的阅读,如果感觉博主写的还可以,麻烦点个赞支持一下,阿里嘎多。拜托了,这对我真的很重要~

链表和线性表的优缺点相关推荐

  1. 单链表(线性表的链式存储)---C语言版

    目录 单链表(线性表的链式存储)---C语言版 一.相关说明 二.单链表的定义 三.单链表上具体操作的实现和时间复杂度 1.初始化表.构造一个空表. 2.根据数组创建单链表 3.求表长 4.插入操作. ...

  2. 双链表(线性表的链式存储)---C语言版

    目录 双链表(线性表的链式存储)---C语言版 一.双链表的定义 二.双链表上具体操作的实现和时间复杂度 1.初始化表.构造一个空表. 2.根据数组创建双链表(头插法和尾插法) 3.插入操作.在表L中 ...

  3. 【C数据结构】单链表的实现以及链表和顺序表的优缺点

    文章目录 一.链表和顺序表的相辅相成 二.认识链表的最简单结构(单链表) 1.单链表的结构: 2.单链表的简单操作实现: (1).提前准备(头文件和测试源文件) (2).单链表的头插.尾插与创建一个新 ...

  4. 线性表对于什么时候选用顺序表?什么时候选用链表作为线性表的存储结构为宜?

    在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有一下几方面的考虑: 基于空间的考虑.当要求存储的线性表长度变化不大,易于实现确定其大小时,为了节约存储空间,宜采用 ...

  5. 其他类型的链表和线性表的总结(一级)

    现在我们来看其他的链表单链表每个节点包括两个部分,一部分包括数据,另一部分保存下一个节点的地址,根据这个指针我们就可以依次找到下一个节点这是单链表,但是他有一个缺点,只能通过前驱节点找到后继节点,a1 ...

  6. 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

    线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...

  7. python的线性链表_Python线性表——单链表-阿里云开发者社区

    Python线性表--单链表 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继, ...

  8. 线性单链表存储结构c语言代码,单链表定义-(线性表的链表存储结构)

    线性表分为:顺序存储结构和连存储结构 顺序存储结构的优点: 1.空间利用率高,几乎不需要额外的空间开销. 2.数据的逻辑结构和物理结构完全一致. 3.结点地址计算的时间和线性表的规模大小无关. 4.可 ...

  9. 遗落在时光里的静态链表(线性表的静态存储)---C语言版

    目录 静态链表的定义 静态链表的操作 初始化 求表长 分配空间 回收空间 插入操作 删除操作 其他操作 完整源代码 总结一下 众所周知,指针是c语言的灵魂,指针使得链表的实现简单明了起来. 但是问题来 ...

最新文章

  1. 链表数据结构原理图/内存结构图/内存图
  2. 【Linux系统编程学习】 GDB调试器的简单使用
  3. k8s容器内的东西复制出来_容器 | Docker 如此之好,你为什么还要用k8s
  4. 从零开始打造数据中心的N道门槛 | 又拍干货分享
  5. System Explorer 2.0.4.2492 好用的系统管理器
  6. ELK中Kibana6.2.3下Timelion使用
  7. python eval函数_Python基础元素语法总结
  8. Spark内核解析之五:Spark Shuffle解析
  9. sql2005数据库置疑修复断电崩溃索引损坏
  10. mysql 拼接字符串查询
  11. oracle jdbc流式读取,在 Oracle Database 适配器中流式传输大型对象数据类型 - BizTalk Server | Microsoft Docs...
  12. 寂寞的季节C调吉他谱 - 陶喆
  13. 码破苍穹:空指针的传说
  14. 分享五个绝对称得上妖艳古怪精灵的前端代码效果
  15. windows使用docker-compose安装PHP框架hyperf
  16. transition transform属性造成文字抖动及模糊的解决方法
  17. mybatis-plus 属性为空时判断问题
  18. HTML canvas 输入文字,关于Canvas写字
  19. 前端开发系列(十六)网页布局教程(2)
  20. Imperva WAF 添加黑名单

热门文章

  1. php下单声音提醒,拼多多商家怎么设置下单的声音?开启方法是什么?
  2. 委托朋友理财有风险吗
  3. Android 手机直播聚合
  4. R语言ggplot2可视化散点图(scatter plot)、aes函数中的fill参数为连续变量、使用scale_fill_distiller函数自定义指定连续变量的颜色填充方案
  5. 正反向隔离装置(网闸)
  6. 【038】基于51单片机的土壤湿度自动浇花系统Proteus仿真设计
  7. 没有鼠标就无法对计算机进行操作,电脑鼠标不灵敏是什么原因?怎么解决?
  8. Star CCM+ :迎浪小船 DFBI
  9. ZYNQ LWIP实验
  10. 使用C++ 编写嵌入式应用程序