读大话数据结构之线性表

第三章 线性表

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所示。

现在如果我们删除了第一个元素,表示现在这个位置空出来了,如果未来有新人要来则优先考虑这里,所以删除的位置成为第一个优先空位,即首元素的cur1, 第一个元素位置的cur改为8,而下标为8的位置cur改为9,最后元素位置的cur改为2,如图3-12-4所示。

 

静态链表的优缺点:

静态链表在插入和删除操作时不需要移动元素,只需要修改游标,从而改进了在顺序存储结构中插入和删除操作需要移动

大量元素的缺点;但并没有解决连续分配存储带来的表长难以确定的问题;并且失去了顺序存储结构随机存取的特性。

3.8 循环链表

将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)

3.9 双向链表

双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。

原文地址:https://www.cnblogs.com/jacob-wuhan/p/12942857.html