线性表的相关概念
线性表:零个或多个数据元素的有限序列。
最简单的数据结构
线性表的长度:线性表元素的个数n
线性表的抽象数据类型
ADT 线性表(List)
Data
Operation
InitList(*L); 初始化操作,建立一个空的线性表L
ListEmpty(L); 若线性表为空,返回true,否则返回false
ClearList(*L); 将线性表清空
GetElem(L,i,*e); 将线性表L中第i个位置元素值返回给e
LocateElem(L,e); 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败
ListInsert(*L,i,e); 在线性表L中的第i个位置插入新元素e
ListDelete(*L,i,*e); 删除线性表L中第i个位置元素,并用e返回取值
ListLength(L); 返回线性表L的元素个数
给人看的
线性表在内存中的存储
顺序存储结构
定义
顺序存储方式
三个属性:
存储空间的起始位置:数组data
线性表的最大存储容量:数组长度MaxSize
线性表的长度:length
数据长度与线性表长度区别
数据长度:存放线性表的存储空间的长度,分配后一般不变。
线性表长度:线性表中数据元素的个数,随着线性表插入和删除操作而变化。
元素的插入
元素和删除
优点
- 可以快速存取表中任意位置的元素。
- 无须为表中元素之间的逻辑关系而增加额外的存储空间。
缺点
- 插入和删除操作需要移动大量元素。
- 当线性表长度变换较大时,难以确定存储空间的容量。
- 造成存储空间的“碎片”。
链式存储结构
可以解决线性表的顺序存储结构中元素的删除和插入时,移动大量元素的耗时。
存储单元可以是不连续的,可以存在内从中未被占用的任意位置。
数据域:存储数据元素信息的域。
指针域:存储直接后继位置的域。
指针/链:指针域中存储的信息。
结点:数据域和指针域构成的存储映像。
链表:n个结点的组合。
头指针:链表中第一个结点的存储位置。
头结点:在单链表的第一个结点前附设一个结点。
头结点的指针域存储指向第一个结点的指针。
头指针和头节点的异同
单链表
单链表的读取
获得链表第i个数据的思路:
- 声明一个结点
- 当 j < 1 时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j 累加1;
- 若到链表末尾p为空,则说明第 i 个元素不存在;
- 否则查找成功,返回结点p的数据。
在这里插入代码片
结点的插入
结点的删除
单链表的整表创建
单链表结构和顺序存储结构
其他链表
静态链表
插入
删除
优点
缺点
循环链表
定义:单链表中终端结点的指针端由空指针改为指向头结点,使整个单链表形成一个环,头尾相接的单链表即为单循环链表。
结点的插入
结点的删除
双向链表
定义:在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
结点的插入
结点的删除