一、线性表的定义

【百度百科】线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了首位结点)。

  1. 线性表(List)是零个或多个数据元素的集合
  2. 线性表中的数据元素之间是有顺序的
  3. 线性表中的数据元素个数是有限的
  4. 线性表中的数据元素的类型必须相同

生活中的线性表:

数组也是一种线性表。

二、线性表的分类

1.顺序表

基本思想:元素的存储空间是连续的。在内存中是以顺序存储,内存划分的区域是连续的。存储结构如下:

2.链表

基本思想:元素的存储空间是离散的,单独的(物理),它们可以通过在逻辑上指针的联系使得它成为了整体的链表。存储上分为数据和指针两部分。存储结构如下图:

单链表和循环链表只可向一个方向遍历;双链表和循环链表,首节点和尾节点被连接在一起,可视为“无头无尾”;双链表可以向两个方向移动,灵活度更大。

三、线性表的一些常用操作

  1. 创建线性表
  2. 销毁线性表
  3. 清空线性表
  4. 将元素插入线性表
  5. 将元素从线性表中删除
  6. 获取线性表中某个位置的元素
  7. 获取线性表的长度

四、选择合适的数据结构

1.基于存储的考虑

顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模,也就是说事先对"MAXSIZE"要有合适的设定,过大造成浪费,过小造成溢出。可见对线性表的长度或存储规模难以估计时,不宜采用顺序表;链表不用事先估计存储规模,但链表的存储密度较低(存储密度是指一个结点中数据元素所占的存储单元和整个结点所占的存储单元之比,显然链式存储结构的存储密度是小于1的)。

2.基于运算的考虑

在顺序表中按序号访问的时间性能为O(1),而链表中按序号访问的时间性能O(n),所以如果经常做的运算是按序号访问数据元素,显然顺序表优于链表;而在顺序表中做插入、删除时平均移动表中一半的元素,当数据元素的信息量较大且表较长时,这一点是不应忽视的;在链表中作插入、删除,虽然也要找插入位置,但操作主要是比较操作,从这个角度考虑显然后者优于前者。

3.基于环境的考虑

顺序表容易实现,任何高级语言中都有数组类型,链表的操作是基于指针的,相对来讲前者简单些,也是用户考虑的一个因素。


我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考资料:

  1. https://www.cnblogs.com/yaowen/p/4272310.html
  2. https://www.cnblogs.com/itgungnir/p/6671855.html

程序员的进阶课-架构师之路(3)-线性表相关推荐

  1. 程序员的进阶课-架构师之路(17)-堆

    我们来介绍另外一种数据结构-堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的"堆"是不一样的,这里的堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都为O ...

  2. 根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  3. 程序员的进阶课-架构师之路(5)-队列

    一.队列的定义 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操 ...

  4. 程序员的进阶课-架构师之路(4)-栈

    一.栈的定义 [百度百科]栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据 ...

  5. 程序员的进阶课-架构师之路(2)-数组

    从这一节开始,我们就要正式进去数据结构的世界了,那么第一个是什么呢,就是我们的数组. 在我想写数组的时候,我的第一印象是去看它的源码,很可惜,数组的实现太特殊了,找了很久,我没有找到它的源码,带着这样 ...

  6. 程序员的进阶课-架构师之路(16)-散列表(哈希表)

    前言 当我们在编程过程中,往往需要对线性表进行查找操作.在顺序表中查找时,需要从表头开始,依次遍历比较a[i]与key的值是否相等,直到相等才返回索引i:在有序表中查找时,我们经常使用的是二分查找,通 ...

  7. 程序员的进阶课-架构师之路(6)-链表

    一.链表的定义 [百度百科]链表(LinikedList)是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点) ...

  8. 程序员的进阶课-架构师之路(18)-图

    一.图的定义 在计算机科学中,图(Graphics)是由顶点集合(Vertex)及顶点间的关系(边)集合(Edge)组成的一种数据结构,这些顶点通过一系列边结对(连接).顶点用圆圈表示,边就是这些圆圈 ...

  9. 程序员的进阶课-架构师之路(7)-树的概念

    接下来我们将会介绍另外一种数据结构--树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序 ...

最新文章

  1. 用composer安装laravel-bjyblog
  2. 微服务平台的发展趋势
  3. mysql oracle 默认事务级别_oracle 默认的事务隔离级别
  4. mysql排序时设置主次_Mysql实现Rownum()排序后根据条件获取名次
  5. 学习笔记(21):Python网络编程并发编程-队列的使用
  6. IPV6 IPV4双栈互通与静态路由
  7. LeetCode 545. Boundary of Binary Tree 二叉树边界
  8. HTML5学习笔记之音视频标签
  9. newlisp 注释生成文档
  10. 【细节实现 回文串12】LeetCode 564. Find the Closest Palindrome
  11. Netty in action—Netty组件和设计
  12. 安卓 获取rtsp流 截屏_华为手机这5种截屏方法,你都会用吗?现在知道也不亏...
  13. js通过图片url获取图片base64编码
  14. java事务和分布式事务详解
  15. 岗位:unity中级工程师
  16. 纯前端实现—网页钟表设计
  17. nodejs获取当前日期
  18. 关于日文系统的安装[转]
  19. 关于背单词的一点个人体会 (好文章)
  20. python动物重量排序_python动物重量排序_Python小白干货宝典:sorted()函数:列表元素排序...

热门文章

  1. loadrunner如何监控linux,以及重点指标分析
  2. 【redis源码】(九)Redis
  3. 如何监控 Elasticsearch 集群状态?
  4. SpringCloud config 配置中心介绍与基本配置使用
  5. 求Fibonacc数列中大于t(t3)的最小一个数 例 带入1000输出1597
  6. 03 | 事务隔离:为什么你改了我还看不见?笔记(转)
  7. Vue Devtools安装(谷歌浏览器插件:)
  8. 翼支付和银行网络连通准备
  9. mysql 命令 select_Mysql基础命令(二)select查询操作
  10. JVM 内存模型组成+经典总结