[数据结构]-03线性存储结构

线性表是什么

线性表是由 0 或多个具有相同类型的结点组成的有序集合。

若用 ( a 1 , a 2 , a 3 , . . . , a n ) (a_1,a_2,a_3,...,a_n) ( n n 为自然数 ) 表示一个线性表。

  • n = 0 n=0 时,线性表中无结点,这样的线性表称为空表
  • n 1 n\ge 1 时, a 1 a_1 记为线性表的表头, a n a_n 为线性表的表尾
  • n 2 n\ge 2 时, a i a_i 称为 a i + 1 a_{i+1} 的前驱结点, a i + 1 a_{i+1} 称为 a i a_i 的后继结点
  • n = 1 n=1 时,线性表只有一个结点,该结点即是表头也是表尾
  • n ( n 0 ) n(n\ge 0) 称为线性表的长度

线性表特点:

  • 线性表中的元素可以是各种各样的,但同一个线性表中的元素必定具有相同的特性,即属同一数据对象。
  • 数据元素之间具有一种线性的或“一对一”的逻辑关系。除了第一个元素没有前驱结点,最后一个元素没有后继结点,其他每个元素都有一个前驱结点和一个后继结点。

线性顺序存储结构

用一组连续的存储地址来存储线性表中的结点的存储方式称为顺序存储结构。

线性表长度和最大存储容量的区别是什么?

  • 线性表长度:线性表中数据元素的个数,随着插入和删除操作,长度会发生变化。
  • 线性表的最大存储容量:线性表初始化时申请的存储空间,即线性表最多能存储的数据元素个数,初始化结束后该值不再变化,不随线性表长度的改变而改变。

顺序存储结构需要的三个属性:

  • 存储空间的起始位置:线性表的存储位置就是存储空间的存储位置。
  • 线性表的最大存储容量: M a x S i z e MaxSize
  • 线性表的当前长度: l e n g t h length

线性表数据元素与存储地址的关系

若线性表中每个元素占用 c c 个存储空间,以第一个元素所占的存储单元为起始存储位置,线性表中第 i i 个和第 i + 1 i+1 个元素的存储位置具有以下关系:
L O C ( a i + 1 ) = L O C ( a i ) + c LOC(a_{i+1})=LOC(a_i)+c
1 1 个和第 i i 个元素的存储位置:
L O C ( a i ) = L O C ( a 1 ) + ( i 1 ) c LOC(a_i)=LOC(a_1)+(i-1)c
所以在线性表中,若两个元素在表中是逻辑相邻的,则他们的存储地址是物理相邻的。
即只要给定表头元素 a 1 a_1 的存储地址和存储元素所需的字节数,便可确定表中任一元素的存储地址,从而实现对结点的随机存取操作。即线性表的顺序存储结构是随机存取的存储结构。

顺序存储结构的插入

插入算法的思路:

  • 如果插入位置不合理,抛出异常;
  • 如果线性表长度大于等于最大存储容量,则抛出异常或动态增加容量;
  • 从最后一个元素开始向前遍历到第 i 个位置,分别将它们都向后移动一个位置;
  • 将要插入元素填入位置 i 处;
  • 线性表长度加 1。

顺序存储结构的删除

删除算法的思路:

  • 如果删除位置不合理,抛出异常;
  • 取出删除元素;
  • 从删除元素位置开始遍历到最后一个元素位置,分别将他们都向前移动一个位置;
  • 线性表长减 1。

顺序存储结构的时间复杂度

插入删除的时间复杂度

  • 最好时间复杂度: O ( 1 ) O(1) 。在线性表的最后一个位置进行删除和插入操作,线性表不移动任何元素。
  • 最坏时间复杂度: O ( n ) O(n) 。在线性表的第一个位置进行删除和插入操作,线性表所有元素进行向前或向后移动。
  • 平均时间复杂度: O ( n ) O(n)

线性顺序存储结构的优缺点

优点:

  • 无需为表示表中元素之间的逻辑关系而增加额外的存储空间。
  • 可以快速的存取表中任意位置的元素。

缺点:

  • 插入和删除操作需要移动大量元素。
  • 当线性表元素插入过多时,难以确定存储空间的容量。
  • 线性表长度过小时,容易造成存储空间的浪费。

线性链式存储结构

数据元素的存储地址随机获取,并通过指针表示数据之间逻辑关系的存储结构就是链式存储结构。

什么是结点?
数据域和指针域构成的数据元素的存储映像称为结点。
数据域存放该结点的数据域的值,指针域存放该结点的前继或后继结点的地址信息。

什么是链表?
n n 个结点连接成的线性表称为链表。根据结点指针域的不同,链表主要分为单链表、循环链表和双向链表。

什么是首元结点、尾结点、头结点、头指针?

  • 链表中存储第一个数据元素的结点称为首元结点。
  • 链表中的最后一个结点称为尾结点。
  • 在链表的首元结点之前附设的一个结点,该结点称为头结点。头结点的数据域可以为空,也可以存放线性表长度等附加信息,但头结点不能计入链表长度值。
  • 头指针是指向链表中第一个结点的指针。若链表有头结点,则是指向头结点的指针;若链表没有头结点,则是指向首元结点的指针。

链表指针之间关系:
p p 为指向链表第 i i 个结点的指针,则可以知道:

  • p . n e x t p.next 指向第 i + 1 i+1 个结点
  • p . d a t a p.data i i 个结点的数据域
  • p . n e x t . d a t a p.next.data i + 1 i+1 个结点的数据域

线性顺序和链式存储结构比较

空间性能:

  • 顺序存储需要预分配存储空间,分配空间过大会造成空间的浪费;分配空间过小会造成数据溢出,元素个数受限。
  • 链式存储不需要分配存储空间,只要有存储空间就可以在链表中添加元素,元素个数不受限制。

时间复杂度:

  • 查找:顺序存储可随机查找,时间复杂度 O ( 1 ) O(1) ,链式存储只能根据指针顺序查找,时间复杂度为 O ( n ) O(n)
  • 插入和删除: 顺序存储结构需要移动表大量的元素,时间复杂度为 O ( n ) O(n) ;链式存储在确定操作结点后,插入和删除时间复杂度为 O ( 1 ) O(1)

存储分配方式:

  • 顺序存储结构用一段连续的存储单元依次存储线性表的数据单元。
  • 链式存储结构用一组任意的存储单元存放线性表的元素。

存储密度:

  • 顺序存储结构不用为表示结点间的逻辑关系而增加额外的存储开销,存储密度等于 1。
  • 单链表需要借助指针来体现元素间的逻辑关系,存储密度小于 1。

参考

  • 《大话数据结构》 程杰著
  • 《数据结构(C语言版)》 严魏敏、吴伟民著
发布了19 篇原创文章 · 获赞 0 · 访问量 763

猜你喜欢

转载自blog.csdn.net/qq_39953750/article/details/103894730