zoukankan      html  css  js  c++  java
  • 大话数据结构(第三章 线性表)

    线性表List:零个或者多个数据元素的有限序列。

      特点:是一个序列,有顺序

         线性表是有限的

      线性表中,一个元素的前面一个元素称之为直接前驱元素,后面的元素称之为直接后继元素。

      线性表元素的个数为线性表的长度,没有则是空表。

    1、线性表的抽象数据类型。

      ADT 线性表

        线性表的数据对象集合为{a1,a2,a3,...,an},每一个元素的数据类型均为DataType。其中,除了第一个元素有且只有一个直接先驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后驱元素。数据元素之间的关系是一对一的关系。

        操作Operation

          InitList(*L):初始化操作,建立一个空的线性表L。

          ListEmpty(L):若线性表空返回true,否则返回false。

          CLearList(*L):将线性表清空。

          GetElem(L,i,*e):将线性表L中第i个元素返回给e。

          LocateElem(L,e):在线性表中查找与给定值e相等的元素,如果成功返回序号,失败返回0。

          ListInsert(*L,i,e):在线性表L中的第i个位置插入新元素e。

          ListDelete(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值。

          ListLength(L):返回线性表L的元素个数。

      以上为线性表基本操作应用,根据具体的应用情况,有所增加新的操作。

    2、线性表的顺序存储结构

      1、顺序存储定义

      线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

      2、顺序存储方式

      描述顺序存储结构需要三个属性:存储空间的起始位置,线性表的最大存储容量,线性表的当前长度

      3、数据长度与线性表长度的区别

      数组的长度是存放线性表的存储空间的长度,一般分配后这个值不变;

      线性表的长度是线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。

      4、地址计算方法

      计算机中数组是从0开始

    3、顺序存储结构的插入与删除

      线性表的顺序存储结构,进行GetElem操作,很简单,返回对应下标的值就行

      插入操作,有异常抛出异常,没有则从最后一个往前到i号,全部后退,然后插入,表长+1

      删除操作,删除位置不合理,异常,否则,取出删除元素,将后面的元素都前移,表长-1

        插入的操作时间复杂度是O(n),删除操作O(n)

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

        优点:快速存取元素,使用的空间少紧凑

        缺点,插入删除需要移动大量元素,线性表长度变化大时,难以确定空间容量,会引起空间碎片

    4、线性表的链式存储结构

      为了解决顺序存储结构,采用了链式存储结构,可以解决大量数据元素移动问题

      链式结构中,除了要存储数据元素信息外,还要存储它的后继元素地址

      存储的数据称为数据域,存储的直接后继位置为指针域,这个表也叫作单链表

      我们把链表的第一个节点存储的位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了,最后一个节点的指针域存储为“空”

      有的时候为了更加方便对链表进行操作,我们在第一个节点前附设一个节点,称为头节点,头结点数据与可以不存任何东西。

      头指针:指向链表第一个节点,若链表有头结点,则指向头结点的指针,无论链表是否为空,头指针均不为空。

      头节点:为了操作的统一和方便而设立,其数据域一般无意义;有了头结点,第一个元素前插入元素和删除第一个的操作就统一了;头结点不是链表所必须的。

      若线性表为空表,则头节点的指针域为“空”;

    5、单链表的读取

      顺序存储结构中 找到任意一个元素很容易,能够计算好位置地址,但是在单链表中,第i元素的地址就不好知道了,必须从头开始一个个找过去,因此单链表的GrtElem在算法上进行实现,过程要麻烦一些。

     6、但链表的删除与插入

      插入节点,操作很简单,只需要让插入位置前一个元素的指针域指向插入元素,插入元素的指针域指向下一个元素即可。

      比如节点p,p->next,插入点s。则:s->next = p->next;p->next = s;两句话顺序不可以反过来。

        插入节点:先找到位置,再插入

      删除节点,直接上删除节点的前一个节点指向下下个节点即可

      单链表里面的删除插入节点都是由两部分组成,第一步找到位置;第二步进行操作;时间复杂度都是O(n)

    7、单链表的整表删除

      准备两个变量,依次把链表元素一个个赋值给这第二个变量,第二个变量不停的赋给第一个变量,第一个变量不停的释放,依次把整个链表释放掉。

      

    8、静态链表

      C语言有指针,链表可以想那样操作。但是早起的一些高级语言没有指针,比如Basic、fortan等

      没法进行上述的链表操作;

      那么有人就提出由数组代替指针,定义数组,数组的每一个元素由两个数据域组成,data和cur。cur相当于单链表中的指针,用来存在元素的后继在数组中的下标;

      我们把这种用数组描述的链表叫做静态链表,或者游标实现法。

      数组中第一个元素和最优一个元素作特殊处理,不存数据,数组中未被使用的数组元素称之为备用链表,而下标为0的元素的cur存放备用链表的第一个节点的下标,最后一个元素存放第一个有数值的元素的下标,相当于单链表中的头结点作用。

    9、循环链表

      将单链表中的终端节点的指针端由控指针改为指向头结点,就使得整个链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。

      循环链表的空表头节点的指针装自己地址

    10、双向链表

      在单链表中再增加一个指向前驱节点的指针域。

      插入和删除时候,要多修改指针数据;

      相比于单链表其实就是空间换取时间。

      

      

      

  • 相关阅读:
    YTU 2959: 代码填充--雨昕学矩阵
    YTU 2958: 代码填充--雨昕学画画
    YTU 2960: 改错题--小鼠标,你要干什吗?
    YTU 2975: 我的编号
    YTU 2979: MathBook类--多态
    linux命令学习:echo详解,格式化输出,不换行输出
    linux shell date 时间运算以及时间差计算方法
    C语言中mktime函数功能及用法
    Posix线程编程指南(3)
    Posix线程编程指南(2)
  • 原文地址:https://www.cnblogs.com/cwyblogs/p/8304068.html
Copyright © 2011-2022 走看看