大话数据结构(第三章 线性表)
线性表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、双向链表
在单链表中再增加一个指向前驱节点的指针域。
插入和删除时候,要多修改指针数据;
相比于单链表其实就是空间换取时间。