链表和顺序表的比较
顺序表和链表的读后感
顺序表和链表的读后感
学完顺序表和链表之后,我就感觉像是走进了两个不同风格的小世界呢。
先说这个顺序表吧,就像是住在公寓里,每个房间都有固定的编号,大家按顺序住在里面。
数据就老老实实地一个挨着一个排排坐。
这种结构很整齐,看起来特别舒服,就像阅兵方阵一样,规规矩矩的。
查找的时候呢,如果知道位置,就像你知道朋友住在几零几房间一样,一下子就能找到。
但是啊,这公寓要是住满了想再塞个人进来,或者中间有人搬走了,后面的人要集体搬家腾地方,那可就麻烦大了。
这就好比顺序表要插入或者删除一个元素,后面的元素都得跟着动一动,这得多费劲啊。
再看看链表呢,这就像是一群人手拉手在跳舞。
每个元素就是一个舞者,除了自己的数据之外,还拉着下一个舞者的手(指针指向下一个节点)。
它可就灵活多啦,想在这个舞蹈队伍中间加个人或者拉个人出去,只要把旁边两个人的手重新拉一拉就好了,其他的人可以继续愉快地跳舞,不用像顺序表那样大动干戈。
不过呢,链表也有它的小烦恼。
要是想找队伍里的某个人,可就不能像顺序表那样直接奔着房间号去了,得从队伍开头一个一个顺着找,就像在人群里找人一样,有点麻烦。
总的来说,顺序表和链表就像是两个性格迥异的小伙伴。
顺序表老实稳重,适合那种规规矩矩、很少变动的数据存储;而链表呢,就像个调皮灵活的小精灵,对于需要经常变动数据的情况就比较拿手。
它们俩各有各的好,就看在什么场景下用谁更合适啦。
这就像生活中,不同的工具在不同的工作里发挥着自己独特的作用一样,真是特别有趣的两种数据结构呢!。
比较顺序存储结构和链式存储结构
1、试比较顺序存储结构和链式存储结构的优缺点;在什么情况下用顺序表比链表好答:① 顺序存储时,相邻数据元素的存放地址也相邻逻辑与物理统一;要求内存中可用存储单元的地址必须是连续的;优点:存储密度大=1,存储空间利用率高;缺点:插入或删除元素时不方便;②链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针优点:插入或删除元素时很方便,使用灵活;缺点:存储密度小<1,存储空间利用率低;顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作;若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表;顺序表与链表的比较基于空间的比较存储分配的方式顺序表的存储空间是静态分配的链表的存储空间是动态分配的存储密度 = 结点数据本身所占的存储量/结点结构所占的存储总量顺序表的存储密度 = 1链表的存储密度 < 1基于时间的比较存取方式顺序表可以随机存取,也可以顺序存取链表是顺序存取的插入/删除时移动元素个数顺序表平均需要移动近一半元素链表不需要移动元素,只需要修改指针顺序表和链表的比较顺序表和链表各有短长;在实际应用中究竟选用哪一种存储结构呢这要根据具体问题的要求和性质来决定;通常有以下几方面的考虑:┌───┬───────────────┬───────────────┐│ │ 顺序表│链表│├─┬─┼───────────────┼───────────────┤│基│分│静态分配;程序执行之前必须明确│动态分配只要内存空间尚有空闲,││于│配│规定存储规模;若线性表长度n变│就不会产生溢出;因此,当线性表││空│方│化较大,则存储规模难于预先确定│的长度变化较大,难以估计其存储││间│式│估计过大将造成空间浪费,估计太│规模时,以采用动态链表作为存储││考│ │小又将使空间溢出机会增多; │结构为好; ││虑├─┼───────────────┼───────────────┤││存│为1;当线性表的长度变化不大, │<1 │││储│易于事先确定其大小时,为了节约││││密│存储空间,宜采用顺序表作为存储││││度│结构; ││├─┼─┼───────────────┼───────────────┤│基│存│随机存取结构,对表中任一结点都│顺序存取结构,链表中的结点,需││于│取│可在O1时间内直接取得│从头指针起顺着链扫描才能取得;││时│方│线性表的操作主要是进行查找,很│││间│法│少做插入和删除操作时,采用顺序│││考││表做存储结构为宜; │││虑├─┼───────────────┼───────────────┤││插│在顺序表中进行插入和删除,平均│在链表中的任何位置上进行插入和│││入│要移动表中近一半的结点,尤其是│删除,都只需要修改指针;对于频│││删│当每个结点的信息量较大时,移动│繁进行插入和删除的线性表,宜采│││除│结点的时间开销就相当可观; │用链表做存储结构;若表的插入和││ │操│ │删除主要发生在表的首尾两端,则││ │作│ │采用尾指针表示的单循环链表为宜│为什么在单循环链表中设置尾指针比设置头指针更好答:尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便,设一带头结点的单循环链表,其尾指针为rear,则开始结点和终端结点的位置分别是rear->next->next 和 rear, 查找时间都是O1; 若用头指针来表示该链表,则查找终端结点的时间为On;在链表中设置头结点有什么好处头结点即在链表的首元结点之前附设的一个结点,该结点的数据域可以为空,也可存放表长度等附加信息,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理,编程更方便;。
数据结构中顺序表与链表的性能方面比较
数据结构中顺序表与链表的性能⽅⾯⽐较
⼀,时间性能的⽐较
顺序表由数组实现,是⼀种随机存取结构,对表中任意节点存取操作时间复杂度为O(1)。
⽽查找链表的节点,须从头指针开始沿链扫描,平均时间复杂度为O(N).因此,若线性表的操作主要是查找,很少进⾏插⼊或删除操作,采⽤顺序⽐较合适。
对于链表,对某个节点进⾏插⼊删除操作只需修改指针,⽆需⼤量移动元素,平均时间复杂度为O(1)。
⽽顺序表在插⼊或删除时,需要⼤量移动数据元素,平均移动元素的数⽬为表长的⼀般,时间复杂度为O(N)。
因此,对线性表频繁的进⾏插⼊删除操作时,应采⽤链表。
当插⼊和删除主要在表头或表尾时,应采⽤循环链表。
表1:时间性能⽐较
时间复杂度查找插⼊或删
除
顺序表O(1)O(N)
链表O(N)O(1)
⼆,空间性能的⽐较
1,顺序表的存储空间是静态分配的,必须提前确定其内存⼤⼩。
常⽤于存储规模容易确定的线性表。
2,动态链表的存储空间是动态分配的,只要其内存空间有空闲就不会出现溢出。
常⽤于长度变化较⼤或长度难以估计的线性表。
3,定义:存储密度=(节点中数据域占⽤的空间)/(节点结构占⽤的存储空间)
有时需考虑存储密度。
综上,在选取线性表时,应综合考虑时间和空间因素,选择⼀中最适合的。
⼀般⽽⾔,顺序表适⽤于查询,⽽链表则更便于插⼊删除管理。
chap2数据结构,顺序表,树,图,链表,排序
2.4 一元多项式的表示
ADT List { 数据对象: D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } { 称 n 为线性表的表长; 称 n=0 时的线性表为空表。} 数据关系:
R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,...,n }
{ 设线性表为 (a1,a2, . . . ,ai,. . . ,an), 称 i 为 ai 在线性表中的位序。}
i = 1; found = TRUE; while ( i<= La_len && found ) {
GetElem(LA, i, e); // 取得LA中一个元素
if (LocateElem(LB, e, equal( ))
i++;
// 依次处理下一个
else found = FALSE;
// LB中没有和该元素相同的元素
{加工型操作} ClearList( &L ) ( 线性表置空 ) PutElem( &L, i, &e ) ( 改变数据元素的值 ) ListInsert( &L, i, e ) ( 插入数据元素 ) ListDelete( &L, i, &e ) ( 删除数据元素 )
ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, e ) 初始条件: 线性表 L 已存在, 且 1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值和 e 相同。
线性结构的基本特征: 线性结构 是 一个数据元素的有序(次序)集 1.集合中必存在唯一的一个“第一元素” 2.集合中必存在唯一的一个 “最后元素”
顺序表与链表的比较
顺序表与链表的比较一、顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配.它的优点是:(1)方法简单,各种高级语言中都有数组,容易实现.(2)不用为表示节点间的逻辑关系而增加额外的存储开销.(3)顺序表具有按元素序号随机访问的特点。
缺点:(1)在顺序表中做插入、删除操作时,平均移动表中的一半元素,因此对n较大的顺序表效率低。
(2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出.二、在链表中逻辑上相邻的数据元素,物理存储位置不一定相邻,它使用指针实现元素之间的逻辑关系。
并且,链表的存储空间是动态分配的。
链表的最大特点是:插入、删除运算方便。
缺点:(1)要占用额外的存储空间存储元素之间的关系,存储密度降低。
存储密度是指一个节点中数据元素所占的存储单元和整个节点所占的存储单元之比。
(2)链表不是一种随机存储结构,不能随机存取元素.三、顺序表与链表的优缺点切好相反,那么在实践应用中怎样选取存储结构呢?通常有以下几点考虑:(1)顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模,也就是说事先对“MaxSize”要有合适的设定,设定过大会造成存储空间的浪费,过小造成溢出。
因此,当对线性表的长度或存储规模难以估计时,不宜采用顺序表。
然而,链表的动态分配则可以克服这个缺点.链表不需要预留存储空间,也不需要知道表长如何变化,只要内存空间尚有空闲,就可以再程序运行时随时地动态分配空间,不需要时还可以动态回收。
因此,当线性表的长度变化较大或者难以估计其存储规模时,宜采用动态链表作为存储结构.但在链表中,除数据域外海需要在每个节点上附加指针.如果节点的数据占据的空间小,则链表的结构性开销就占去了整个存储空间的大部分.当顺序表被填满时,则没有结构开销.在这种情况下,顺序表的空间效率更高。
由于设置指针域额外地开销了一定的存储空间,从存储密度的角度来讲,链表的存储密度小于1。
顺序表和静态链表异同比较
顺序表和静态链表异同⽐较
顺序表和静态链表的物理结构(即存储结构)是相同的,在计算机内存中以数组的形式保存的线性表,是⽤⼀组地址连续的存储单元依次存储数据元素的线性结构,但两者的数据结构(逻辑结构)是不同的:
顺序表:着眼于整个数组,采⽤动态分配的⼀维数组,仍然借助了指针进⾏数据操作,具体描述如下:
typedef struct
{
ElemType *elem;
int length;
int listsize;
}Sqlist;
在线性表的插⼊和删除操作时,需要借助指针来移动元素。
静态表:不设指针⽽使⽤链表结构,数组元素的⼀个分量⽤于存放数据,另⼀个⽤来作为“游标”指⽰下⼀结点在数组中的相对位置,数据的存储尽管是采⽤⼀维数组的形式存储在计算机中,但仍然是继承了链表指向不⼀定总是指向紧挨着其的结点,描述如下:
typedef struct
{
Elemtype data;
int cur;
}component,SLinkList[MAXSIZE];
这种存储结构,仍需要预先分配⼀个较⼤的空间,但在作为线性表的插⼊和删除操作时不需移动元素,仅需修改指针(游标),故仍具有链式存储结构的主要优点。
鉴于两者的数据结构不同,对⽤的数据操作也就不同。
顺序表与链表的比较
顺序表与链表的比较一、顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配。
它的优点是:(1)方法简单,各种高级语言中都有数组,容易实现。
(2)不用为表示节点间的逻辑关系而增加额外的存储开销。
(3)顺序表具有按元素序号随机访问的特点。
缺点:(1)在顺序表中做插入、删除操作时,平均移动表中的一半元素,因此对n较大的顺序表效率低。
(2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置;预先分配过小,又会造成溢出。
二、在链表中逻辑上相邻的数据元素,物理存储位置不一定相邻,它使用指针实现元素之间的逻辑关系。
并且,链表的存储空间是动态分配的。
链表的最大特点是:插入、删除运算方便。
缺点:(1)要占用额外的存储空间存储元素之间的关系,存储密度降低。
存储密度是指一个节点中数据元素所占的存储单元和整个节点所占的存储单元之比。
(2)链表不是一种随机存储结构,不能随机存取元素。
三、顺序表与链表的优缺点切好相反,那么在实践应用中怎样选取存储结构呢?通常有以下几点考虑:(1)顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模,也就是说事先对“MaxSize”要有合适的设定,设定过大会造成存储空间的浪费,过小造成溢出。
因此,当对线性表的长度或存储规模难以估计时,不宜采用顺序表。
然而,链表的动态分配则可以克服这个缺点。
链表不需要预留存储空间,也不需要知道表长如何变化,只要内存空间尚有空闲,就可以再程序运行时随时地动态分配空间,不需要时还可以动态回收。
因此,当线性表的长度变化较大或者难以估计其存储规模时,宜采用动态链表作为存储结构。
但在链表中,除数据域外海需要在每个节点上附加指针。
如果节点的数据占据的空间小,则链表的结构性开销就占去了整个存储空间的大部分。
当顺序表被填满时,则没有结构开销。
在这种情况下,顺序表的空间效率更高。
由于设置指针域额外地开销了一定的存储空间,从存储密度的角度来讲,链表的存储密度小于1.因此,当线性表的长度变化不大而且事先容易确定其大小时,为节省存储空间,则采用顺序表作为存储结构比较适宜。
(完整word版)大学数据结构期末知识点重点总结(考试专用)
第一章概论1。
数据结构描述的是按照一定逻辑关系组织起来的待处理数据元素的表示及相关操作,涉及数据的逻辑结构、存储结构和运算2。
数据的逻辑结构是从具体问题抽象出来的数学模型,反映了事物的组成结构及事物之间的逻辑关系可以用一组数据(结点集合K)以及这些数据之间的一组二元关系(关系集合R)来表示:(K, R)结点集K是由有限个结点组成的集合,每一个结点代表一个数据或一组有明确结构的数据关系集R是定义在集合K上的一组关系,其中每个关系r(r∈R)都是K×K上的二元关系3.数据类型a。
基本数据类型整数类型(integer)、实数类型(real)、布尔类型(boolean)、字符类型(char)、指针类型(pointer)b。
复合数据类型复合类型是由基本数据类型组合而成的数据类型;复合数据类型本身,又可参与定义结构更为复杂的结点类型4.数据结构的分类:线性结构(一对一)、树型结构(一对多)、图结构(多对多)5。
四种基本存储映射方法:顺序、链接、索引、散列6。
算法的特性:通用性、有效性、确定性、有穷性7.算法分析:目的是从解决同一个问题的不同算法中选择比较适合的一种,或者对原始算法进行改造、加工、使其优化8.渐进算法分析a.大Ο分析法:上限,表明最坏情况b.Ω分析法:下限,表明最好情况c.Θ分析法:当上限和下限相同时,表明平均情况第二章线性表1.线性结构的基本特征a.集合中必存在唯一的一个“第一元素”b。
集合中必存在唯一的一个“最后元素"c.除最后元素之外,均有唯一的后继d。
除第一元素之外,均有唯一的前驱2.线性结构的基本特点:均匀性、有序性3。
顺序表a.主要特性:元素的类型相同;元素顺序地存储在连续存储空间中,每一个元素唯一的索引值;使用常数作为向量长度b。
线性表中任意元素的存储位置:Loc(ki)= Loc(k0)+ i * L(设每个元素需占用L个存储单元)c. 线性表的优缺点:优点:逻辑结构与存储结构一致;属于随机存取方式,即查找每个元素所花时间基本一样缺点:空间难以扩充d.检索:ASL=【Ο(1)】e。
数据结构考题
单元练习1数据有逻辑结构和(储存结构)两种结构。
数据逻辑结构除了集合以外,还包括线性结构、树形结构和图形结构。
线性结构中的元素之间存在一对一的关系。
树形结构中的元素之间存在一对多的关系。
图形结构中的元素之间存在多对多的关系。
数据在计算机存储器内表示时,物理地址和逻辑地址相同并且是连续的,称之为顺序储存结构。
链式存储的存储结构所占空间分为两部分,一部分存放结点的值,另一部分存表示结点间的关系指针。
单元练习2顺序表相对于链表的优先的是:节省存储和随机存储。
链表相对于顺序表的优点的是:插入、删除方便。
当线性表的元素总数基本稳定,且很少进行插入、删除操作,但要求以最快速度存取表中元素时,应采取顺序存储结构。
在一个长度为n的顺序表中删除第i个元素,要移动n-i个元素。
在一个长度为n的顺序表中,如果要在第i个元素前插入一个元素,要后移动n-i+1个元素。
线性表的元素总数不确定,且经常需要进行插入和删除操作,应采用链式存储结构。
已知一个顺序表的线性表,设每个节点占m个存储单位,若第一个节点的地址为B,则第i个节点的地址为B+(i-1)*m。
两个指针P和Q,分别指向单向链表的两个元素,P所指的元素是Q所指的元素的前驱的条件是p->fromt==L。
单元练习3在线性结构中,允许插入、删除的一端称为栈顶在顺序表中,当栈顶指针top=-1时,表示栈空。
如进栈的次序的A、B、C、D、E,执行3次出栈操作后,栈顶元素为B。
4个元素按A、B、C、D顺序进S栈,执行两次Pop(S,x)运算后,x的值是C。
插入和删除操作只能在一端进行的相形表,称为栈。
设有编号为1,2,3,4的四辆列车,顺序进入一个栈结构的站台,不可能的出站顺序是1423。
经过下列栈的运算后(InitStack(s);Push(s,a);Pop(s);),在执行ReadTop(s)的值是a。
单元练习4在队列中存取数据应遵循的原则是先进先出。
队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
顺序表和链表的区别及其优缺点
顺序表和链表的区别及其优缺点1.顺序表存储(典型的数组)原理:顺序表存储是将数据元素放到⼀块连续的内存存储空间,相邻数据元素的存放地址也相邻(逻辑与物理统⼀)。
优点:###1.空间利⽤率⾼。
(局部性原理,连续存放,命中率⾼)###2.存取速度⾼效,通过下标来直接存储。
缺点:###1.插⼊和删除⽐较慢,⽐如:插⼊或者删除⼀个元素时,整个表需要遍历移动元素来重新排⼀次顺序。
###2.不可以增长长度,有空间限制,当需要存取的元素个数可能多于顺序表的元素个数时,会出现"溢出"问题.当元素个数远少于预先分配的空间时,空间浪费巨⼤。
时间性能 :查找 O(1) ,插⼊和删除O(n)。
2.链表存储原理:链表存储是在程序运⾏过程中动态的分配空间,只要存储器还有空间,就不会发⽣存储溢出问题,相邻数据元素可随意存放,但所占存储空间分两部分,⼀部分存放结点值,另⼀部分存放表⽰结点关系间的指针。
优点:###1.存取某个元素速度慢。
###2.插⼊和删除速度快,保留原有的物理顺序,⽐如:插⼊或者删除⼀个元素时,只需要改变指针指向即可。
###3.没有空间限制,存储元素的个数⽆上限,基本只与内存空间⼤⼩有关.缺点:###1.占⽤额外的空间以存储指针(浪费空间,不连续存放,malloc开辟,空间碎⽚多)###2.查找速度慢,因为查找时,需要循环链表访问,需要从开始节点⼀个⼀个节点去查找元素访问。
时间性能 :查找 O(n) ,插⼊和删除O(1)。
*频繁的查找却很少的插⼊和删除操作可以⽤顺序表存储,堆排序,⼆分查找适宜⽤顺序表.*如果频繁的插⼊和删除操作很少的查询就可以使⽤链表存储*顺序表适宜于做查找这样的静态操作;链表适宜于做插⼊、删除这样的动态操作。
*若线性表长度变化不⼤,如果事先知道线性表的⼤致长度,⽐如⼀年12⽉,⼀周就是星期⼀⾄星期⽇共七天,且其主要操作是查找,则采⽤顺序表;若线性表长度变化较⼤或根本不知道多⼤时,且其主要操作是插⼊、删除,则采⽤链表,这样可以不需要考虑存储空间的⼤⼩问题。
顺序与链表综合比较
第12讲顺序与链表综合比较顺序表和链表这两种存储表示方法各有优缺点。
在实际应用中究竟选用哪一种存储结构呢?这要根据具体的要求和性质决定。
顺序表和链表的比较1.基于空间的考虑顺序表的存储空间是静态分配的,在程序执行之前必须明确规定它的存储规模。
若线性表的长度n变化较大,则存储规模难于预先确定。
估计过大将造成空间浪费,估计太小又将使空间溢出的机会增多。
在静态链表中,初始存储池虽然也是静态分配的,但若同时存在若干个结点类型相同的链表,则它们可以共享空间,使各链表之间能够相互调节余缺,减少溢出机会。
动态链表的存储空间是动态分配的,只要内存空间尚有空闲,就不会产生溢出。
因此,当线性表的长度变化较大,难以估计其存储规模时,采用动态链表作为存储结构较好。
存储密度(Storage Density)是指结点数据本身所占的存储量和整个结点结构所占的存储量之比,即:存储密度=结点数据本身所占的存储量/结点结构所占的存储总量链表中的每个结点,除了数据域外,还要额外设置指针(或游标)域,从存储密度来讲,这是不经济的。
一般地,存储密度越大,存储空间的利用率就高。
显然,顺序表的存储密度为1,而链表的存储密度小于1。
例如单链表的结点的数据均为整数,指针所占空间和整型量相同,则单链表的存储密度为50%。
因此若不考虑顺序表中的备用结点空间,则顺序表的存储空间利用率为100%,而单链表的存储空间利用率为50%。
由此可知,当线性表的长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表作为存储结构。
2.基于时间的考虑顺序表是由向量实现的,它是一种随机存取结构,对表中任一结点都可以在O(1) 时间内直接地存取,而链表中的结点,需从头指针起顺着链找才能取得。
因此,若线性表的操作主要是进行查找,很少做插入和删除时,宜采用顺序表做存储结构。
在链表中的任何位置上进行插入和删除,都只需要修改指针。
而在顺序表中进行插入和删除,平均要移动表中近一半的结点,尤其是当每个结点的信息量较大时,移动结点的时间开销就相当可观。
线性表顺序存储与链式存储的比较
• • 但在链表中,除数据域外还需要在每个节点上附加指 针。如果节点的数据占据的空间小,则链表的结构性开销 就占去了整个存储空间的大部分。当顺序表被填满时,则 没有结构开销。在这种情况下,顺序表的空间效率更高。 由于设置指针域额外地开销了一定的存储空间,从存储密 度的角度来讲,链表的存储密度小于1.因此,当线性表的 长度变化丌大而且事先容易确定其大小时,为节省存储空 间,则采用顺序表作为存储结构比较适宜。
实践应用
(1)顺序表的存储空间是静态分配的,在程序执行之前必 须明确规定它的存储规模,也就是说事先对“MaxSize” 要有合适的设定,设定过大会造成存储空间的浪费,过小 造பைடு நூலகம்溢出。因此,当对线性表的长度或存储规模难以估计 时,丌宜采用顺序表。然而,链表的动态分配则可以克服 这个缺点。链表丌需要预留存储空间,也丌需要知道表长 如何变化,只要内存空间尚有空闲,就可以再程序运行时 随时地动态分配空间,丌需要时还可以动态回收。因此, 当线性表的长度变化较大或者难以估计其存储规模时,宜 采用动态链表作为存储结构。
•
基于运算的考虑(时间)
• 顺序存储是一种随机存取的结构,而链表则是一种顺序存 取结构,因此它们对各种操作有完全丌同的算法和时间复 杂度。例如,要查找线性表中的第i个元素,对于顺序表可 以直接计算出a(i)的的地址,丌用去查找,其时间复杂度 为0(1).而链表必须从链表头开始,依次向后查找,平均需 要0(n)的时间。所以,如果经常做的运算是按序号访问数 据元素,显然顺表优于链表。 • 反之,在顺序表中做插入,删除时平均移动表中一半 的元素,当数据元素的信息量较大而且表比较长时,这一 点是丌应忽视的;在链表中作插入、删除,虽然要找插入 位置,但操作是比较操作,从这个角度考虑显然后者优于 前者。
顺序表和链表的比较
顺序表和链表的⽐较
通常从空间性能和时间性能两个⽅⾯⽐较分析:
1.空间性能的⽐较
线性表长度变化⼤,难以预估存储规模,⽤链表
线性表长度变化不⼤,能事先确定存储⼤⼩,⽤顺序表
a.存储空间的分配
顺序表的存储空间必须预先分配,元素个数扩充受限,易造成存储空间浪费或空间溢出现象;链表⽆需预先分配空间,内存空间允许时,元素个数⽆限制。
b.存储密度的⼤⼩
不考虑顺序表中的空闲区,顺序表存储空间利⽤率为100%,存储密度为1;
链表存储空间利⽤率⼩于100%,存储密度⼩于1,单链表存储密度为0.5。
长度变化不⼤,且事先确定存储⼤⼩,采⽤顺序表可节约存储空间。
2.时间性能的⽐较
很少查找,频繁插⼊或删除,⽤链表
频繁查找,很少插⼊或删除,⽤顺序表
a.存取元素的效率
顺序表是由数组实现的随机存取结构,根据位置序号实现取值操作,效率⾼时间复杂度O(1);链表是顺序存取结构,从表头开始依次向后遍历链表,取值效率底时间复杂度O(n)。
b.插⼊和删除操作的效率
链表插⼊或删除⽆需移动数据,只修改指针,时间复杂度为O(1);
顺序表插⼊或删除时,平均要移动表中近⼀半的结点,时间复杂度为O(n)。
线性表之顺序表与单链表的区别及优缺点
线性表之顺序表与单链表的区别及优缺点线性表主要有顺序表和链表两种存储形式,贴主想问的,应该是将线性表la和l b头尾连接,要求时间复杂度为o(1),且占用辅助空间尽量小.应该使用哪种存储形式对吧?答案是应当采用链表。
具体理由看文章。
这里比较的是基于C语言实现的顺序表与单链表,与其他语言的实现可能会有差异,但我相信语言是相通的,它们的实现机制应该也差不多。
1、What什么是顺序表和单链表①顺序表:顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤i≤n 其中,L 是元素占用存储单元的长度。
②单链表:单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。
它的数据是以结点(类型一般为结构体)来表示的,每个结点的构成:数据(类型为要存储的数据的类型)+ 指针(结构体指针),数据就是链表里具体要存储的东西,指针就是用来把每个节点都连接起来,使它们形成一个链状。
结点:链表:2、Compare二者的优缺点比较①空间上的比较(Space)a. 空间的开辟:顺序表的实现一般是实现连续开辟一段空间,然后在进行数据的增删查改(静态顺序表),所以顺序表一般是固定空间大小的;而单链表则是一次只开辟一个结点的空间,用来存储当前要保存的数据及指向下一个结点或NULL的指针,所以单链表的空间大小时动态变化的。
(当然,顺序表也可以在初始化时利用mallo c函数来开辟一块空间,每当空间不够用时,再用realloc来把当前空间扩容成2倍,从而也能实现空间的动态变化(动态顺序表))。
、b. 空间的使用:当我们不知道要存储多少数据时,用顺序表来开辟的空间如果太大,就会造成一定程度上的浪费,而用单链表是实现时,因为是每需要存储一个数据时,才开辟一个空间,虽然有非数据项的指针占空间,但相比顺序表来说,浪费不是那么明显;反之,当我们知道存储的数据的数量时,用顺序表来开辟对应的空间大小,来存储数据,因为顺序表中每个元素的存储密度为1,就完全不会有浪费的空间,而用单链表,因为每个结点都会有非数据项得指针,那么就会造成空间的浪费。
数据结构第二章习题(2)
1.数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为:
(A)存储结构 (B)逻辑结构 (C)顺序存储结构 (D)链式存储结构
2.一个向量第一个元素的存储地址是 100,每个元素的长度为 2,则第 5 个元素的地址是
(A)110 (B)108
(C)100
(D)120
3.在 n 个结点的顺序表中,算法的时间复杂度是 O(1)的操作是: (A)访问第 i 个结点(1≤i≤n)和求第 i 个结点的直接前驱(2≤i≤n) (B)在第 i 个结点后插入一个新结点(1≤i≤n) (C)删除第 i 个结点(1≤i≤n) (D)将 n 个结点从小到大排序
五、线性表具有两种存储方式,即顺序方式和链接方式。现有一个具有五个元素的线性表
L={23,17,47,05,31},若它以链接方式存储在下列 100~119 号地址空间中,每个结点
由数据(占 2 个字节)和指针(占 2 个字节)组成,如下所示:
05 U 17 X 23 V 31 Y 47 Z
^
^
100
情况下适用于使用链式结构实现。
(A)需经常修改L中的结点值
(B)需不断对L进行删除插入
(C)L中含有大量的结点
(D)L中结点结构复杂
9.单链表的存储密度
(A)大于 1; (B)等于 1; (C)小于 1; (D)不能确定
10.设 a1、a2、a3 为 3 个结点,整数 P0,3,4 代表地址,则如下的链式存储结构称为
。
二、判断题
( )1. 链表的每个结点中都恰好包含一个指针。
( )2. 链表的物理存储结构具有同链表一样的顺序。
( )3. 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的
习题和答案
习题二1 简述下列术语:线性表,顺序表,链表。
线性表:最常用且最简单的一种数据结构。
一个线性表是n个数据元素的有限序列。
顺序表:是指用一组连续的存储单元一次存储线性表中的数据元素。
物理结构和逻辑结构都相邻。
链表:逻辑结构相邻的数据元素物理结构不一定相邻。
采用指针的形式连接起来。
2 何时选用顺序表,何时选用链表作为线性表的存储结构合适?各自的主要优缺点是什么?不需要经常大量的修改表或需要随机存取的情况下可以选用顺序表;相反需要经常大量的修改表,但不是频繁的随机存取的情况下可选用链式表。
3 在顺序表中插入和删除一个结点平均需要移动多少个结点?具体的移动次数取决于哪两个因素?答:平均需要移动n/2个结点。
表的长度,和要插入的位置。
4 链表所表示的元素是否有序?如有序,则有序性体现于何处?链表所表示的元素是否一定要在物理上是相邻的?有序表的有序性又如何理解?答:有序。
有序性体现在通过指针数据元素有序的相连。
物理上不一定要相邻。
5 设顺序表L是递增有序表,试写一算法,将x插入到L中并使L仍是递增有序表。
Status ListInsert(SqList &L,int i,ElemType e){if((i>+1)||i<1)return ERROR;if>={newbase=(ElemType *)realloc(+LISTINCREMENT)*sizeof(ElemType));if(!newbase)exit(-1);=newbase;+=LISTINCREMENT;}ElemType *q,*p;q=&[i-1];for(p=&[];p>=q;p--)*(p+1)=*p;*q=e;++;return OK;}9 设A和B是两个按元素值递增有序的单链表,写一算法将A和B归并为按按元素值递减有序的单链表C,试分析算法的时间复杂度。
void ListInsert(SqList A,SqList B,SqList C){ElemType *p,*q,*s;P=&A;q=&B;s=&C;while!=NULL||!=NULL){if {if!=NULL)=;=;p++;}else{if!=NULL)=;=;q++;}}while!=NULL){=;=;}while!=NULL){=;=;}习题三1 设有一个栈,元素进栈的次序为a, b, c。
顺序表和链表的区别
顺序表和链表的区别⾸先了解顺序表和链表的概念1.顺序表顺序表是在计算机内存中以的形式保存的线性表,是指⽤⼀组地址连续的依次存储的线性结构。
线性表采⽤顺序存储的⽅式存储就称之为顺序表。
顺序表是将表中的结点依次存放在计算机内存中⼀组地址连续的中。
特点:(1)在顺序表中,各个表项的逻辑顺序与其存储的物理顺序⼀致,即第 i 个表项存储于第 i 个物理位置(1 < i < n)(2)对顺序表中的所有表项,即可以进⾏顺序的访问,也可以随机的访问,也就是说,既可以从表的第⼀个表项开始逐个访问表项也可以按照表项的序号(下标)直接的访问。
(3)⽆需为表⽰结点间的逻辑关系⽽增加额外的存储空间,存储利⽤率提⾼。
(4)可以⽅便的存储表中的任⼀结点,存储速度快。
2.链表链表是⼀种物理上⾮连续、⾮顺序的,的逻辑顺序是通过链表中的链接次序实现的。
链表由⼀系列结点(链表中每⼀个元素称为结点)组成,结点可以在运⾏时动态⽣成。
每个结点包括两个部分:⼀个是存储的数据域,另⼀个是存储下⼀个结点地址的域。
相⽐于,操作复杂。
特点:(1)可以⽅便的进⾏扩充。
(2)可以⽅便的删除和插⼊。
由于顺序表:1)在表中插⼊新元素或删除⽆⽤元素时,为了保持其他元素的相对次序不变,平均需要移动⼀半元素,运⾏效率低2)由于顺序表要求占⽤连续的空间,如果预先进性存储分配。
则当表长度变化较⼤时,难以确定合适的存储空间带⼤⼩,若按可能达到的最⼤的长度预先分配表的空间,则容易造成⼀部分空间长期的限制⽽得不到充分的利⽤,若事先对表中的空间估计不⾜则插⼊操作可能是表长超过预先的内存⽽造成内存溢出,但如果采⽤指针的⽅式定义数组,在程序运⾏时动态的分配内存,⼀旦需要就可以分配他,这样可以扩充内存,但是是时间开销⽐较⼤因此这就可以采⽤链表很好的解决。
数据结构课后习题答案
线性表:是具有相同属性的n(n≥0)个数据元素的有限序列。
顺序表:顺序表(Sequential List)是采用顺序存储结构的线性表。
{if(p->data!=q->data) q=q->next;
else {p=p->next; q=y;}
}return p;}
2.10 已知递增有序的两个单链表A和B各存储了一个集合。设计算法实现求两个集合的交集运算C=A∩B。
typedef intDataType;
typedefstructNode
structNode*next;
}LinkList;
intdeleteDupNode(LinkList*L,DataTypeitem)
{LinkList *p,*q,*r;
q=L;p=L->next;
while (p)
if (p->data==item){q->next=p->next;free(p);p=q->next;}
三种经典结构:线性表、树和图。
线性表:有且仅有一个开始结点和一个终端结点,其余的内部结点都有且仅有一个前趋结点和一个后继结点,数据元素间存在着一对一的相互关系。
树:有且仅有一个开始结点,可有若干个终端结点,其余的内部结点都有且仅有一个前趋结点,可以有若干个后继结点,数据元素间存在着一对多的层次关系。
q=L->next->next;L->next->next=NULL;
数据结构 耿国华 西北大学 2-8顺序表与单链表比较和总结与提高
先进行静态分配。因此当表长变化较大时,难以确定合 适的存储规模。
返回 19
第 2 章 线性表 2.3 线性表的链式存储结构
定义: 采用链式存储结构的线性表称为链表 。
静态链表
单链表
实现角度
链接方式 双链表
动态链表
循环链表
20
第 2 章 线性表 2.3 线性表的链式存储结构
{ LC->elem[k]= LB->elem[j]; j++; k++; }
LC->last=LA->last+LB->last+1;
}
18
第 2 章 线性表
2.2 线性表的顺序存储结构
优点:
①无须为表示结点间的逻辑关系而增加额外的存储空间 ;②可方便地随机存取表中的任一元素。 缺点:
① 插入或删除运算不方便,除表尾的位置外,在表的其 它位置上进行插入或删除操作都必须移动大量的结点
25
第 2 章 线性表 2.3 线性表的链式存储结构
单链表上的基本运算 ①建立单链表 ②单链表查找 ③单链表插入 ④单链表删除 ⑤求单链表的长度
26
第 2 章 线性表 2.3 线性表的链式存储结构
① 建立单链表
尾插法建表 将新结点插到当前单链表的表尾上。 增加一个尾指针r,使之指向当前单链表的表尾。
2.1 线性表及其抽象数据类型
抽象数据类型定义
ADT LinearList{
数据元素:D={ai| ai∈D0, i=1,2,…,n ; n≥0 ,D0为某一数据对象}
关系:S= <ai,ai+1> | ai, ai+1∈D0,i=1,2, …,n-1} 基本操作:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分配方式
静态分配。程序执行之前必须明确规定存储规模。若线性表长度n变化较大,则存储规模难于预先确定估计过大将造成空间浪费,估计太小又将使空间溢出机会增多。
动态分配。只要内存空间尚有空闲,就不会产生溢出。因此,当线性表的长度变化较大,难以估计其存储规模时,以采用动态链表作为存储结构为好。
存储密度
为1。当线性表的长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表作为存储结构。
<1。
基于时间考虑
存取方法
随机存取结构,对表中任一结点都可在O(1)时间内直接取得。线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜。
顺序存取结构,链表中的结点,需从头指针起顺着链扫描才能取得。
插入删除操作
在顺序表中进行插入和删除,平均要移动表中近一半的结点,尤其是当每个结点的信息量较大时,移动结点的时间开销就相当可观。
在链表中的任何位置上进行插入和删除,都只需要修改指针。对于频繁进行插入和删除的线性表,宜采用链表做存储结构。若表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。