线性表
线性表(List): 由零个或多个数据元素组成的有限序列
关键:
- 首先他是一个序列,也就是说元素之间是有先来后到的
- 若元素存在多个,则第一个无前驱,最后一个无后继,其他元素都有且仅有一个前驱和后继
- 线性表的数据是有限的
- 线性表的个数n(n>=0)定义为线性表的长度,当n=0时,称为空表
数据类型: 指一组性质相同的值的集合及定义在此集合上的一些操作的总称
数据类型的分类:
- 原子类型:不可以再分解的基本类型,例如整型、浮点型、字符型
- 结构类型:由若干个类型组合而成,是可以再分解的,例如整型数组是由若干整型数据组成的
抽象: 是指抽取出事务具有的普遍性本质
抽象数据类型:
- 把数据类型和相关操作捆绑在一起
- 我们对已有的数据类型进行抽象,就有了抽象数据类型
- 抽象数据类型(Abstract Data Type, ADT)是指一个数学模型及定义在该模型上的一组操作
- 抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表现和实现无关
- 抽象数据类型还可以指计算机编程者自定义的数据类型
Operation:
- InitList(*L):初始化操作,建立一个空的线性表L
- ListEmpty(L):判断线性表是否为空表,若线性表为空,返回true,否则返回false
- ClearList(*L):将线性表清空
- GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e
- LocalElem(L,e):在线性表中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号;否则,返回-1表示失败
- ListInsert(*L,i,e):在线性表中第i个位置插入新元素e
- ListDelete(*L,i,*e):删除线性表L中第i个位置元素,并用e返回其值
顺序存储结构
线性表的顺序存储结构:
- 用一段地址连续的存储单元依次存储线性表的数据元素
- 找个初始地址,通过占位的形式,把一定的内存空间占了,把相同数据类型的数据元素依次放在这块空地中
顺序存储结构封装的三个属性:
- 存储空间的起始位置
- 线性表的最大存储容量
- 线性表的当前长度
顺序存储结构优点:
- 无需为表中元素之间的逻辑关系而增加额外的存储空间
- 可以快速的索引表中任意位置的元素
顺序存储结构缺点:
- 插入和删除需要移动大量元素
- 当线性表长度变化较大时,难以确定存储空间的容量
- 容易造成存储空间的碎片
链式存储结构
线性表的链式存储结构:
- 用一组任意的存储单元存储线性表的数据元素及后继元素的存储地址,这组存储单元可以存在内存中未被占用的任意位置
- 存储数据元素信息的域叫数据域,存储直接后继位置的域叫指针域,这两部分信息组成数据元素称为存储映像,称为节结点(Node)
- n个节点链接成一个链表,即为线性表的链式存储结构
单链表:
- 若链表的每个结点中只包含一个指针域,则叫做单链表
- 链表中第一个结点的存储位置叫做头指针,最后一个结点指针为空(NULL)
头指针与头结点的异同:
- 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针
- 头指针具有标识作用,所以常用头指针冠以链表的名字(指针变量的名字)
效率:
- 若我们不知道第i个元素的指针位置,则单链表查找、插入、删除的时间复杂度都是O(n)
- 若从第i个位置,连续插入10个元素,顺序存储结构每插入一个都是O(n),而链式存储找到第i个位置是O(n),接下来都是O(1)
- 对于插入或删除数据越频繁的操作,单链表的效率优势就越明显
单链表的整表创建:
- 他的数据是分散在内存各个地方的,他的增长也是动态的
- 他所占用的空间大小和位置是不需要预先划分的,可以根据系统情况和需求即时生成
- 单链表整表创建的算法思路:
– 声明一节点p和计数器变量i
– 初始化一空链表L
– 让L的头结点的指针指向NULL,即建立一个带头结点的单链表
– 循环实现后继节点的赋值和插入
头插法建立单链表:
- 头插法从一个空链表开始,生成新结点,读取数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到结束为止
- 简单来说,就是把新加进的元素放在表头后的第一个位置
– 先让新结点的next指向头结点之后
– 然后让表头的next指向新结点
尾插法建立单链表:
- 每次都插在链表尾
单链表的整表删除:
- 在内存中将他释放掉
- 单链表整表删除的算法思路如下:
– 声明结点p和q
– 将第一个结点赋值给p,下一结点赋值给q
– 循环释放p和将q赋给p的操作
静态链表:
- 通过数组来做一个类似链表的结构
- 数组的第一个和最后一个元素的data不存放数据
- 通常把未使用的数组称为备用链表
- 数组的第一个元素,即下标为0的那个元素的cur则存放第一个有数值的元素的下标
- 数组的最后一个元素,即下标为MAXSIZE-1的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点的作用