特殊链表及顺序表的合并

循环链表

与单链表不同的地方:最后一个结点的指针域指向L

某些情况下,若在循环链表中设立尾指针而不设头指针(见图2.18(a)),可使一些操作简化。例如,将两个线性表合并成一个表时,仅需将第一个表的尾指针指向第二个表的第38 第2章线性表一个结点,第二个表的尾指针指向第一个表的头结点,然后释放第二个表的头结点。

双向链表

双向链表有直接前驱和直接后继,很多地方与单链表相同,但是插入和删除有很大不同,需同时修改前驱和后继的指针.

顺序表和链表的比较

空间性能的比较

顺序表需要为其分配空间,单链表无需提前分配空间,在扩充时提高效率.

$储存密度=数据元素本身占用的存储量 /结点结构占用的存储量 $

储存密度越大储存空间的利用率越高.如果每个元素数据域占据的空间较小,则指针的结构性开销就占用了整个结点的大部分空间,这样存储密度较小。例如,若单链表的结点数据均为整数,指针所占用的空间和整型量相同,则单链表的存储密度为0.5。因此,如果不考虑顺序表中的空闲区,则顺序表的存储空间利用率为100%, 而单链表的存储空间利用率仅为50% .

时间性能的比较

(l)存取元素的效率

顺序表是由数组实现的,它是一种随机存取结构,指定任意一个位置序号i'都可以在0(1)时间内直接存取该位置上的元素,即取值操作的效率高;而链表是一种顺序存取结构,按位置访问链表中第!个元素时,只能从表头开始依次向后遍历链表,直到找到第i个位置上的元素,时间复杂度为O(n), 即取值操作的效率低。基于此,若线性表的主要操作是和元素位置紧密相关的这类取值操作,很少做插入或删除时,宜采用顺序表作为存储结构。

(2)插入和删除操作的效率

对千链表,在确定插入或删除的位置后,插入或删除操作无需移动数据,只需要修改指针,时间复杂度为0(1)。而对千顺序表,进行插入或删除时,平均要移动表中近一半的结点,时间复杂度为O(n)。尤其是当每个结点的信息量较大时,移动结点的时间开销就相当可观。基千此,对千频繁进行插入或删除操作的线性表,宜采用链表作为存储结构。

线性表的合并

1.先分别获取LA表长m和LB表长n。

2.从LB中第1个数据元素开始,循环n次执行以下操作:

  • 从LB中查找第i(1 ::Si::Sn)个数据元素赋给e;
  • 在LA中查找元素e,如果不存在,则将e插在表LA的最后。

顺序有序表的合并

1.创建一个表长为m+n的空表LC。

2.指针pc初始化,指向LC的第一个元素。

3.指针pa和pb初始化,分别指向LA和LB的第一个元素。

4.当指针pa和pb均未到达相应表尾时,则依次比较pa和pb所指向的元素值,从LA或LB中"摘取“元素值较小的结点插入到LC的最后。

5.如果pb巳到达LB的表尾, 依次将LA的剩余元素插入LC的最后。

6.如果pa已到达LA的表尾, 依次将LB的剩余元素插入LC的最后。

链表有序表的合并

1.指针pa和pb初始化,分别指向LA和LB的第一个结点。

2.LC的结点取值为LA的头结点。

3.指针pc初始化,指向LC的头结点。

4.当指针pa 和 pb 均未到达相应表尾时,则依次比较pa和 pb 所指向的元素值,从 LA 或LB中"摘取“元素值较小的结点插入到LC的最后。

5.将非空表的剩余段插入到pc所指结点之后。

6.释放LB的头结点。

posted @   RigelStar  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示