当前位置: 首页 > news >正文

数据结构万字总结(超级详细)第二章——线性表

线性表

定义

线性表是具有相同数据类型的n(n≥0)个数据元素的有限 序列

特点

除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅 有一个直接后继

操作

初始化、增、删、查、改、销毁

元素的下标与位序

下标从0开始,位序从1开始

分类(根据存储结构来划分的)

顺序表

顺序存储

  • 定义

    用顺序存储的方式实现线性表。顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中

  • 实现

    • 静态分配(数组实现)

      扩展容量不方便,缺乏灵活性、但是内存管理简单,不存在内存泄漏的问题(内存泄漏——只申请内存不释放内存)

    • 动态分配(malloc)

      空间利用灵活,但是内存管理复杂

  • 特点

    • 优点

      • 随机访问,即可以在 O(1) 时间内找到第 i 个元素

      • 存储密度高

    • 缺点

      • 扩展容量不方便,即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高

      • 插入、删除操作不方便,需要移动大量的元素

    • 顺序存储、随机存取

  • 操作

    • 插入:移动元素(n/2)次

    • 删除:移动元素(n-1)/ 2次

    • 查找:比较次数:(n+1)/ 2

    • 查找最多,即(n+1),记住,删除肯定是要小的,即(n-1),而插入是增多,即n

链表

链式存储

  • 单链表

    • 定义

      用链式存储实现的线性表,链式存储:逻辑上相邻但是物理存储结构上不相邻,每个结点除了存放数据元素外,还要存储指向下一个节点的指针

    • 实现

      带头结点有什么好处?

      • 带头结点

        写代码更方便

      • 不带头结点

        写代码更麻烦,对第一个结点的处理需要使用不同的代码逻辑。比如判空操作

    • 特点

      • 优点

        • 扩展容量方便

        • 插入、删除操作很方便、不需要移动大量的元素

      • 缺点:

        • 只能顺序访问

        • 存储密度低

      • 随机存储、顺序存取

    • 操作:插入、删除、查找。三种操作的复杂度都为O(n)

    • 建立

      • 尾插法

      • 头插法:可用于实现单链表逆置

  • 双链表,如下:

  • 定义
    • 由于单链表不能逆向检索,因此出现了双向链表。

    • 实现

    • 特点

      • 存储密度更低,不具备随机存取特性

    • 操作

      • 插入

        注意新插入结点、前驱结点、后继结点的指针修改 边界情况∶新插入结点在最后一个位置,需特殊处理

      • 删除

        注意删除结点的前驱结点、后继结点的指针修改 边界情况︰如果被删除结点是最后一个数据结点,需特殊处理

  • 循环链表

    • 循环单链表,如下:

    • 表尾结点的next指针指向头结点

    • 循环双链表

    • 表头结点的 prior 指向表尾结点; 表尾结点的 next 指向头结点

    • 特点:存储密度低、插入、删除操作方便。相比与普通单链表和普通双向链表,循环链表可以从任意结点出发遍历整个链表,而普通链表只能从头结点开始遍历

  • 静态链表

    • 定义

      用数组的方式实现的链表

    • 实现:每个结点的next存放下一个结点的下标

    • 优点

      • 增、删操作不需要大量移动元素

    • 缺点

      • 不能随机存取,容量固定不可变

    • 适用场景:操作系统文件分配表

链表与顺序表的异同

逻辑结构

都是线性表,逻辑上相邻

数据运算

链表:插入、删除很方便,不需要移动大量的元素。查找只能从头开始查找

顺序表:插入、删除元素不方便、需要移动大量的元素。查找可以用折半查找

存储结构

链表:链式存储

顺序表:顺序存储

相关文章:

  • JVM虚拟机-实战篇
  • AI+云平台|全闪云底座迎战
  • 自媒体用ChatGPT批量洗稿软件V5.9环境配置/软件设置教程【汇总】
  • UE5C++学习(四)--- SaveGame类存储和加载数据
  • Sql Server小技能:row_number()函数
  • 【Vue】Vue集成Element-UI框架
  • 深圳区块链交易所app系统开发,撮合交易系统开发
  • 服务器总是宕机问题记录
  • 【WPF应用7】 基本控件-Grid 布局的详解与示例
  • 如何在Linux系统使用Docker本地部署Halo网站并实现无公网IP远程访问
  • Python读取csv文件入Oracle数据库
  • vivado 使用远程主机和计算群集
  • 接招吧! selenium环境+元素定位大法
  • TCP重传机制详解——03DSACK
  • jvm高级面试题-2024
  • “大数据应用场景”之隔壁老王(连载四)
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【译】理解JavaScript:new 关键字
  • Angular 响应式表单 基础例子
  • Hexo+码云+git快速搭建免费的静态Blog
  • HTTP--网络协议分层,http历史(二)
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • js继承的实现方法
  • node学习系列之简单文件上传
  • orm2 中文文档 3.1 模型属性
  • Python实现BT种子转化为磁力链接【实战】
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 后端_ThinkPHP5
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 首页查询功能的一次实现过程
  • 微服务核心架构梳理
  • 我这样减少了26.5M Java内存!
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云移动端播放器高级功能介绍
  • ​linux启动进程的方式
  • ​ubuntu下安装kvm虚拟机
  • ​渐进式Web应用PWA的未来
  • #laravel 通过手动安装依赖PHPExcel#
  • $.ajax,axios,fetch三种ajax请求的区别
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (4)Elastix图像配准:3D图像
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)Mysql的优化设置
  • (转)VC++中ondraw在什么时候调用的
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net web项目 调用webService
  • .NET 回调、接口回调、 委托
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net通用权限框架B/S (三)--MODEL层(2)