zoukankan      html  css  js  c++  java
  • 读大话数据结构之线性表

    第三章 线性表

    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)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。

  • 相关阅读:
    POJ 1328 Radar Installation
    POJ 1700 Crossing River
    POJ 1700 Crossing River
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3069 Saruman's Army(贪心)
    poj 3069 Saruman's Army(贪心)
    Redis 笔记与总结2 String 类型和 Hash 类型
    数据分析方法有哪些_数据分析方法
    数据分析方法有哪些_数据分析方法
  • 原文地址:https://www.cnblogs.com/jacob-wuhan/p/12942857.html
Copyright © 2011-2022 走看看