您的位置:首页 > 理论基础 > 数据结构算法

大话数据结构读书笔记系列(三)线性表

2016-03-28 21:40 459 查看

转载请注明来源:/article/7829575.html

第3章线性表

3.2 线性表的定义

线性表(List):零个或多个数据元素的有限序列。

元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。

线性表强调是有限的。

在较复杂的线性表中,一个数据元素可以由若干个数据项组成。

3.4 线性表的顺序存储结构

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
描述顺序存储结构需要三个属性:

存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。

线性表的最大存储容量:数组长度MaxSize。

线性表的当前长度:length。

在任意时刻,线性表的长度应该小于等于数组的长度。

存储器中的每个存储单元都有自己的编号,这个编号称为地址

时间复杂度:它的存取时间性能为O(1)。我们通常把具有这一特点的存储结构称为随机存取结构。

特点:

线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1);而插入或删除时,时间复杂度都是O(n)。这就说明,它比较适合元素个数不太变化,而更多是存取数据的应用。



3.6 线性表的链式存储结构

现在链式结构中,除了要存数据元素信息外,还要存储它的后继元素的存储地址。
为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称做指针或链。这两部分信息组成数据元素ai的存储映像,称为结点(Node)。
n个结点(ai的存储映像)链结成一个链表,即为线性表(a1,a2,...,an)的链式存储结构,因为此链表的每个结点中只包含一个指针域,所以叫做单链表。



我们把链表中第一个结点的存储位置叫做头指针,线性链表的最后一个结点指针为“空”(通常用NULL或“^”符号表示)。
有时,我们为了更加方便地对链表进行操作,会在单链表的第一个结点前附设一个结点,称为头结点。头结点的数据域可以不存储任何信息,也可以存储如线性表的长度等附加信息,头结点的指针域存储指向第一个结点的指针。



头指针与头结点的异同点:



单链表的读取,其主要核心思想就是“工作指针后移”。
单链表插入和删除算法,我们发现,它们其实都是由两部分组成:第一部分就是遍历查找第i个结点;第二部分就是插入和删除结点。我们很容易推导出:它们的时间复杂度都是O(n)。如果在我们不知道第i个结点的指针位置,单链表数据结构在插入和删除操作上,与线性表的顺序存储结构是没有太大优势的。我们只需要在第一次时,找到第i个位置的指针,此时为O(n),接下来只是简单地通过赋值移动指针而已,时间复杂度都是O(1)。显然,对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显。
单链表结构和顺序存储结构做对比:



3.12 静态链表

把这种用数组描述的链表叫做静态链表(游标实现法)



静态链表的优缺点:



总的来说,静态链表其实是为了给没有指针的高级语言设计的一种实现单链表能力的方法。

3.13 循环链表

循环链表解决了一个很麻烦的问题:如何从当中一个结点出发,访问到链表的全部结点。
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked
list)。

3.15 双向链表

双向链表(double linkedlist)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。
总结:



借用作者一句话共勉:不怕苦,吃苦半辈子,怕吃苦,吃苦一辈子。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: