专项练习数组(1)

1.顺序存储结构的主要缺点是不利于插入或删除操作(A) 。

  A.对

  B.错

解析:在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构.
顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储结构为顺序存储结构,通常顺序存储结构是借助于计算机程序设计语言(例如c/c++)的数组来描述的。
顺序存储结构的主要优点是节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。但顺序存储方法的主要缺点是不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。

2.数组是一种线性结构,因此只能用来存储线性表(B)

  A.对

  B.错

解析:比如可以存储完全二叉树,完全二叉树按层序遍历,从上到下,从左到右的编号

3.将10阶对称矩阵压缩存储到一维数组A中,则数组A的长度最少为(C)

A.100

B.40

C.55

D.80

解析:对称矩阵压缩后存储到一维数组中,假设存储下三角的元素,那么存储的元素个数为:第一行1个、第二行2个、第三行3个~~~~第10行10个,一共1+2+3+...+10=55个元素(即n(n+1)/2)

4.设二维数组A[m][n],每个数组元素占用k个字节,第一个数组元素的存储地址是Loc(a[0][0]),求按行优先顺序存放的数组元素a[i][j](0 ≤i≤m-1,0≤j≤n-1 )的存储地址为(B)

A.Loc(a[0][0])+((i-1)*n-1)*k

B.Loc(a[0][0])+(i*n+j)*k

C.Loc(a[0][0])+(j*m+i)*k

D.Loc(a[0][0])+((j-1)*m+i-1)*k

解析:由于下标从0开始,先计算偏移量,i*n+j,再乘以字节既是(i*n+j)*k,最后加上第一个数组元素的地址,所以是(i*n+j)*k+Loc(a[0][0]),选B。这里要注意的是下标是从0开始的还是从1开始的,从1开始时,i,j都需要-1,从0开始时,不用减。

5.设有一个 10 阶的对称矩阵 A ,采用压缩存储方式,以行序为主存储, a1 , 1 为第一个元素,其存储地址为 1 ,每个元素占 1 个地址空间,则 a8 , 5 的地址为 (B)

A.13

B.33

C.18

D.40

解析:对称矩阵,只需要存一半就行了, 第一行:1个 第二行:2个 第三行:3个 ……第八行:1~5,前5个 所以:1+2+3+4+5+6+7 再加 5 总共得:33

6.已知二维数组A[1: 4, 1: 6]采用列序为主序方式存储,每个元素占用4个存储单元,并且A[3,4]的存储地址为1234,元素A[1, 1]的存储地址是(A

A.1178

B.1190

C.1278

D.1290

解析:如果以任意的A[c1..d1,c2..d2]A[c1..d1,c2..d2](其中c1、c2c1、c2表示基地址元素;d1−c1+1、d2−c2+1d1−c1+1、d2−c2+1表示数组的行数和列数)可得:address(aij)=address(ac1c2)+((j−c2)(d1−c1+1)+(i−c1))e  (每个元素占用空间ee个单位)如题意:c1=c2=1,d1=4,d2=6,则address(a34)=a11+(3*4+2)*4,求得a11

7.以下能正确定义一维数组的选项是 ( D)

A.int a[5]={0,1,2,3,4,5}

B.char a={′A′,′B′,′C′}

C.int a[5]="0123"

D.char a[]={′0′,′1′,′2′,′3′,′4′,′5′,′\0′}

解析:A 定义了 5 个元素的数组,但是赋值的时候越界了 B 定义了 char 变量,用数组赋值 C 有争议,因为 C++ 中存在隐式转换,用 char 赋值给 int 会发生隐式转换,取 char 的 ASCII 码进行赋值 D 是最没有争议,就是定义字符串,肯定对的

8.若数组S[1..n]作为两个栈S1和S2的存储空间,对任何一个栈,只有当[1..n]全满时才不能进行进栈操作。为这两个栈分配空间的最佳方案是(C

A.S1的栈底位置为0,S2的栈底位置为n+1

B.S1的栈底位置为0,S2的栈底位置为n/2

C.S1的栈底位置为1,S2的栈底位置为n

D.S1的栈底位置为1,S2的栈底位置为1

解析:栈空间共享同一段数组内存空间,他们是在数组的两端,分别向中间靠拢,,只要栈的栈顶不碰面,这段空间就没满,可以一直用。

9.若数组A[0…m-1][0…n-1]按列优先顺序存储,则aij地址为(A )。

A.LOC(a00)+[j*m+i]

B.LOC(a00)+[j*n+i]

C.LOC(a00)+[(j-1)*n+i-1]

D.LOC(a00)+[(j-1)*m+i-1]

解析:以0开始,下标是几就是多少个

10.下列给定程序中,函数fun的功能是:把形参a所指数组中的奇数按原顺序依次存放到a[0]、a[1]、a[2]…中,把偶数从数组中删除,奇数个数通过函数值返回。 例如,若a所指数组中的数据最初排列为:9,1,4,2,3,6,5,8,7,删除偶数后,a所指数组中的数据为:9,1,3,5,7,返回值为5。
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果(D)

试题程序:

A.0 j++ j

B.1 j++ j+1

C.0 j++ j+1

D.1 j++ j

解析:if (a[i]%2== 1 ) // 这里是要判断为奇数时,将其值存储到新的位置;a[j]=a[i];   j++; // j为新索引,每次赋值后需要加1;
return j; // 因为在上一步中已经加过1了,所以这里直接返回j即可

11.有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是(B)

A.60

B.66

C.18000

D.33

解析:每个元素要用行号,列号,元素值来表示,在用三元组表示稀疏矩阵,还要三个成员来记住,矩阵的行数列数,总的元素数,所以所需的字节数是10*(1+1+1)*2+3*2=66

12.数组A[0..4,-1..-3,5..7]中含有元素的个数(B)

A.55

B.45

C.36

D.16

解析:三维数组:长的边 个数:4-0+1=5;宽的 边 个数 :(-1)-(-3)+1=3;高的边个数 :7-5+1=3;总个数:5*3*3

13.若有以下程序段,则该程序段的功能是:(B)


A.对数组a进行插入排序(升序)

B.对数组a进行插入排序(降序)

C.对数组a进行选择排序(升序)

D.对数组a进行选择排序(降序)

解析:在第i次排序中,前i-1个元素始终是有序的,此时只需把第i个元素插入到有序的序列中即可,故代码中体现的是插入排序的思想。代码中对当前a[i]>a[j](0<=k<i-1)是否成立进行判断,若成立则将a[j]往后移(即大的数排在前面,小的数排在后面),故代码中的排序原则为降序排。

14.以下代码执行后,array的结果是?var array=[-1,1,3,4,6,10]; array.sort((a,b)=>Math.abs(a-3)-Math.abs(b-3));(C)

A.[10,-1,6,1,4,3]

B.[10,6,4,3,1,-1]

C.[3,4,1,6,-1,10]

D.[-1,1,3,4,6,10]

解析:sort() 方法用于对数组的元素进行排序,参数决定排序的顺序。原数组var array=[-1,1,3,4,6,10];参数(a,b)=>Math.abs(a-3)-Math.abs(b-3):即数值减3的绝对值[4,2,0,1,3,7]作为参数决定排序。根据绝对值减3大小排列[0,1,2,3,4,7],对应的原数组排序后为[3,4,1,6,-1,10]

15.下面有关数据结构的说法是正确的(B

A.数组和链表都可以随机访问

B.数组的插入和删除可以 O(1)

C.哈希表没有办法做范围检查

D.以上说法都不正确

解析:数组可以直接通过下标得到存储的值 因此支持随机,访问链表是链式存储结构时无法支持随机访问,要访问一个指定位置的元素必须从头开始做指针移动。哈希表支持直接通过关键码得到值 其实数组就是一种哈希表 下标就是关键码 通过下标直接得到值 因此哈希表肯定需要做范围检查也有办法做范围检查的

16.一个非空广义表的表尾(B)

A.不能是子表

B.只能是子表

C.只能是原子

D.是原子或子表

解析:(1)《数据结构》对广义表的表头和表尾是这样定义的: 如果广义表LS=(a1,a2...an)非空,则 a1是LS的表头,其余元素组成的表(a2,a3,..an)是称为LS的表尾。 根据定义,非空广义表的 表头是一个元素,它 可以是原子也可以是一个子表, 而表尾则必定是子表。例如:LS=(a,b),表头为a,表尾是(b)而不是b.另外:LS=(a)的表头为a,表尾为空表().
           (2)非空广义表,除表头外,其余元素构成的表称为表尾,所以非空广义表尾一定是个表

17.数组ARR=[1,2,3,4,5],以下返回值为5的是(A、B 、D)

A.arr.push()

B.arr.pop()

C.arr.shift()

D.arr.unshift()

解析:push() 在数组末尾添加元素,返回新数组长度,所以返回5;pop() 删除数组最后一位,返回所删除的元素,所以返回5;shift() 删除数组第一位,返回所删除的元素,所以返回1;unshift() 在数组开头添加元素,返回新数组长度,所以返回5

18.下列说法错误的有(B、C、D

A.数组是一种对象

B.数组属于一种原生类

C.int number=[]={31,23,33,43,35,63}

D.数组的大小可以任意改变

解析:a、数组是能被Object 一切能被Obj 接收的均为对象;b、数组不是原生类 原生类有8种, int double boolean float byte short long char ;c、语法错误、d、数组的大小一开始就已经确定了 int[]test=new test[2];

19.以下能对二维数组 a 进行正确初始化的语句是(B、D)。

A.int a[2][]={{1,0,1},{5,2,3}};

B.int a[][3]={{1,2,3},{4,5,6}};

C.int a[2][4]={1,2,3},{4,5},{6}};

D.int a[][3]={{1,0,1},{},{1,1}};

解析:定义二维数组时,不能省略第二维的大小,这是由编译器原理限制的。事实上,编译器是这样处理数组的:设有数组int a[m][n],如果要访问a[i][j]的值,编译器的寻址方式为: &a[i][j]=&a[0][0]+i*sizeof(int)*n+j*sizeof(int); //注意n为第二维的维数。

20.若有说明语句“int a[10],*p=a;”,对数组元素的正确引用是(D)

A.a[p]

B.p[a]

C.p+2

D.*(p+2)

解析:注意 是对数组中元素的引用 a为数组名 也代表数组首元素的地址值 *p=a则p也指向数组a的第一个元素地址,则*(p+2)指向数组a中第三个元素。

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值