大话数据结构(第三章 线性表)

线性表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、双向链表

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

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

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

 

  

  

  

posted @ 2018-01-17 17:32  拔出萝卜带出土豆  阅读(109)  评论(0编辑  收藏  举报