写在前面的话:
适应范围:《数据结构》复习总结系列适用于考研、期末考试、考前复习,小白新手
本系列参考书目: 《数据结构:c语言版》(严蔚敏)
关于写这个系列的原因:本人今年考研上岸,加上在校期间学习《数据结构》这门课时候,对数据结构有了好感,对这门课考试的考点把握还不错,所以不想荒废自己的知识,就计划用这种方式总结起来。如果有理解不到位的地方,欢迎在评论指出。我会尽量把知识点讲清楚后,按照考点进行总结。这个系列计划按照知识点总结后+考点总结,同时配有少部分习题(之后会放出大量习题的链接,可以自行练习下载)的方式进行,我会加快更新速度,有不理解的问题也可以在评论提出,大家一起学习进步嗷。
第二章 线性表练习题
一、选择题
1.顺序表中第一个元素的存储地址是100 ,每个元素的长度为2,则第5个元素的地址是 ( )。 A. 110 B . 108 C. 100 D . 120 【答案】 B ,顺序表中的数据存储特点为连续存储,所以第 5 个元素的地址为100+2*4=108 。 2. 在 n 个结点的顺序表中,算法的时间复杂度是 O(1) 的操作是( )。 A .访问第 i 个结点( 1≤ i≤ n)和求第 i 个结点的直接前驱( 2≤ i≤ n) B .在第 i 个结点后插入一个新结点( 1≤ i≤ n) C.删除第 i 个结点( 1≤ i≤ n) D .将 n 个结点从小到大排序 【答案】 A , 在顺序表中插入一个结点的时间复杂度都是 O(n) ,排序的时间复杂度为 O(n2 ) 或 O(nlog 2n)。顺序表是一种随机存取结构,访问第 i 个结点和求第 i 个结点的直接前驱都可 以直接通过数组的下标直接定位,时间复杂度是 O(1) 。 3. 线性表L在( )情况下适用于使用链式结构实现。 A .需经常修改L中的结点值 B.需不断对L进行删除插入 C.L中含有大量的结点 D.L中结点结构复杂 【答案】 B,链式存储结构的特点为删除和插入元素时,不用移动大量元素,直接修改指针就行;顺序存储的特点为随机存取,因此经常修改元素的值时,可以使用顺序存储。当线性表中含有大量结点时,使用顺序存储和链式存储都可以。 4. 单链表的存储密度( )。 A .大于1 B .等 1 C.小于1 D .不能确定 【答案】C ,存储密度是指一个结点数据本身所占的存储空间和整个结点所占的存储空间之比,假设单链表一个结点本身所占的空间为 D,指针域所占的空间为 N,则存储密度为D/(D+N) ,一定小于1。 5. 在一个长度为 n 的顺序表中,在第 i 个元素( 1≤ i≤ n+1 )之前插入一个新元素时,须向后移动( )个元素。 A . n-i B . n-i+1 C. n-i-1 D .i 【答案】 B,前章知识点总结时,已讲解过。 6. 创建一个包括 n 个结点的有序单链表的时间复杂度是( )。 A . O(1) B. O(n) C. O(n 2 ) D. O(nlog 2n) 【答案】 C ,单链表创建的时间复杂度是 O(n) ,而要建立一个有序的单链表,则每生成 一个新结点时需要和已有的结点进行比较,确定合适的插入位置,所以时间复杂度是 O(n2) 。 7. 在单链表中,要将 s 所指结点插入到 p 所指结点之后,其语句应为( )。 A . s->next=p+1; p->next=s; B . (*p).next=s; (*s).next=(*p).next; C. s->next=p->next; p->next=s->next; D . s->next=p->next; p->next=s; 【答案】 D 8. 在双向链表存储结构中,删除 p 所指的结点时须修改指针( )。 A . p->next->prior=p->prior; p->prior->next=p->next; B . p->next=p->next->next; p->next->prior=p; C. p->prior->next=p; p->prior=p->prior->prior; D . p->prior=p->next->next; p->next=p->prior->prior; 【答案】 A 9. 在双向循环链表中,在 p 指针所指的结点后插入 q 所指向的新结点,其修改指针的 操作是( )。 A . p->next=q; q->prior=p; p->next->prior=q; q->next=q; B . p->next=q; p->next->prior=q; q->prior=p; q->next=p->next; C. q->prior=p; q->next=p->next; p->next->prior=q; p->next=q; D . q->prior=p; q->next=p->next; p->next=q; p->next->prior=q; 【答案】 C 10.若线性表最常用的操作为存取第 i 个元素及其前驱和后继元素的值,为了提高效率,应采用的存储方式为()。 A . 单链表 B . 双向链表 C. 单循环链表 D .顺序表 【答案】D,注意题中主要进行存取,未强调顺序存取,即为快速找到第 i 个元素,第 i-1 个元素,第 i+1 个元素。 11. 设线性表有n个元素,严格的说,以下操作中,( )在时间复杂度为O(1)的操作。 Ⅰ. 访问第 i 个元素和求第i个结点的直接前驱 Ⅱ . 在最后一个结点后插入一个新的结点 Ⅲ. 在第 i 个结点后插入一个结点 Ⅳ .删除第一个结点 A . Ⅰ B . Ⅱ、Ⅳ C. Ⅰ、Ⅱ D .Ⅲ、Ⅳ、 【答案】C,数组存储方式为顺序表。 12.设线性表有n个元素,严格的说,以下操作中( )在顺序表上实现要比链表上实现的效率高。 Ⅰ. 输出第 i ( 1≤ i≤ n)个元素值 Ⅱ . 交换第3和第4个元素的值 Ⅲ. 输出这n个元素 A . Ⅰ B .Ⅰ、Ⅲ C. Ⅰ、Ⅱ D .Ⅱ、Ⅲ 【答案】A。链表中交换2个值,只要变动下next指针即可,没有数据的拷贝复制,而线性表需要交换2个值,需要拷贝节点的内容,交换值肯定是链表比线性表快。 |
二、填空题
1. 顺序存储结构是通过__ _____表示元素之间的关系的;链式存储结构是通过____ ____表示元素之间的关系的 【答案】①物理位置上相邻;②结点的指针 2.要在一个单链表中p所指结点之后插入一个子链表,子链表第一个结点的地址为s,子链表最后一个结点的地址为t, 则应执行操作 和 。 【答案】①t->next=p->next ;② p->next=s |
三、判断题
1.链表的每个结点中都恰好包含一个指针。 ( ) 2.顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 ( ) 3.顺序存储方式的优点是存储密度大,且插入、删除运算效率高。 ( ) 4.线性表若采用链式存储时,结点之间和结点内部的存储空间都是可以不连续的。 ( ) 5.顺序表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型 ( ) 【答案】1.错误。链表中的每个结点可含多个指针域,分别存放多个指针。例如双向链表中的结点可以含有两个指针域,分别存放指向其直接前趋和直接后继的指针。 2.错误。正好说反了。顺序表才适合随机存取,链表恰恰为顺序存储。 3.错误。顺序存储方式的有点是密度大,而插入,删除运算效率高是链表的优点。 4.错误。线性表若采用链式存储时,结点之间可以不连续的,而结点内部是连续的。 5.错误。线性表的每个结点也可以是一个复杂的类型。比如用“结构体”做为线性表的节点也是可以的。而结构体是复杂类型。 |
四、算法题
1 . 试编写算法,从顺序表中删除其给定值在s与 t 之间(要求s<t)的所有元素,如果s与t之间关系不合理或顺序表为空,则显示错误信息并退出程序。 2. 试编写算法,从有序顺序表中删除所有其重复的元素,使表中的所有元素均不同。 3. 试编写一个递归算法,删除不带头结点的单链表中所有值为x的结点。 4.试编写在带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点是唯
【注】所有题目的代码不唯一,如需参考答案可私信。 |