ImageVerifierCode 换一换
格式:DOCX , 页数:45 ,大小:144.01KB ,
资源ID:25170650      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25170650.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单链表双链表循环链表和静态链表的习题.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

单链表双链表循环链表和静态链表的习题.docx

1、单链表双链表循环链表和静态链表的习题单链表、双链表、循环链表和静态链表的习题一、单项选择题1.关于线性表的顺序存储结构和链式存储结构的描述中,正确的是( )。1.线性表的顺序存储结构优于其链式存储结构n .链式存储结构比顺序存储结构能更方便地表示各种逻辑结构川.如频繁使用插入和删除结点操作,顺序存储结构更优于链式存储结构IV .顺序存储结构和链式存储结构都可以进行顺序存取a. i、n、川 b. n、v c. n、川 d. m、v2.对于一个线性表既要求能够进行较快速地插入和删除, 又要求存储结构能反映数据之间的逻辑关系,则应该用()。A.顺序存储方式 B.链式存储方式 C.散列存储方式 D.以

2、上均可以3.对于顺序存储的线性表,其算法的时间复杂度为 0(1)的运算应该是()。A.将n个元素从小到大排序 B.删除第i个元素(1in )C.改变第i个元素的值(1=i=n ) D.在第i个元素后插入一个新元素(1=in ext=p-n ext;p-n ext=s; B.p-n ext=s-n ext; s-n ext=p;C. q-n ext=s;s-n ext=p; D. p-n ext=s;s-n ext=q;7.给定有n个元素的一维数组,建立一个有序单链表的最低时间复杂度是( )。A.O(1) B. 0(n) C. 0(n2 ) D. O(nlog2n)8.将长度为n的单链表链接在长

3、度为 m的单链表后面,其算法的时间复杂度釆用大 O形式表示应该是()。A.0(1) B. 0(n) C. 0(m) D. 0(n+m)9单链表中,增加一个头结点的目的是为了( )。A.使单链表至少有一个结点 B.标识表结点中首结点的位置C.方便运算的实现 D.说明单链表是线性表的链式存储10.在一个长度为n的带头结点的单链表 h上,设有尾指计r,则执行()操作与链表的表长有关。A.删除单链表中的第一个元素B.删除单链表中最后一个元素C.在单链表第一个元素前插入一个新元素D.在单链表最后一个元素后插入一个新元素11.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是( );对于不

4、带头结点的单链表,则判定空表的条件为( )。A .head=NULL B .head-next=NULLC. head- next=head D. head!=NULL12.下面关于线性表的一些说法中,正确的是( )。A .对一个设有头指针和尾指针的单链表执行删除最后一个元素的操作与链表长度无关B.线性表中每个元素都有一个直接前趋和一个直接后继C.为了方便插入和删除数据,可以使用双链表存放数据D.取线性表第i个元素的时间同i的大小有关13.某线性表中最常见的操作是在最后一个元素之后插入一个元素和删除第一个元素,则釆 用()存储方式最省时间。A.单链表 B.仅有头指针的单循环链表C.双链表 D.

5、仅有尾指针的单循环链表14.在双链表中向p所指的结点之前插入一个结点 q的操作为()。A. p_prior=q ;q_n ext=p;p_prior- n ext=q;q_prior=p_prior;B .q_prior=p_prior;p_prior- n ext=q; q-n ext=p;p-priop=q-n ext;C. q_n ext=p;p-n ext=q;q-prior- n ext=q; q_n ext=p;D .p-prior- n ext=q; q-n ext=p; q_prior=p_prior;p_prior=q;15.在双向链表存储结构中,删除 p所指的结点时必须修改

6、指针( )。A .p-ll in k-rl in k=p-rl ink; p-rli nk-lli nk=p-ll ink;B.p-lli nk=p-lli nk-lli nk;p-lli nk-rl in k=p;C.p-rl in k-ll in k=p; p-rl ink = p-rl in k-rli nk;D .p-rli nk=p-ll in k-ll in k;p-ll in k=p-rl in k-rl ink;16.在长度为n的有序单链表中插入一个新结点,并仍然保持有序的时间复杂度是( )。17.与单链表相比,双链表的优点之一是( )。A.插入、删除操作更方便 B可以进行随机

7、访问C.可以省略表头指针或表尾指针 D.访问前后相邻结点更灵活18.带头结点的双循环链表 L为空的条件是( )。A. L-prior=L&L-n ext=NULLB.L-prior=NULL&L- next=NULLC.L-prior=NULL&L- next=LD.L-prior=L&L-n ext=L19.一个链表最常用的操作是在末尾插入结点和删除结点,则选用( )最节省时间。A.带头结点的双循环链表 B.单循环链表C.带尾指针的单循环链表 D.单链表20.设对n(n1)个元素的线性表的运算只有 4种:删除第一个元素;删除最后一个元素;第一个元素之前插入新元素;在最后一个元素之后插入新元素

8、,则最好使用( )。A.只有尾结点指计没有头结点指针的循环单链表B.只有尾结点指针没有头结点指针的非循环双链表C.只有头结点指针没有尾结点指针的循环双链表D.既有头结点指针也有尾结点指针的循环单链表21.则选个链表最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素, 用()最节省时间。A.不带头结点的单循环链表 B.双链表C.不带头结点且有尾指针的单循环链表 D.单链表22.静态链表中指针表示的是( )。A.下一元素的地址 B.内存储器地址C.下一个元素在数组中的位置 D.左链或右链指向的元素的地址|23需要分配较大的空间,插入和删除不需要移动元素的线性表,其存储结构为( )。A.单

9、链表 B.静态链表 C.顺序表 D.双链表二、综合应用题1.设计一个递归算法,删除不带头结点的单链表 L中所有值为x的结点。2.在带头结点的单链表 L中,删除所有值为x的结点,并释放其空间,假设值为 x的结点不唯一,试编写算法以实现上述操作。3.设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。4. 试编写在带头结点的单链表 L中删除一个最小值结点的高效算法(假设最小值结点是唯一 的)。5试编写算法将带头结点的单链表就地逆置,所谓“就地”是指辅助空间为 0(1)。6.有一个带头结点的单链表 L,设计一个算法使其元素递增有序。7.设在一个带表头结点的单链表中所有元素结点的数据值无

10、序, 试编写一个函数,删除表中所有大于最小值小于最大值的元素(若存在 )。8.给定两个单链表,编写算法找出两个链表的公共结点。9.给定一个带表头结点的单链表, 设head为头指针,结点的结构为(data, next) , data为整型元素,next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间(要求:不允许使用数组作为辅助空间)。10.将一个带头结点的单链表 A分解为两个带头结点的单链表 A和B,使得A表中含有原表中序号为奇数的元素,而 B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。11.设C=a1, b1, a2, b2, ,an, bn为线

11、性表,釆用带头结点的 hc单链表存放,设计一个就地算法,将其拆分为两个线性表,使得 A=a1, a2,an, B=bn,b2, b112.在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素, 使表中不再有重复的元素。 例如(7, 10, 10, 21,30, 42, 42, 42, 51,70)将变作 亿 10, 21,30, 42, 51, 70)。13假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表, 并要求利用原来两个单链表的结点存放归并后的单链表。14.设A和B是两个单

12、链表(带头结点),其中元素递增有序。设计一个算法从 A和B中公共元素产生单链表 C,要求不破坏 A、B的结点。15.已知两个链表 A和B分别表示两个集合,其元素递增排列。编制函数,求 A与B的交集,并存放于A链表中。16.两个整数序列 A=a1, a2, a3,am和B=b1, b2, b3,,bn已经存入两个单链表中,设 计一个算法,判断序列 B是否是序列A的连续子序列。17.设计一个算法用于判断带头结点的循环双链表是否对称。18.有两个循环单链表,链表头指针分别为 h1和h2,编写一个函数将链表 h2链接到链表h1之后,要求链接后的链表仍保持循环链表形式。19.设有一个带头结点的循环单链表

13、,其结点值均为正整数。设计一个算法,反复找出单链表中结点值最小的结点并输出, 然后将该结点从中删除,直到单链表空为止,再删除表头结点。20.设头指针为L的带有表头结点的非循环双向链表,其每个结点中除有 pred(前驱指针)、data(数据)和next(后继指针)域外,还有一个访问频度域 freq。在链表被启用前,其值均初始化为零。每当在链表中进行一次 Locate(L, x)运算时,令元素值为 x的结点中freq域的值增1,并使此链表中结点保持按访问频度非增(递减)的顺序排列,同时最近访问的结点排在频度相同的结点的前面, 以便使频繁访问的结点总是靠近表头。 试编写符合上述要求的Locate(L

14、, x)运算的算法,该运算为函数过程,返回找到结点的地址,类型为指针型。21. 2009年计算机联考真题】已知一个带有表头结点的单链表,结点结构为datalink假设该链表只给出了头指针 list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第 k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的 data域的值,并返回1;否则,只返回0。要求:1) 描述算法的基本设计思想。2) 描述算法的详细实现步骤。3) 根据设计思想和实现步骤, 釆用程序设计语言描述算法 (使用C、C+或Java语言实现),关键之处请给出简要注释。22. 2012年计算机联考真题】储空间,例如

15、,“ loading ”和being ”的存储映像如下图所示。设strl和str2分别指向两个单词所在单链表的头结点, 链表结点结构为datdlink,请设计一个时间上尽可能高效的算法,找出由 str1和str2所指向两个链表共冋后缀的起始位置(如图中字符i所在结点的位置 p)。要求:1) 给出算法的基本设计思想。2) 根据设计思想,釆用 C或C+或Java语言描述算法,关键之处给出注释。3) 说明你所设计算法的时间复杂度。答案与解析一、单项选择题1.B两种存储结构有不同的适用场合, 不能简单地说谁好谁坏,I错误。链式存储用指针表示逻辑结构,而指针的设置是任意的,故可以很方便地表示各种逻辑结构

16、; 顺序存储则只能用物理上的邻接关系来表示逻辑结构, n正确。在顺序存储中,插入和删除结点需要大量的移动元素,效率较低,川的描述刚好相反。顺序存储结构既可以随机存取也能顺序存取,而链式 结构只能进行顺序存取,w正确。2.B要求较快速地插入和删除,排除 A、D。散列存储通过散列函数映射到物理空间,不能反映数据之间的逻辑关系,排除 C。链式存储中的静态链表满足这一要求。3.C对n个元素进行排序的时间复杂度最快也要 0(n)(初始有序),通常是0(nlog2 n)或o(n2-)。在顺序表中删除第i个元素,或在第i个元素之后插入一个新元素,如想 保持其它元素原来的顺序,时间复杂度为 0(n),因此A、

17、B、D均错误。在顺序存储的线性表中更改第i个元素的值,直接用下标访问并重新赋值即可,时间复杂度为 0(1)。4.D顺序存储方式同样适合图和树的存储, 如满二叉树的顺序存储,I错误。若线性表釆用顺序存储方式,则取其第i个元素的时间与i的大小无关,n错误。川是静态链表的特有性质。单链表只能顺序查找插入位置,时间复杂度为 0(n),若为顺序表,可釆用折半查找,时间复杂度可降至0(log2n), W正确。队列需要在表头删除元素,表尾插入元素,故釆用带尾指针的循环单链表较为方便,插入和删除的时间复杂度都是 0(1) ,V正确。5.AA中对于单链表和顺序表上实现的时间复杂度都为 0(n),但后者要移动很多

18、元素,所以在单链表上实现效率更高。 B和D效率刚好相反,C无区别。6.Cs插入后,q成为s的前驱,而p成为s的后继,选项C满足此条件。7.D若先建立链表,然后依次直接插入建立有序表, 则每插入一个元素就需遍历链表寻找插入位置,此即链表的插入排序, 时间复杂度为0(n2-)。若先将数组排好序, 然后建立链表,建立链表的时间复杂度为 0(n),而数组排序的最少时间复杂度为 O(nlog2 n) ,故时间复杂度为 0(nlog2 n) 。本题问最少时间复杂度,故选 D。8.C先遍历长度为 m的单链表,找到这个长度为 m的单链表的尾结点,然后将其 next域置为另一个单链表的首结点,其时间复杂度为 0

19、(m)。9.C单链表设置头结点的目的是为了方便运算的实现, 主要好处体现在:第一, 有头结点后,插入和删除数据元素的算法统一了, 不再需要判断是否在第一个元素之前插入或删除第一个元素;第二,不论链表是否为空,链表指针不变。10.B删除单链表的最后一个结点需要置其前驱结点的指针域为 NULL,故需要的时间为 O(n),与表长有关。其他操作均与表长无关,读者可以自行模拟。11.B,A在带头结点的单链表中,头指针head指向头结点,头结点的next域指向第1个元素结点, head-next=NULL 表示该单链表为空。在不带头结点的单链表中,head直接指向第1个元素结点,head=NULL 表示该

20、单链表为空。12.C双链表能很方便地访问前驱和后继,故删除和插入数据较为方便。 A显然错误。B表中第一个元素和最后一个元素不满足题设要求。 D未考虑顺序存储的情况。B、C、D在删除尾结点时,都需要先查找其前驱结点,时间复杂度为 0(n)。13.D在最后一个元素之后插入元素, 需要先找到最后一个元素, 故A、B和C的时间复杂度均为O(n)。B因为没有特殊的指针指示头结点或尾结点, 故需从某一结点向固定的方向顺序依次搜索插入和删除的位置,时间复杂度也为 0(n)。D的两种算法的时间复杂度都是 0(1),如下图所示。14.D为了在p之前插入结点q,可以将p的前一个结点的next域指向q,将q的nex

21、t域指向p, 将q的prior域指向p的前一个结点,将p的prior域指向q。仅D满足条件。15.A与上一题的分析基本类似,只不过这里是删除一个结点,注意将 p的前、后两结点链接起来。注,请读者仔细对比上述两题,弄清双链表的插入和删除的方法。16.B假设单链表递增有序(递减的情况同理),在插入数据为x的结点之前,先要在单链表中找到第一个大于x的结点的直接前驱 p,在p之后插入该结点。查找过程的时间复杂度为 0(n),插入过程的时间复杂度为 0(1),因此时间复杂度为 0(n)。17.D在双链表中可以快速访问任何一个结点的前后相邻结点, 而在单链表中只能快速访问任何一个结点的后继结点。18.D循

22、环单链表L判空的条件是头结点(头指针)的 prior和next域都指向它自身。19.A在链表的末尾插入和删除一个结点时, 需要修改其相邻结点的指针域。而寻找尾结点以及尾结点的前驱结点,只有带头结点的双循环链表所需要的时间最少。20.C对于A,删除尾结点*p时,需要找到*p的前一个结点,时间复杂度为 0(n)。对于B,删除 首结点*p时,需要找到*p结点,这里没有直接给出头结点指针,而通过尾结点的 prior指针找到*p结点的时间复杂度为 0(n)。对于D,删除尾结点*p时,需要找到*p的前一个结点,时间复杂度为 0(n)。对于C,执行这4种算法的时间复杂度均为 0(1)。21.C对于A,在最后

23、一个元素之后插入一个元素的情况与普通单链表相同, 时间复杂度为 0(n);而删除表中第一个元素时,为保持单循环链表的性质 (尾结点的指计指向第一个结点 ),需要首先遍历整个链表找到尾结点,然后再执行删除操作,时间复杂度也为 0(n)。对于B,双链表的情况与单链表的相同,一个是 0(n),个是0(1)。对于C,与A的分析对比,因为已经知道了尾结点的位置,省去了遍历链表的过程,因此插入和删除的时间复杂度均为0(1)。对于D,要在最后一个元素之后插入一个元素,需要遍历整个链表才能找到插入位 置,时间复杂度为 0(n);删除第一个元素的时间复杂度为 0(1)。22.C静态链表中的指针又称游标,指示下一

24、个元素在数组中的下标。23.B静态链表用数组表示,因此需要预先分配较大的连续空间, 静态链表同时还具有一般链表的特点,即插入和删除不需要移动元素。二、综合应用题1.解答:则显然有x的结点。由设f(L , x)的功能是删除以L为首结点指针的单链表中所有值等于 x的结点,f(L- next, x)的功能是删除以L- next为首结点指针的单链表中所有值等于此,可以推出递归模型如下:终止条件:f(L, x)=不做任何事情; 若L为空表或只有一个结点f(L, x)三删除*L 结点;f(L-next, x); 若 L-data=x递归主体:f(L, x)斗(L-next, x); 其他情况本题代码如下:

25、1.void Del_X_3(Linklist &L, ElemType x ) 2./递归实现在单链表L中删除值为x的结点3.LNode *p; /p指向待删除结点4.if (L=NULL / 递归出口5.return ;6.6.if (L- data =x) /若L所指结点的值为x7.p =L; /删除*L,并让L指向下一结点8.L =L- next;9.free (p);10.Del_X_3( L, x) ; / 递归调用11.else /若L所指结点的值不为x12.Del_X_3 (L-next, x) ; / 递归调用13.算法需要借助一个递归工作栈,深度为 0(n),时间复杂度为

26、0(n)。有读者认为直接free掉p结点会造成断链,实际上因为 L为引用,是直接对原链表进行操作,因此不会断链。2.解答:解法一:用p从头至尾扫描单链表,pre指向*p结点的前驱。若p所指结点的值为x,则 删除,并让p移向下一个结点,否则让 pre、p指针同步后移一个结点。本题代码如F :2./L为带头的单链表,本算法删除L中所有值为x3.LNode * p=L- next, *pre=L, *(q; / 置 p 和 pre4.5.while (p!=NULL6.if (p- data =x)7.q =p; /q指向该结点8.p =p- next;9.pre - n ext =p;/删除*q结

27、点10.free (q); 释放*q结点的空间11.else / 否则,pre 和 p同步后移12.pre =p;13.p =p- n ext;14. /else15. /while16.1.的结点的初始值void Del_X_1( Linklist &datamink &p-datamaxk) 。解法二:釆用尾插法建立单链表。用 p指针扫描L的所有结点,当其值不为 x时将其链接到L之后,否则将其释放。本题代码如下:1.void Del_X_2(Linklist &next, *r=L, *q; r指向尾结点,其切值为头结点4.4.while (p!=NULL5.if (p-data!=x)

28、*p结点值不为x时将其链接到L尾部6.r -n ext =p;7.r =p;8.p =next; / 继续扫描9.else *p结点值为x时将其释放10.q =p;11.p =next; / 继续扫描12.free (q); / 释放空间13.14./while15.r -next =NULL 插入结束后置尾结点指针为 NULL16.上述两个算法扫描一遍链表,时间复杂度为 0(n),空间复杂度为 0(1)。3.解答:考虑到从头到尾输出比较简单,本题的思路很自然地联系到借助上题链表逆置的方法来实现,改变链表的方向,然后就可以从头到尾实现反向输出了。此外,本题还可以借助一个栈来实现,每经过一个结点时,将该结点放入栈中。在遍历完整 个链表后,再从栈顶开始输出结点值即可。归输出它后面的结点,再输出该结点自身,这样链表就反向输出了。如下图所示:L-?*nol

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1