数据结构笔记5线性表(下)(《大话数据结构》学习笔记)

【1】静态链表

首先我们让数组的元素都是由两个数据域组成, date和 cur 。也就是说,数组的每个下标都对应一个data和一个 cur。数据域data ,用来存放数据元素, 也就是通常我们要处理的数据;而游标cur相当于单链表中的next 指针,存放该元素的后继在数组中的下标。
我们把这种用数组描述的链表叫做静态链表 ,这种描述方法还有起名叫做游标实现法。

为了我们方便插入数据,我们通常会把数组建立得大一些,以便有一些空闲空间可以便于插入时不至于溢出。

在这里插入图片描述
在这里插入图片描述
另外我们对数组第 一个和最后一个元素作为特殊元素处理,不存数据。我们通常把未被使用的数组元素称为备用链表 。而数组第一个元素,即下标为 0 的元素的 cur就存放备用链表的第一个结点的下标 i 而数组的最后一个元素的 cur 则存放第一个有数值的元素的下标,相当于单链表中的头结点作用,当整个链表为空时,则为02 。

在这里插入图片描述

此时的图示相当于初始化的数组状态,见下面代码 :
在这里插入图片描述
假设我们已经将数据存入静态链袭,比如分别存放着"甲" 、 “乙”、“丁”、“戊”、“己”、“庚” 等数据。
在这里插入图片描述
此时"甲"这里就存有下一元素"乙"的游标 2 ,"乙"则存有下一元素"丁’的下标 3 。而"庚"是最后一个有值元素,所以它的 cur 设置为 0 。而最后一个元素的cur 则因"甲’是第一有值元素而存有宫的下标为 1 . 而第一个元素则因空闲空间的第一个元素下标为 7 ,所以宫的 cur 存有 7 。

【2】静态链表的插入操作

静态链表中要解决的是 如何用静态模拟动态链表结构的存储空间的分配,需要时申请 , 无用时释放。我们前面说过,在动态链表中,结点的申请和释放分别借用 malloc ()和 free()两个函数来实现。在静态链表中,操作的是如且,不存在像动态链表的结点申请和释放问题,所以我们需要自己实现这两个函数,才可以做插入和删除的操作 。
为了辨明数组中哪些分量未被使用,解决的办法是将所有未被使用过的及已被删除的分量用游标链成一个备用的链表 , 每当进行插入时,便可以从备用链表上取得第一个结点作为待插入的新结点 。

在这里插入图片描述

这段代码有意思,一方面它的作用就是返回一个下标值,这个值就是数组头元素的cur存的第一个空闲的下标。从上面的图示例子来看,其实就是返回 7 。

那么既然下标为 7 的分量准备要使用了,就得有接替者,所以就把分量 7 的 cur.值赋值给头元素,也就是把 8给pace[0]cur,之后就可以继续分配新的空闲分量,实现类似 malloc)函数的作用。

现在我们如果需要在"乙"和"丁"之间,插入一个"丙"元素,按照以前顺序存储结构的做法,应该要把"丁"、“戊”、“己”、"庚"这些元素都往后移 一位。 但目前不需要 ,因为我们有了新的手段。
在这里插入图片描述

在这里插入图片描述

【3】静态链表的删除操作

和前面一样,删除元素时,原来是需要释放结点的函数 free().
在这里插入图片描述
在这里插入图片描述

【4】静态链表优缺点

在这里插入图片描述

【5】循环链表

将单链表中终端结点的指针端自空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表 ( circular linkedlist) 。
在这里插入图片描述
在这里插入图片描述
不过我们需要改造一下这个循环链粟,不用头指针,而是用指向终端结点 的 尾指针来表示循环链表,此时查找开始结点和终端结点都很方便了 。
在这里插入图片描述
举个程序的例 子 ,要将两个循环链表合并成一个表时,有了尾指针就非常简单了 。 比如下面的这两个循环链表,它们的尾指针分别是 rearA 和 rearB
在这里插入图片描述
要想把它们合井,只需要如下的操作即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【6】双向链表

双向链表( double linked List) 是在单链表的每个结点中,再设置一个指向其前驱结点的指针域 。所以在双向链表中的结点都有两个指针域, 一个指向直接后继,另一个指向直接前驱。
在这里插入图片描述
既然单链表也可以有循环链衰,那么双向链表当然也可以是循环表。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
插入操作时,其实并不复杂,不过顺序很重要,千万不能写反了。我们现在假设存储元素 e 的结点为:S,要实现将结点 s 插入到结点 p 和 p -> next之间需要下面几步,
在这里插入图片描述
如果插入操作理解了,那么删除操作,就比较简单了 。
若要删除结点 p ,只需要下面两步骤,
在这里插入图片描述

好了,简单总结一下,双向链表相对于单链表来说,要更复杂一些,毕竟它多了prior 指针,对于插入和删除时,需要格外小心 。另外它由于每个结点都需要记录两份指针,所以在空间上是要占用略多一些的。不过,由于它良好的对称性,使得对某个结点的前后结点的操作,带来了方便,可以有效提高算法的时间性能。说白了,就是用空间来换时间。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值