线性表(linear list)指零个或多个数据元素的有线序列
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。
MakeEmpty(L)
这是一个将 L 变为空表的方法Length(L)
返回表 L 的长度,即表中元素个数Get(L, i)
这是一个函数,函数值为 L 中位置 i 处的元素(1<=i<=n)Prior(L, i)
取 i 的前驱元素Next(L, i)
取 i 的后继元素Locate(L, x)
这是一个函数,函数值为元素 x 在 L 中的位置Insert(L, i, x)
在表 L 的位置 i 处插入元素 x,将原占据位置 i 的元素及后面的元素都向后推一个位置Delete(L, p)
从表 L 中删除位置 p 处的元素IsEmpty(L)
如果表 L 为空表(长度为 0)则返回 true
,否则返回 false
Clear(L)
清除所有元素Init(L)
同一个,初始化线性表为空Traverse(L)
遍历输出所有元素Find(L, x)
查找并返回元素Update(L, x)
修改元素Sort(L)
对所有元素重新按给定的条件排序strstr(string1, string2)
用于字符数组的求 string1 中出现 string2 的首地址两种物理结构:
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
顺序存储结构的三个属性:
data
,它的存储位置就是存储空间的存储位置MaxSize
length
数组的长度是存放线性表的存储空间的长度,存储分配后这个量一般是不变的。
线性表的长度是线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。
在任意时刻,线性表的长度应该小于等于数组的长度。
优点
缺点
为了表示每个数据元素 a(i)
与其直接后继数据元素 a(i+1)
之间的逻辑关系,对数据元素 a(i)
来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。
指针域中存储的信息称为 指针 或 域。这两部分信息组成数据元素 a(i)
的存储映像,称为 结点(Node)。
线性链表中的最后一个结点指针为空(通常用 NULL 或 ^
符号表示)
头指针域头结点的异同
单链表(Linked List),即用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象)+指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
单链表结构和顺序存储结构对比:
静态链表(Static Linked List),即用数组描述的链表。
使用静态链表存储数据,数据全部存储在数组中(和顺序表一样),但存储位置是随机的,数据之间「一对一」的逻辑关系通过一个整形变量(称为「游标」,和指针功能类似)维持(和链表类似)。
循环链表(Circular Linked List),将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表。因此,从循环链表中的任何一个结点触发都能找到任何其他结点。
循环链表解决了一个很麻烦的问题。如何从当中一个结点触发,访问到链表的全部结点。
分类
双向链表又称双链表(Double Linked List),它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。