首页
高中语文
高中数学
高中英语
高中物理
高中化学
高中历史
高中道德与法治(政治)
高中地理
高中生物
高中音乐
高中美术
高中体育
高中信息技术
高中通用技术
资源详情
高中信息技术
浙教版(2019)
选修1 数据与数据结构
第二章 数据与链表
本章复习与测试
2.1—2.2 数组和链表习题 2021—2022学年浙教版(2019)选修1(含答案)
文档属性
名称
2.1—2.2 数组和链表习题 2021—2022学年浙教版(2019)选修1(含答案)
格式
zip
文件大小
261.5KB
资源类型
教案
版本资源
浙教版(2019)
科目
信息技术(信息科技)
更新时间
2022-03-28 07:15:07
点击下载
文档简介
数组和链表专项习题
选择题
在一个长度为n的数组中的第i个元素(1<=i<=n)之前插入一个新元素时,需向后移动的元素个数为( )
A.i B.n-i C.n-i+1 D.n-i-1
2.在单向链表中,增加头指针的目的是( )
A.标识表节点中首节点的位置
B.算法实现上的方便
C.使单向链表至少有一个节点
D.说明单向链表是线性表的链式存储实现
3.在一个包含n(n>1)个节点的单链表上,没有头和尾两个指针,下列操作需要遍历多个节点的是( )
A.删除该链表中的第一个节点
B.删除该链表中的最后一个节点
C.在该链表第一个节点前插入一个新节点
D.在该链表最后一个节点后插入一个新节点
4.某python程序段如下:
a=[28,29,79,14,24,43]
m=int(input(“请输入一个整数:”))
pos=-1
for i in range(len(a)):
if a[i]>m:
if pos==-1 or a[i]
pos=i
运行该程序段,若输入40,变量pos的值是( )
A.-1 B.2 C.3 D.5
5.有下列python程序段:
a=[3,7,8,2,19,10,16,12]
n=len(a)
for i in range(2):
k=i
for j in range(i+1,n):
if a[k]
k=j
if i!=k:
a[i],a[k]=a[k],a[i]
下列说法正确的是( )
程序段执行后,数组a中的元素为[19,16,8,2,3,10,7,12]
程序段执行后,数组a中的元素为[3,2,8,7,19,10,16,12]
程序段执行后,变量k的值为7
程序段执行后,数组a中数据元素发生位置变化的有2个
6.有如下python程序段:
a=[[7,1],[8,2],[9,-1],[6,0]]
head=3
head=a[head][1]
则程序执行后,链表a有几个节点( )
A.1 B.2 C.3 D.4
7.有如下python程序段:
r=0
for e in a:
if e%3!=0:
a[r]=e
r+=1
del a[r:]
已知a的初始值为[9,1,2,3,3,5,3,3,4,6],则执行上述代码段后,a的值为( )
A.[9,1,2,3,3,5,3,3,4,6] B.[1,2,5,4]
C.[9,3,3,3,3,6] D.[9,1,2,5,4,6]
8.有如下python程序段:
for i in range(1,1001):
flag=True
for j in range(3):
if i%a[2*j]!=a[2*j+1]:
flag=False
if flag:
ans=i
break
已知列表a=[3,1,5,1,7,3],该段程序执行后,变量ans的值为( )
A.31 B.41 C.136 D.137
9.有如下Python程序段:
def rotate(a,r):
right_len=len(a)-r
for i in range(r-1,-1,-1):
temp=a[i]
for j in range(i+1,i+right_len+1):
a[j-1]=a[j]
a[i+right_len]=temp
return a
则当执行语句print(rotate([1,2,3,4,5,6,7,8],3))时,程序输出值为
( )
A.[1,2,3] B.[4,5,6,7,8]
C.[1,2,3,4,5,6,7,8] D.[4,5,6,7,8,1,2,3]
10.有如下python程序段:
n=6
a=[[0]*n for i in range(n)]
for i in range(n):
for j in range(i+1):
if j==0 or j==i:
a[i][j]=1
else:
a[i][j]=a[i-1][j-1]+a[i-1][j]
则程序执行后a[4]的值为( )
A.[1,3,3,1] B.[1,4,6,4,1]
C.[1,4,6,4,1,0] D.[1,5,10,10,5,1]
11.有如下python程序段:
a=[[1,1],[2,2],[3,3],[4,-1]]
head=0
cur=a[head][1]
a[head][1]=-1
while cur!=-1:
next_=a[cur][1]
a[cur][1]=head
head,cur=cur,next_
则程序执行后,a的值为( )
A.[[1,1],[2,2],[3,3],[4,-1]]
B.[[1,-1],[2,0],[3,1],[4,2]]
C.[[4,1],[3,2],[2,3],[1,-1]]
D.[[4,-1],[3,0],[2,1],[1,2]]
12.有如下python程序段:
n=6
a=[[0 for i in range(n)]for j in range(n)]
for s in range(1,(n+1)//2+1):
for i in range(s-1,n-s+1):
a[i][s-1]=a[i][n-s]=s
a[s-1][i]=a[n-s][i]=s
for i in range(n):
for j in range(n):
print(f”{a[i][j]:3}”,end=””)
print( )
则程序执行后输出的结果为( )
B.
C. D.
非选择题
已知1班、2班各有m位同学,要在两个班中挑选身高最高的n位同学参加合唱队。小明编写了如下程序:
a=[0]*m
b=[0]*m
hc=[0]*m
#读取两个班同学的身高数据,分别存储在数组a、数组b中;
分别将两个班同学的身高数据进行降序排列,代码略。
m1=0
m2=0
for i in range(n):
if a[m1]>=b[m2]:
hc[i]=a[m1]
____①_______
else:
hc[i]=b[m2]
_____②_______
print(“身高前n位的值是:”,hc)
学校组织艺术比赛,每班可派1位选手参赛。班里有10位多才多艺的学生想要参加,老师采用下列方法来进行选择:10位学生每人选取1个编号,分别是1、2、3、…、10;学生按照编号由小到大的顺序围成一个圆圈,从编号为1的学生开始报数,报数到3的学生出圈,即被淘汰;下一个编号为4的学生
重新从1开始报数,报数到3的学生继续出圈……以此类推,由最后剩下的同学参加比赛。
类是用来描述具有相同的属性和方法的对象的集合,它定义了每个对象所共有的属性和方法,Python中使用class关键字来定义类。小李编写了程序计算最终能留下的“幸运编号”。
他定义了两个类来协调表示单向链表,即单向链表的节点类(LinkNode)和单向链表类(LinkList),并在LinkList类中定义了circle( )方法来构造一个长度为n的循环单向链表。然后模仿报数的过程,逐次把报数为3的学生节点从循环链表中删除,直到只剩下一个节点为止。
实现上述功能的python程序如下,请在划线处填入合适的代码。
class LinkNode:
def_init_(self,data_,next_=none):
self.data=data_
self.next=next_
class LinkList:
def _init_(self): #初始化空链表
self.head=None
#构造一个长度为n的循环单向链表
def circle(self,n):
self.head=LinkNode(n) “head的节点编号为n”
p=self.head
for i in range(1,n):
p.next=LinkNode(i)
p=p.next
p.next=_____①______
n,m=10,3
a=LinkList( )
circle(n)
pre=a.head #注意head的节点编号为n
while pre!=pre.next:
for i in range(1,m): #报数[1,m-1]的人留下
pre=______②_____
pre.next=______③________ “报数m的人离开(删除该节点)”print(f”幸运编号为:{pre.data}”)数组和链表专项习题
选择题
在一个长度为n的数组中的第i个元素(1<=i<=n)之前插入一个新元素时,需向后移动的元素个数为( C )
A.i B.n-i C.n-i+1 D.n-i-1
解析:选C,在数组中某个位置插入一个新的数据时,必须先将该位置及其后的所有数据向后移动一个位置。第i个元素的下标为i-1,故需要向后移动的元素个数为n-i+1。
2.在单向链表中,增加头指针的目的是(B)
A.标识表节点中首节点的位置
B.算法实现上的方便
C.使单向链表至少有一个节点
D.说明单向链表是线性表的链式存储实现
解析:选B,每个链表必定有一个头指针,以实现对链表的引用和边界处理,即算法实现上的方便。
3.在一个包含n(n>1)个节点的单链表上,没有头和尾两个指针,下列操作需要遍历多个节点的是( B )
A.删除该链表中的第一个节点
B.删除该链表中的最后一个节点
C.在该链表第一个节点前插入一个新节点
D.在该链表最后一个节点后插入一个新节点
解析:选B,链表节点的删除,并没有将元素从列表中删除,而仅仅
修改了节点指针域的值,通过将被删除节点的前驱节点和其后继节点
直接相连的方式实现。题目中描述的该单链表中没有头指针和尾指针,
此时若要删除该链表中的最后一个节点需遍历多个节点。
4.某python程序段如下:
a=[28,29,79,14,24,43]
m=int(input(“请输入一个整数:”))
pos=-1
for i in range(len(a)):
if a[i]>m:
if pos==-1 or a[i]
pos=i
运行该程序段,若输入40,变量pos的值是( D )
A.-1 B.2 C.3 D.5
解析:选D,改题通过遍历数组a中的元素,找出比40大的元素a[i]并且要满足pos==-1或a[i]
5.有下列python程序段:
a=[3,7,8,2,19,10,16,12]
n=len(a)
for i in range(2):
k=i
for j in range(i+1,n):
if a[k]
k=j
if i!=k:
a[i],a[k]=a[k],a[i]
下列说法正确的是( A )
程序段执行后,数组a中的元素为[19,16,8,2,3,10,7,12]
程序段执行后,数组a中的元素为[3,2,8,7,19,10,16,12]
程序段执行后,变量k的值为7
程序段执行后,数组a中数据元素发生位置变化的有2个
解析:选A,找出数组中2个最大的数,并让其与前2个数组元素进行位置的交换。
6.有如下python程序段:
a=[[7,1],[8,2],[9,-1],[6,0]]
head=3
head=a[head][1]
则程序执行后,链表a有几个节点(C )
A.1 B.2 C.3 D.4
解析:选C,程序创建了一个拥有4个节点的链表a,刚开始其头指针head值为3,则头节点为a[3]。语句head=a[head][1]的作用是删除头节点,并让头指针指向新的头节点a[0]。故程序执行后,链表a的节点数量为3。
7.有如下python程序段:
r=0
for e in a:
if e%3!=0:
a[r]=e
r+=1
del a[r:]
已知a的初始值为[9,1,2,3,3,5,3,3,4,6],则执行上述代码段后,a的值为( B )
A.[9,1,2,3,3,5,3,3,4,6] B.[1,2,5,4]
C.[9,3,3,3,3,6] D.[9,1,2,5,4,6]
解析:选B,该程序的功能是删除数组a中值为3的倍数的元素,其中r表示剩余数组元素的右边界,若e不是3的倍数,则要保留e,用其覆盖a[r],同时让r右移一位,最后删除a[r:]即可。
8.有如下python程序段:
for i in range(1,1001):
flag=True
for j in range(3):
if i%a[2*j]!=a[2*j+1]:
flag=False
if flag:
ans=i
break
已知列表a=[3,1,5,1,7,3],该段程序执行后,变量ans的值为( A)
A.31 B.41 C.136 D.137
解析:选A,改题关键点在i%a[2*j]!=a[2*j+1],分别把i和j的值代进去,发现当i的值为31和136时,flag的值都为True,但后面的break语句决定了ans只会被赋值一次,所以ans=31。
9.有如下Python程序段:
def rotate(a,r):
right_len=len(a)-r
for i in range(r-1,-1,-1):
temp=a[i]
for j in range(i+1,i+right_len+1):
a[j-1]=a[j]
a[i+right_len]=temp
return a
则当执行语句print(rotate([1,2,3,4,5,6,7,8],3))时,程序输出值为
( D )
A.[1,2,3] B.[4,5,6,7,8]
C.[1,2,3,4,5,6,7,8] D.[4,5,6,7,8,1,2,3]
解析:该题选D,该程序通过依次将左侧元素右移len(a)-r位,总共移动r轮,实现了将数组a向左旋转r个位置的功能,当r=3时,返回的列表a=[4,5,6,7,8,1,2,3]。
10.有如下python程序段:
n=6
a=[[0]*n for i in range(n)]
for i in range(n):
for j in range(i+1):
if j==0 or j==i:
a[i][j]=1
else:
a[i][j]=a[i-1][j-1]+a[i-1][j]
则程序执行后a[4]的值为( C )
A.[1,3,3,1] B.[1,4,6,4,1]
C.[1,4,6,4,1,0] D.[1,5,10,10,5,1]
解析:选C,该程序的功能是生成n行杨辉三角形,使用二维数组a来存储杨辉三角的各个元素值,初始化为0,之后根据规则依次生成各行的元素。a[4]即为第5行的元素。
11.有如下python程序段:
a=[[1,1],[2,2],[3,3],[4,-1]]
head=0
cur=a[head][1]
a[head][1]=-1
while cur!=-1:
next_=a[cur][1]
a[cur][1]=head
head,cur=cur,next_
则程序执行后,a的值为( B )
A.[[1,1],[2,2],[3,3],[4,-1]]
B.[[1,-1],[2,0],[3,1],[4,2]]
C.[[4,1],[3,2],[2,3],[1,-1]]
D.[[4,-1],[3,0],[2,1],[1,2]]
解析:选B,该程序通过修改各个节点的指针值,来实现逆置链表a的功能,程序运行结束后head的值为3。
12.有如下python程序段:
n=6
a=[[0 for i in range(n)]for j in range(n)]
for s in range(1,(n+1)//2+1):
for i in range(s-1,n-s+1):
a[i][s-1]=a[i][n-s]=s
a[s-1][i]=a[n-s][i]=s
for i in range(n):
for j in range(n):
print(f”{a[i][j]:3}”,end=””)
print( )
则程序执行后输出的结果为( A )
B.
C. D.
解析:选A,由最外层for循环可知,变量s的值从1到3,内层for循环限制了变量i的范围,使其左右边界逐步向中间缩小。程序的功能是从外到内生成一个值为s的环。
非选择题
已知1班、2班各有m位同学,要在两个班中挑选身高最高的n位同学参加合唱队。小明编写了如下程序:
a=[0]*m
b=[0]*m
hc=[0]*m
#读取两个班同学的身高数据,分别存储在数组a、数组b中;
分别将两个班同学的身高数据进行降序排列,代码略。
m1=0
m2=0
for i in range(n):
if a[m1]>=b[m2]:
hc[i]=a[m1]
____①_______
else:
hc[i]=b[m2]
_____②_______
print(“身高前n位的值是:”,hc)
解析:①处填m1=m1+1,②处填m2=m2+1。根据题目要求要把数组a和数组b中最大的n个身高数据存入数组hc中,当选择数组a的数据存储后,对应数组a的下标m1后移;同理,当选择数组b的数据存储后,对应数组b的下标m2后移。
2.学校组织艺术比赛,每班可派1位选手参赛。班里有10位多才多艺的学生想要参加,老师采用下列方法来进行选择:10位学生每人选取1个编号,分别是1、2、3、…、10;学生按照编号由小到大的顺序围成一个圆圈,从编号为1的学生开始报数,报数到3的学生出圈,即被淘汰;下一个编号为4的学生重新从1开始报数,报数到3的学生继续出圈……以此类推,由最后剩下的同学参加比赛。
类是用来描述具有相同的属性和方法的对象的集合,它定义了每个对象所共有的属性和方法,Python中使用class关键字来定义类。小李编写了程序计算最终能留下的“幸运编号”。他定义了两个类来协调表示单向链表,即单向链表的节点类(LinkNode)和单向链表类(LinkList),并在LinkList类中定义了circle( )方法来构造一个长度为n的循环单向链表。然后模仿报数的过程,逐次把报数为3的学生节点从循环链表中删除,直到只剩下一个节点为止。
实现上述功能的python程序如下,请在划线处填入合适的代码。
class LinkNode:
def_init_(self,data_,next_=none):
self.data=data_
self.next=next_
class LinkList:
def _init_(self): #初始化空链表
self.head=None
#构造一个长度为n的循环单向链表
def circle(self,n):
self.head=LinkNode(n) “head的节点编号为n”
p=self.head
for i in range(1,n):
p.next=LinkNode(i)
p=p.next
p.next=_____①______
n,m=10,3
a=LinkList( )
circle(n)
pre=a.head #注意head的节点编号为n
while pre!=pre.next:
for i in range(1,m): #报数[1,m-1]的人留下
pre=______②_____
pre.next=______③________ “报数m的人离开(删除该节点)”
print(f”幸运编号为:{pre.data}”)
解析:①处填self.head,②处填pre.next,③处填pre.next.next。
该题要构造循环链表,需要将尾节点的后继指针指向头节点,形成一个闭环,故第①空答案为self.head;从第一个人开始报数,报数[1,m-1]的人留下,报数m的人离开。pre表示当前节点的前驱节点的下标,用语句pre=pre.next指向下一个节点,pre.next=pre.next.next表示删除pre的后继节点(即当前节点)。程序执行后输出“幸运编号为:4”。
点击下载
同课章节目录
第一章 数据与数据的组织
1.1 数据
1.2 数据的组织
第二章 数据与链表
2.1 数组
2.2 链表
第三章 字符串、队列和栈
3.1 字符串
3.2 队列
3.3 栈
第四章 树
4.1 树与二叉树
4.2 二叉树的基本操作
4.3 抽象数据类型
第五章 数据结构与算法
5.1 数据结构与算法的关系
5.2 迭代与递归
5.3 数据排序
5.4 数据查找
第六章 大数据时代数据的组织
6.1 实时查询系统中数据的组织
6.2 POI数据的组织与应用
点击下载
VIP下载