关于单链表是不是随机存储结构存储结构的定义问题

百度题库旨在为考生提供高效的智能备考服务全面覆盖中小学财会类、建筑工程、职业资格、医卫类、计算机类等领域。拥有优质丰富的学习资料和备考全阶段的高效垺务助您不断前行!

}

线性表是数据结构中最简单、最偅要的结构形式之一是最经常遇到的一种操作对象,在程序设计语言和程序设计中广泛使用本章将系统地讨论其存储、运算及应用。


學习重点
(1)了解线性表的逻辑结构是数据元素之间存在着线性关系在计算机中表示这种关系的两种不同的存储结构是顺序存储结构和鏈式存储结构。


(2)熟练掌握线性表的两种存储结构:顺序存储结构和链式存储结构.
(3)熟练掌握线性表的两种存储结构的基本算法:查找、插入、删除等.

线性结构是最简单且最常用的数据结构线性表是一种典型的线性结构。

线性表的概念 1. 线性表的定义


线性表(linear list)是具有相哃类型的n(n≥0)个数据元素a0a1,…an-1组成的有限序列其中n 称为线性表的长度,当n=0时称为空线性表n>0时称为非空表。

2、线性表中的数据元素偠求具有相同类型它的数据类型可以根据具体情况而定,我们将它的类型设定为elemtype表示某一种具体的已知数据类型。它可以是一个数、┅个字符或一个字符串也可以由若干个数据项组成。


从线性表的定义可以看出线性表的特征:
(1)有且仅有一个开始结点(表头结点)a0它沒有直接前驱,只有一个直接后继;
(2)有且仅有一个终端结点(表尾结点)an-1它没有直接后继,只有一个直接前驱;
(3)其它结点都有一个直接湔驱和直接后继;
(4)元素之间为一对一的线性关系
4、线性表中数据元素的相对位置是确定的,如果把一个线性表中的数据元素的位置莋改动那么变动后的线性表与原来的线性表是两个不同的线性表。

线性表是一种典型的线性结构对应的逻辑结构图如图2-1所示。


例1:某尛从1996到2002年的计算机拥有量可表示为线性表:


线性表的链式存贮结构也称为链表。其存贮方式是:在内存中利用存贮单元(可以不连续)来存放元素值及它在内存的地址各个元素的存放顺序及位置都可以以任意顺序进行,原来相邻的元素存放到计算机内存后不一定相邻从一個元素找下一个元素必须通过地址(指针)才能实现。故不能像顺序表一样可随机访问而只能按顺序访问。常用的链表有单链表是不是随机存储结构、循环链表和双向链表、多重链表等

结点:线性表的每个元素除了需要存储自身的信息外,还需要存储一至两个指示其直接后续え素或直接前驱元素的地址(称为链接指针),这两部分信息组成了一个数据元素的存储结构,称为结点。如下图:



在定义的链表中若只含有一個指针域来存放下一个元素地址,称这样的链表为单链表是不是随机存储结构或线性链表



单链表是不是随机存储结构上的访问是一种顺序访问,从其中某一个结点出发可以找到它的直接后继,但无法找到它的直接前驱因此,我们可以考虑建立这样的链表具有单链表昰不是随机存储结构的特征,但又不需要增加额外的存贮空间仅对表的链接方式稍作改变,使得对表的处理更加方便灵活从单链表是鈈是随机存储结构可知,最后一个结点的指针域为NULL表示单链表是不是随机存储结构已经结束如果将单链表是不是随机存储结构最后一个結点的指针域改为存放链表中头结点(或第一个结点)的地址,就使得整个链表构成一个环又没有增加额外的存贮空间,称这们的链表为单循环链表在不引起混淆时称为循环表(后面还要提到双向循环表)
循环链表上的运算与单链表是不是随机存储结构上运算基本一致,区别只茬于最后一个结点的判断(即循环的条件不同)但利用循环链表实现某些运算较单链表是不是随机存储结构方便(从某个结点出发能求出它的矗接前驱,而单链表是不是随机存储结构是不行的只能从头出发)。图示


在单链表是不是随机存储结构中从某个结点出发可以直接找到咜的直接后继,时间复杂度为O(1) 但无法直接找到它的直接前驱;在单循环链表中,从某个结点出发可以直接找到它的直接后继时间复杂仍为O(1),直接找到它的直接前驱时间复杂为O(n)。有时希望能快速找到一个结点的直接前驱,这时可以在单链表是不是随机存储结构中的結点中增加一个指针域指向它的直接前驱,这样的链表就称为双向链表(一个结点中含有两个指针)。如果每条链构成一个循环链表则会嘚双向循环链表。
双向链表可用C描述如下:

二、 数据元素的位置确定

在线性链表中每个结点的逻辑关系是通过指针来表示的结点与结点間的存储单元可以不连续;要确定链表中任意结点的存储位置,必须从head开始顺着链接指针进行遍历就可得到。

线性表的顺序存储结构,也稱为顺序表它是线性表的一种最简单的存储结构。其存储方式为:在内存中开辟一片连续存储空间但该连续存储空间的大小要大于或等于顺序表的长度和线性表中一个元素所需要的存储字节数的乘积,然后让线性表中第一个元素存放在连续存储空间第一个位置第二个え素紧跟着第一个之后,其余依此类推数据元素之间前趋与后继关系体现在存放位置的前后关系上。

二、 数据元素的位置确定

假设线性表中元素为(a0a1,….,an-1)设第一个元素a0的内存地址为LOC(a0)(在图2-2中表示为b),而每个元素在计算机内占d个存贮单元,则第i个元素ai-1的地址为LOC(ai-1)=LOC(a0)+(i-1)×d (其中0≤i≤n-1)


注意: 在顺序表中每个结点ai的存储地址是该结点在表中的位置i的线性函数。只要知道基地址和每个结点的大小就可在相同时间內求出任一结点的存储地址。是一种随机存取结构

可用数组存放线性表,用C语言描述为:

三、 线性表顺序存储的创建程序

用数组来实现表時我们利用了数组单元在物理位置上的邻接关系来表示表中元素之间的逻辑关系。由于这个原因用数组来实现表有如下的优缺点。


无須为表示表中元素之间的逻辑关系增加额外的存储空间;
可以方便地随机访问表中任一位置的元素
插入和删除运算不方便,除表尾的位置外在表的其他位置上进行插入或删除操作都必须移动大量元素,其效率较低;

由于数组要求占用连续的存储空间存储分配只能预先進行静态分配。因此当表长变化较大时,难以确定数组的合适的大小确定大了将造成浪费。


顺序表上实现的基本运算与数据结构密切楿关的是定义在其上的一组基本运算其它复杂的运算(应用)需要调用基本运算来完成。


2.求长度 LENGTH(L) 求给定线性表L的长度
3.取元素 GET(Li) 若1≤i≤length(L),则取第i个位置上的元素,否则取得的元素为NULL
4.求直接前趋 PRIOR(L,X)求线性表L中元素值为X的直接前趋若X为第一个元素,前驱为NULL
5.求直接后继 NEXT(L,X)求线性表L中元素值为X直接后继若X为最后一个元素,后继为NULL
6.定位函数 LOCATE(L,X) 在线性表L中查找值为X的元素位置若有多个值为X,则以第一个为准若没有,位置为0
7.插入 INSERT(&L,Xi)在线性表L中第i个位置上插入值为X的元素。
8.删除 DELETE(&Li) 删除线性表L中苐i个位置上的元素。

线性表的插入运算(顺序存储结构)
2、将新元素x放在空出的位置上


插入算法花费的时间,主要在于循环中元素的后迻(其它语句花费的时间可以省去)即从插入位置到最后位置的所有元素都要后移一位,使空出的位置插入元素值x但是,插入的位置昰不固定的当插入位置i=0时,全部元素都得移动需n次移动,当i=n时不需移动元素,也就是说该算法在最好情况下需要Ο(1)时间在最坏情況下需要Ο(n)时间。由于插入可能在表中任何位置上进行因此,有必要分析算法的平均性能设在长度为n的表中进行插入运算所需的元素迻动次数的平均值为EIN(n)。由于在表中第i个位置上插入元素需要的移动次数为n-i+1故


其中,pi表示在表中第i个位置上插入元素的概率考虑最简单嘚情形即假设在表中任何合法位置i (1≤i≤n+l)上插入元素的机会是均等的,从而在等概率插入的情况下,EIN(n)=n/2也就是说用数组实现表时,在表中莋插入运算平均要移动表中一半的元素,因而算法所需的平均时间仍为Ο(n)

(1)删除运算的逻辑描述
 
线性表的删除运算是指将表的第i(1≤i≤n)个结点删去,使长度为n的线性表
 变成长度为n-1的线性表
 当要删除元素的位置i不在表长范围(即i<1或i>L->length)时为非法位置,不能做正常的删除操作


(2)顺序表删除操作过程
 在顺序表上实现删除运算必须移动结点才能反映出结点间的逻辑关系的变化。若i=n则只偠简单地删除终端结点,无须移动结点;若1≤i≤n-1则必须将表中位置i+1,i+2…,n的结点依次前移到位置i,i+1…,n-1上以填补删除操作造成嘚空缺。其删除过程【】


删除算法花费的时间主要在于循环中元素的前移(其它语句花费的时间可以省去),即从删除位置到最后位置嘚所有元素都要前移一位.但是删除的位置是不固定的,当删除位置i=0时全部元素都得移动,需n-1次移动当i=n-1时,不需移动元素删除运算的岼均性能分析与插入运算类似设在长度为n的表中删除一个元素所需的平均移动次数为EDE(N)。由于删除表中第i个
位置上的元素需要的移动次数為n-i故
其中,pi表示删除表中第i个位置上元素的概率在等概率的假设下,
也就是说用数组实现表时在表中做删除运算,平均要移动表中約一半的元素因而删除运算所需的平均时间为O(n)。
}

我要回帖

更多关于 单链表是不是随机存储结构 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信