02线性表(线性表的链式表示)

2.3线性表的链式表示

 由于顺序表的插入,删除操作需要移动大量的元素,影响了运行效率,由此引入了线性表的链式存储。链式存储线性表时,不需要使用地址连续的存储的单元,即它不要求逻辑上相邻的两个元素在物理位置上也相邻,他是通过链,建立数据元素之间的逻辑关系,因此,对线性表的插入,删除不需要移动元素,而是只需要修改指针。

2.3.1单链表的定义

线性表的链式存储又称 单链表。他是通过一组任意的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系,对每个链表中结点,除了存放元素自身的信息之外,还需要存放一个指向其后继的指针。

备注:由于单链表附加了指针表,也存在浪费存储空间的缺点。由于单链表的元素是离散地分布在存储空间中的,所以单链表是非随机存取的存储结构,即不能直接找到表中某个特定的结点。

查找某个特定的结点时,需要从表头开始遍历,依次查找。

头结点和头指针的区别:不管带不带头结点,头指针始终指向链表的第一个结点。而头节点是带头结点链表中的第一个结点,结点内通常不存储信息。

引入头结点后,可以有两个优点:

1,由于开始结点位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作和在表的其它位置上的操作一致,无需特殊处理。

2,无论链表是否空,其头指针指向头结点的非空指针。

 

2.3.2单链表上的基本操作的实现

1,采用头插法建立单链表

该方法从一个空表开始,生成新结点,并将读取到的数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头,即头结点。

2,采用尾插法建立单链表

头插法建立单链表的算法虽然简单,但是生成的链表中结点的次序和输入数据的顺序不一致。如果希望两者一致,可以采用尾插法。这个方法是将新结点插入到当前链表的表尾上,为此必须增加一个尾指针r,使其始终指向当前链表的尾结点。

 

4,按值查找表结点

从单链表的第一个结点开始,由前往后依次比较表中各结点数据域的值,若某结点数据域的值等于给定值e,则返回该结点的指针;若整个单链表中没有这样的结点,则返回NULL。

 

2.3.3双链表

单链表结点只有一个指向后继的指针,这使得单链表只能从头结点依次顺序地向后遍历。若要某个结点的前驱(插入,删除操作时),只能从头开始遍历,访问后继结点的时间复杂度是O(1),访问前驱结点的时间复杂度为O(n)。

为了克服单链表的上述缺点,引入了双链表,双链表结点中有两个指针 prior 和  next,分别指向其前驱结点和后继结点。

双链表仅仅是在单链表的结点中增加一个指向其前驱的 prior 的指针,因此,在双链表执行按值查找和按位查找的操作和单链表相同。

但是双链表在插入和删除操作的实现上,和单链表有着较大的不同。这是因为“链”变化时也需要对 prior 指针做出修改,其关键在于保证在修改的过程中不断链。此外,双链表可以很方便地找到其前驱结点。因此,插入,删除结点算法的时间复杂度仅为O(1)。

2,双链表的删除操作

删除双链表中结点*p的后继结点*q,指针变化如

2.3.4循环链表

1,循环单链表

2,循环双链表

定义:头结点的 prior 指针还要指向表尾的结点。

2.3.5静态链表

静态链表是借助数组来描述线性表的链式存储结构,结点也有数据域data 和 指针域 next,与前面所讲的链表中的指针不同的是,这里的指针是结点的相对地址(数组下标),又称游标。

2.3.6顺序表和链表的比较

1,存取方式

顺序表可以顺序存取,也可以随机存取,链表只能从表头顺序存取元素。

例题:

 

阅读更多
换一批

没有更多推荐了,返回首页