数据结构学习笔记——线性表

线性表定义

线性表是零个或多个数据元素的有限序列。
线性表的数据对象集合为{a1,a2,……,an}。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系

线性表的顺序存储结构

线性表的顺序存储结构指的是用一段地址连续的存储单元依次存储线性表的数据元素。简单的说,线性表的顺序存储结构就是在内存中找到一块连续的空地,通过占位的形式把内存空间给占了,然后把相同数据类型的数据元素依次存放在这块空地中。可以使用一维数组来实现顺序存储结构,即把第一个数据元素存储到数组下表为0的位置中,接着把线性表相邻的元素存储在数组中相邻的位置。在任意时刻,线性表的长度应该小于等于数组的长度。

顺序存储的插入和删除操作

插入算法的实现思路

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

删除操作实现思路

  1. 如果删除位置不合理,抛出异常
  2. 取出删除元素
  3. 从删除位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置
  4. 表长减1

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

优点:

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

缺点

  • 插入和删除操作需要移动大量元素
  • 当线性表长度变化较大时,难以确定存储空间的容量
  • 造成存储空间的‘碎片’

线性表的链式存储结构

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。这就意味着,这些数据元素可以存在内存未被占用的任意位置。以前在顺序结构中,每个数据元素只需要存数据元素信息就可以了。现在链式结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址。我们将存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称作指针或链。这两部分组成了结点
n个结点链结成一个链表,即为线性表的链式存储结构,因为此链表的每个结点中只包含一个指针域,所以叫单链表。单链表正是通过每个结点的指针域将线性表的数据元素按其逻辑次序链接在一起。
我们把链表中第一个节点的存储位置叫做头指针,那么整个链表的存取就必须从头指针开始进行了。之后的每一个结点,其实就是上一个的后继指针指向的位置。最后一个节点指针为‘空’。

静态链表

用数组描述的链表叫做静态链表。即让数组的元素都是有两个数据域组成,data和cur。也就是说,数组的每个下标都对应一个data 和cur。数据域data,用来存放数据元素,也就是我们通常处理的数据;而游标cur相当于单链表中的next指针,存放该元素的后继在数组中的下标。
我们对数组元素第一个和最后一个元素作为特殊元素处理,不存数据。我们通常把未被使用的数组元素称为备用链表。而数组第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组的最后一个元素的cur则存放第一个有数值元素的下标,相当于单链表中的头结点作用,当整个链表为空时,则为0.
数据结构学习笔记——线性表_第1张图片
假设我们已经将数据存入静态链表,比如分别存放着‘甲’、‘乙’、‘丁’、‘戊’、‘己’、‘庚’等数据,则它将处于如下图所示的这种状态。
数据结构学习笔记——线性表_第2张图片
此时‘甲’这里就存有下一个元素‘乙’的游标2,‘乙’则存有下一元素‘丁’的下标3,而‘庚’是最后一个有值元素,所以它的cur设置为0.而最后一个元素的cur则因‘甲’是第一个有值元素而存有它的下标为1。而第一个元素则因空闲空间的第一个元素下标为7,所以它的cur存有7。

静态链表的优缺点

优点:

  • 在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点

缺点

  • 没有解决连续存储分配带来的表长难以确定
  • 失去了顺序存储结构随机存取的特性

循环链表

将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。循环链表解决了如何从当中一个结点出发,访问到链表的全部结点。
循环链表与单链表的主要差异就在于循环的判断条件上,原来是判断p->next是否为空,现在则是p->next不等于头结点,则循环为结束

双向链表


双向链表是在单链表的每个结点中,在设置一个指向其前驱结点的指针域。所以在双向链表中的节点都有两个指针域,一个指向直接后继,另一个指向直接前驱。
数据结构学习笔记——线性表_第3张图片

线性表——栈

栈是一种特殊的线性表,是限定仅在表尾进行插入和删除操作的线性表。把允许插入和删除的一端称为栈顶,另一端称为栈底。不含任何数据元素的栈称为空战。栈又称为后进先出的线性表。栈的插入操作叫做进栈,也称压栈、入栈。栈的删除操作叫做出栈,也有的叫做弹栈

线性表——队列

队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的线性表,允许插入的一点称为队尾,允许删除的一端称为队头。

你可能感兴趣的:(编程基础)