数据结构之线性表

一个热爱技术的菜鸟...用点滴的积累铸就明日的达人

正文

  线性表,从名字上就能感觉到,是具有像线一样的性质的表。可以如下定义:线性表是由零个或多个数据元素组成的有限序列,其中,若将表中元素记为:(a1,···,ai-1,ai,ai+1,···,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后驱元素。线性表元素的个数n定义为线性表的长度,当n=0时,称为空表。

存储结构

  在了解了线性表的定义之后,就需要了解一下线性表的存储结构,其中线性表的存储结构分为两类:顺序存储,链式存储

顺序存储

  线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。线性表(a1,···,ai-1,ai,ai+1,···,an)的顺序存储示意图如下:

  顺序存储方式下的线性表,其实就是在内存中找了块地,通过占位的形式,把这块空间给占据了,然后通过把相同数据类型的数据元素依次存放到这个空地中。我们仔细研究一下顺序存储方式的结构,不难发现描述线性表顺序存储结构需要三个属性:

  • 存储空间的起始位置
  • 线性表的最大存储容量
  • 线性表的当前长度

链式存储

  在讨论链式存储之前,先来介绍一个概念--结点。结点是由一个元素以及它后驱元素的地址所组成的结构,当前结点的后驱元素位置也叫做指针域,可以通过结点中的后驱元素地址很容易找到当前元素的后驱元素。有了结点的概念之后,就很容易的定义线性表的链式存储结构了:由零个或多个结点构成的逻辑上的线性结构被称为线性表的链式存储结构。线性表(a1,···,ai-1,ai,ai+1,···,an)的链式存储示意图如下:

  链式存储方式下的线性表,其实就是在存储器中开辟了很多小空间,用于存放结点,最后通过这些结点来组成逻辑上的线性结构。通过将第一个结点的存储位置叫做头指针,最后一个结点的存储位置叫做尾指针,上图由于每个结点只包含一个指针域,因此又可以称为单链表。

顺序存储与链式存储的比较

查找

  • 顺序存储可以通过第一个元素的地址  推算出第i个结点的位置,因此可以直接通过内存或者其他存储器找到该元素。时间复杂度o(1)
  • 链式存储(以单链表为例),必须通过第一个结点,依次向下寻找,直到找到该元素。时间复杂度o(n)

插入

  • 顺序存储,首先要判断插入元素之后长度是否在容量范围之内,若超过范围,则无法插入。若在范围之内,会将被插入位置之后(包括该位置)的元素集体向后移动一位,随后将新元素赋值到指定位置
  • 链式存储结构,首先会创建一个新结点,将该元素赋值到新结点的数据项中,然后找到被插入位置的前一个结点,将该结点的指针域赋值给新结点指针域,然后再将该结点指针域指向新结点。

删除

  • 顺序存储,将指定位置元素删除后,需要移动其后面所有元素,使向前移动一位。
  • 链式存储结构,将该元素的指针域赋值给前驱结点的指针域即可

  综上所述,可以看出顺序存储在查找方面相对于链式存储要方便的多,但是在插入和删除方面性能较链式存储差。同时顺序存储需要一开始指定一块大小确定的区域(因此会收到区域大小的影响),而链式存储则不需要。

特殊的线性表

  • 循环链表:将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相连的单链表称为单循环链表,简称循环链表。
  • 双项链表:将单链表中的每个结点都添加一个前驱结点的指针域
原文地址:https://www.cnblogs.com/sachen/p/6754346.html