顺序表、链表和数组是逻辑结构还是物理(存储)结构?或者这两种结构都有描述?

数据结构中的线性结构也就是“线性表”是逻辑结构,现在可以肯定栈与队列都是存储结构,栈与队列都是线性表,顺序表和链表也是线性表,一维数组和顺序表又基本上是一回事,那么顺序表和链表也是存储结构吗?

主要是在网上看了很多人的回答,各种说法都有,所以想确认一下。

我来总结一下吧,很多人工作多年也没把“逻辑结构”和“物理存储结构”区分开搞明白,一堆糊涂蛋。

首先数据结构分为两个层次:逻辑结构 和 物理结构(存储方式) 。

  • 逻辑结构是用来描述数据元素之间的逻辑关系,是一个抽象概念,与数据的实际存储无关,独立于计算机存在。
  • 物理结构是数据元素及其相互之间的关系在计算机存储器中的存储方式,简而言之物理结构就是实际的物理存储方式。
  • 总结:逻辑结构是数据结构的抽象,物理结构是数据结构的实现,两者综合起来才建立了数据元素完整的结构关系,
    只有逻辑结构,数据无法实际存储;只有物理结构,数据不知道该用哪种合适的方式存储。
    逻辑结构就好比是理论思想,物理结构就好比是对理论思想的具体实践,只有理论思想没有具体实践,思想永远只是空中楼阁没有实际的意义,
    而没有理论思想的指导,只知道埋头傻干,就好比是无头苍蝇乱撞。因此面对一个需求,首先要先分析他的逻辑结构,然后依据逻辑结构找到适合实现该逻辑结构(理论思想)的物理存储方式

明确了逻辑结构和物理结构的定义,再来讲讲逻辑结构和物理结构的种类,其中逻辑结构有两种划分方式:
按照第一种划分方式(划分依据是数据元素之间是否是一对一的关系),逻辑结构可以划分为两种:线性结构和非线性结构。

  • 线性结构:有且仅有一个开始节点和一个终端节点,并且除了头尾,每个数据元素都有一个直接前驱和直接后继,是1对1的关系。
    常见的线性结构有:线性表、栈、队列、串,注意:这四种都是逻辑结构,且各有特点,队列是队列,线性表是线性表,栈是栈,他们是平级的概念,你不能说队列和栈是线性表!!!!! 另外数组是物理结构中顺序存储结构的实现,跟上面这4个逻辑结构不是一码事。
  • 非线性结构:一个节点可能有多个直接前驱和后继,比如:树、图, 注意:树、图也是逻辑结构!!!
    第二种其实就是在第一种分类的基础上进一步细分,在此不做详细描述

物理结构分为四种:

  • 顺接存储结构
  • 链式存储结构
  • 索引存储结构
  • 散列存储结构
    在此只讲一下容易产生歧义的第一种
    顺序存储结构:用一组连续的存储单元依次存储数据元素,C语言中用数组实现顺序存储结构,超级注意!!顺序存储结构不等于线性表,因为线性表是逻辑结构,而顺序存储结构是物理结构,二者根本不在一个层次,因此不能放在一起比较
    而且顺序存储结构不仅能实现队线性表、队列、栈(线性结构),还能实现树和图(非线性结构),即数组能实现的逻辑结构不止一种,线性和非线性的逻辑结构都可以通过数组实现!!

顺序表是比较特殊的一种,它即描述了逻辑结构也描述了存储结构,用数组实现线性表就是顺序表

最近我也有这个问题,就是搞不清楚数组和链表是属于逻辑结构层面的还是存储结构层面的 还是二者都有涉及。依照我所了解的,存储结构有四种:顺序存储,链式存储,索引存储和哈希存储。其中,前两者应该是对应数组和链表的思想。另外,栈和队列这些是属于逻辑结构层面的,举个例子简单说,所谓“先进先出”“后进先出”这些思想只是逻辑上的原理,计算机实际存储并没有这样的结构,而通常说栈和队列可以由数组和链表实现(一般是数组),所以按照这个关系来讲,其实数组和链表就可能是对应存储结构的顺序存储和链式存储,而大多数编程语言都实现了基本的数组结构,除此之外,基于这些存储结构,再加上逻辑结构,就可以得出不同的数据结构了,例如java集合中的list,有分别基于数组和链表实现的arraylist和linkedlist

顺序表的存储方式一般用数组,数组是物理上连续的,顺序表是逻辑结构。链表是非连续结构。当然这里说的物理,实际上对于实际的内存硬件也未必连续,应为操作系统中使用虚拟地址。

顺序表的意思就是表内各个元素的地址空间是连续的,属于一个统称,数组、栈和队列都可以包括在顺序表里。你可以这样进行判断:如果一个数据结构你可以通过下标任意访问里面的元素那么它就可以叫顺序表。因为地址空间是连续的,比如你访问第五个元素,只需要将第一个元素的地址加4就可以得到第五个元素的地址。
所以顺序表应该是一类数据结构的统称
而链表的地址空间不是连续的,而是通过一个指针指向下一个元素,所以你访问链表里的元素时必须从头开始一个一个找。
链表是一种数据结构
线性表就是指像一条线一样的数据结构,数组、栈、队列、链表这些都是线性表,都是一个维度的。而二叉树这种因为会产生分支所以就不是线性表
线性表也是一类数据结构的统称
还有一个概念需要知道 如果一个数据结构是顺序表,它不一定是线性的;其实没必要纠结物理存储结构,因为底层的实现是复杂而多样的,数据可以在内存物理地址上不连续存储,但是在上层也可以获得类似数组一样的操作。同样反过来即便在底层用连续的地址空间进行存储但是你读取的时候也不能像数组那样读。比如最大堆和最小堆理论上是一种二叉树,但是底层可以用数组进行实现