链表和线性表的优缺点

2023-11-18

链表和线性表的优缺点

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

线性表

线性表的组成

首先,我们来谈谈线性表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)即可
按需申请释放空间
每一次的插入删除,只需要申请一块空间即可,和原本的空间没有影响
实际操作,链表会更为的舒服

但链表的缺点也很明显

链表的缺点

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

总结

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

链表和线性表的优缺点 的相关文章

  • mysql数据库丢库记

    2021 1 29 记 环境 Windows10 mysql5 6 Navicat12 原因 电脑突然关机 启动后通过Navicat连接发现少了一个库 让人无比迷茫 为啥会出现丢库现象 解决方案 无比庆幸的是在几个小时之前 我对丢失的库做过
  • 赋值运算符的错误使用举例

    和 运算符的错误使用 运算符在C语言中为赋值运算符 运算符为检查符号两边的值是否是相等的操作 当某些程序的本意是比较运算符的时候 可能会无疑写成了赋值运算符 比如下面的程序 本意是要检查x是否等于y 但是实际上是把y的值的赋值给了x 然后去
  • android studio 编译时出现 Build completed with 1 failures错误

    okhttp keep class okhttp3 keep interface okhttp3 dontwarn okhttp3 出现 Build completed with 1 failures 这个问题上面只是导致这个错误的一种 出
  • 嵌入式linux基础学习全套精品视频教程

    嵌入式linux基础学习全套精品视频教程 在给大家分享教程之前 首先给大家简要的介绍一下嵌入式linux 嵌入式linux 是将日益流行的Linux操作系统进行裁剪修改 使之能在嵌入式计算机系统上运行的一种操作系统 嵌入式linux既继承了
  • nginx中自动在二级目录后加斜杠

    有时候在Nginx的伪静态中 二级目录无法自动加斜杠 导致目录无法打开 可以加 optimize server names off server name in redirect off 但是又时候可能不通用 所以在虚拟主机中加入一段万能的
  • kuangbin的模板

    直接链接 间接链接

随机推荐

  • 使用DbHelperSQL调用存储过程的方法

    下面代码是个调用存储过程的例子 对于学习怎么使用DbHelperSQL调用存储过程很有帮助
  • ceph 维护系列(二)--卸载osd

    一 摘要 本文主要介绍从ceph 某台节点上卸载一块或者多块osd 硬盘 二 环境信息 2 1 操作系统版本 root proceph05 cat etc centos release CentOS Linux release 7 6 18
  • SSM框架搭建,及遇到的问题

    SSM框架搭建 及遇到的问题 1 基本概念 1 1 Spring Spring是一个开源框架 Spring是于2003 年兴起的一个轻量级的Java 开发框架 由Rod Johnson 在其著作Expert One On One J2EE
  • 使用NNI对BERT模型进行粗剪枝、蒸馏与微调

    前言 模型剪枝 Model Pruning 是一种用于减少神经网络模型尺寸和计算复杂度的技术 通过剪枝 可以去除模型中冗余的参数和连接 从而减小模型的存储需求和推理时间 同时保持模型的性能 模型剪枝的一般步骤 训练初始模型 训练一个初始的神
  • win10 WSL2 Ubuntu图像化界面安装和配置

    1 win11 设置 打开虚拟机安装许可 2 开启开发者模式 2 Microsoft Store下载安装ubuntu 我这里使用的是20 04 5LTS版本 3 打开ubuntu 命令窗口 1 打开win11的命令行 在下拉三角下标 打开
  • 【云原生之Docker实战】使用Docker部署宝塔面板

    云原生之Docker实战 使用Docker部署宝塔面板 一 宝塔面板介绍 二 检查本地docker环境 1 检查系统版本 2 检查内核版本 3 检查docker版本 三 下载宝塔镜像 四 部署宝塔面板 1 创建挂载目录 2 创建宝塔容器 3
  • 四、C++语言进阶:Boost入门

    4 Boost入门 4 1 简介 Boost库是一个可移植 提供源代码的C 库 作为标准库的后备 是C 标准化进程的开发引擎之一 是为C 语言标准库提供扩展的一些C 程序库的总称 4 2 使用 4 2 1 lamdba表达式 lambda库
  • 字符设备

    from here 字符设备http blog 163 com sunshine linting blog static 44893323201181102957282 字符设备是一种按字节来访问的设备 字符驱动则负责驱动字符设备 这样的驱
  • C++Static成员

    Static成员 概念 声明为static的类成员称为类的静态成员 用static修饰的成员变量 称之为静态成员变量 用static修饰的成员函数 称之为静态成员函数 静态成员变量一定要在类外进行初始化 例题 实现一个类 计算程序中创建了多
  • Mysql索引原理

    Mysql索引类型及其特性 1 普通索引 最基本的索引 它没有任何限制 也是我们大多数情况下用到的索引 直接创建索引 CREATE INDEX index name ON table column length 修改表结构的方式添加索引 A
  • Linux深度系统分区顺序,深度Deepin 20操作系统默认全盘分区不合理?附建设性意见探讨...

    有的网友认为深度 Deepin 20 操作系统默认全盘分区不合理 以下是某位深度网友的个人意见 首先 必须认为默认全盘分区的确存在一些不合理 以下是建设性意见 供与网友们一起探讨 建设性意见内容如下 1 EFI 引导分区 315M 实际使用
  • Javascript模块化规范之CommonJs,AMD,CMD

    Javascript模块化编程规范 一 模块化编程背景 1 什么是模块化编程 2 Javascript模块化编程有哪些规范 二 Javascript模块化编程 1 CommonJs 2 AMD异步模块定义 3 CMD 通用模块定义 4 ES
  • printf()函数

    printf函数对输出表中各量求值的顺序是自右至左进行的 也即程序执行的过程中参数的压栈顺序是从右至左的 并且压栈时压入的是值 因为参数的压栈是在程序的执行过程中 所以即使参数列表中有函数调用则在压栈时也即计算出来 即调用此函数去执行 把得
  • MathType改变字体大小

    目录 一 MathType中的公式字体 二 临时自定义字体大小 三 更改默认字体大小 四 总结 一 MathType中的公式字体 MathType中默认的字体大小为12pt 在word中即小四 word字体对应MathType的字体大小如下
  • Android Studio开发环境的搭建

    Android Studio开发环境的搭建 一 实验目的及任务 Windows下掌握Android Studio的安装和配置 模拟器的创建 Activity的创建和注册 二 实验环境 Jdk Android Studio 三 实验步骤 An
  • 7 种提升SpringBoot 吞吐量神技

    架构师专栏 2022 04 11 08 44 大家好 我是磊哥 一 异步执行 实现方式二种 1 使用异步注解 aysnc 启动类 添加 EnableAsync注解 2 JDK 8本身有一个非常好用的Future类 CompletableFu
  • 计算两个数之和,不能用+ = 运算符

    在lintcode的一个简单的算法题 计算两数的和 不能用 运算符 对于这个题 我是一点思路都没有 不用 那能用什么计算呢 于是在网上找了找答案 答案其实很简单 主要是涉及到运算 我是觉得应该记一下 所以才将这个题写下来 具体代码 异或 运
  • centos 6.5 连接MySQL 提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:

    centos 6 5 连接MySQL 提示 ERROR 1045 28000 Access denied for user root localhost using password NO CentOs 第一次登入MySQL 默认超级用户
  • 深度学习中的优化算法之AdaGrad

    之前在https blog csdn net fengbingchun article details 123955067 介绍过SGD Mini Batch Gradient Descent MBGD 有时提到SGD的时候 其实指的是MB
  • 链表和线性表的优缺点

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