第三章 线性表
3.1 线性表的定义
线性表:零个或多个数据元素的有限序列。
说明:线性表是一个序列。也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。
线性表强调是有序的。
3.2 线性表的顺序存储结构
3.2.1 顺序存储定义
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
3.2.2 顺序存储方式
顺序存储结构需要有三个特性:
1)存储空间的起始位置;
2)线性表的最大存储容量;
3)线性表的当前长度。
3.2.3 数组长度和线性表长度的区别
数组长度:存放线性表的存储空间的长度,存储分配后这个量一般是不变的;
线性表长度:线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。
随机存储结构:随机存取就是直接存取,可以通过下标直接访问的那种数据结构,与存储位置无关,例如数组。
3.3 顺序存储结构的插入和删除
3.3.1 插入操作
插入算法的思路:
·如果插入位置不合理,抛出异常;
·如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;
·从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;
·将要插入元素填入位置i处;
·表长加1.
3.3.2 删除操作
删除操作的思路:
·如果删除位置不合理,抛出异常;
·取出删除元素;
·从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
·表长减1.
3.3.3 线性表顺序存储结构的优缺点
优点:
·无须为表示表中元素之间的逻辑关系而增加额外的存储空间;
·可以快速地存取表中任一位置的元素(时间复杂度为O(1)).
缺点:
·插入和删除操作需要移动大量元素;
·当线性表长度变化较大时,难以确定存储空间的容量;
·造成存储空间的“碎片”。
3.4 线性表的链式存储结构
线性表链式存储结构定义:
为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称作指针或链。这两部分信息组成数据元素ai的存储映像,成为结点(Node)。
如果一个链表的每个结点中只包含一个指针域,则叫做单链表。
我们把链表中第一个结点的存储位置叫做头指针。
有时为了更加方便的对链表进行操作,会在单链表的第一个结点前附设一个结点,称为头结点。
3.5 单链表的整表创建
头插法:
尾插法:
3.6 单链表结构与顺序存储结构优缺点
结论:
·若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构。
·当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构,这样可以不需要考虑存储空间的大小问题。
3.7 静态链表
概念:用数组描述的链表叫做静态链表。
数组的第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组的最后一个元素的cur;则存放第一个有数值的元素的下标,相当于单链表的头节点作用,当整个链表为空时,则为0,表示无指向。
现在如果我们需要在“乙”和“丁”之间插入一个值为“丙”的元素,只需要将“乙”的cur改为7,表示下一位是“丙”,并将“丙”的cur改为3,表示下一位是丁。如图3-12-3所示。
现在如果我们删除了第一个元素“甲”,表示现在“甲”这个位置空出来了,如果未来有新人要来则优先考虑这里,所以删除的位置成为第一个优先空位,即首元素的cur为1, 第一个元素位置的cur改为8,而下标为8的位置cur改为9,最后元素位置的cur改为2,如图3-12-4所示。
静态链表的优缺点:
静态链表在插入和删除操作时不需要移动元素,只需要修改游标,从而改进了在顺序存储结构中插入和删除操作需要移动
大量元素的缺点;但并没有解决连续分配存储带来的表长难以确定的问题;并且失去了顺序存储结构随机存取的特性。
3.8 循环链表
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。
3.9 双向链表
双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。