1.下面哪项是数组优于链表的特点?
A.方便删除 B.方便插入
C.长度可变 D.存储空间小
答案:D 分析:
1: 数组内存空间少比链表少
2:数组支持随机访问,链表不具有随机访问的特性
3:插入和删除是链表优于数组,数组需要移动被删除或者插入位置之后的元素
3. 对于长度为n的线性表,建立其对应的单链表的时间复杂度为()。
A.O(1)
B.O(log2n)
C.O(n)
D.O(n^2)
答案:C 分析:
我们使用头插式或尾插式创建链表都只需要一次循环遍历就可实现,所以时间复杂度为O(n)。
4.在n个结点的线性表的数组实现中,算法的时间复杂性是O(1)的操作是()
A.访问第i个结点(1<=i<=n)和求第i个结点的直接前驱(2<=i<=n)
B.在第i个结点后插入一个新结点(1<=i<=n)
C.删除第i个结点(1<=i<=n)
D.以上都不对
答案:A 分析:
注意题目强调的是用 数组 实现的线性表,所以A答案就是访问数组的第i和i-1个元素,B和C是对数组进行插入和删除,需要移动后面的元素,复杂度为O(n)
5.已知int a[3][4];则下列能表示a[1][2]元素值的是
A. *(*(a+1)+2)
B. *(a+1+2)
C. (&a[0]+1)[2]
D. *(a[0]+1)
答案:A 分析:
A, a 是一个二级指针,不是一级指针,*(a+1)表示的第二个数组的地址
B, *(a+1+2)等于*(a+3),是一个int *, 表示的是 第4个数组a[3]的地址,而 **(a+3)表示a[3][0]的值,
*((int *)(a+3)) 也可以表示 a[3][0]的值
C. (&a[0]+1)表示的是第2个数组 a[1]的地址, (&a[0]+1)[2]其实是数组a[3]的地址,改成
((int *)(&a[0]+1))[2] 才是对的
D. *(a[0]+1) 是 a[0][1]的值
6.下列程序的功能是求两个 2 行 3 列的数组的和,即数组对应位置的元素—相加,请为横线处选择合适的程序()
A. void M:: B. friend M
C. M D. M M::
答案:D 分析:
M M::中,第一个M的表示返回值的类型,第二个M是类名,该函数最后return c,c又是类M的对象,所以返回值的类型是类M
7.int a[3][4][2]; 后,第 20 个元素是( )
A. a[2][1][1]
B. a[1][0][1]
C. a[2][0][1]
D. a[2][2][1]
答案:A 分析:
三维数组可以看成是一本书!
int a[3][4][2]; 就是有3页每页4行2列
总共有(0~2)3层,每层可以看成是一个二维数组(如b[4][2]),有4*2=8个元素。
前两层总共有16个元素,所以第20个元素应该在第三层(下标为2).
20-14=4还差4个元素,所以第三层中(例如二维数组b[4][2])第四个元素的位置为b[1][1]
所以第20个元素是a[2][1][1]. 答案为A
8.以下程序段的运行结果是( )。
1 2 |
|
A. output
B. "output"
C. \"output\"
D. 编译错误
答案:B 分析:
\n 换行 \r 回车
\f 换页符 \b 退格
\0 空格 \s 字符串
\t 制表符\” 双引号 \’ 单引号
\ddd 八进制字符串(ddd)
\uxxxx 16进制unicode字符串(xxxx)
结点内部一般是连续的,但是如果当结点的data通过地址指针访问时,那么结点内部也不再连续。
10.下列关于线性表中的链表描述正确的是?
A. 适用于数据项数量不能预知的情况。
B. 逻辑相邻的2元素的存储空间可以是不连续的。
C. 链表节点一般有数据元素和指针域两部分组成。
D. 存储空间需要动态分配。
答案: ABCD
链表可以动态增加,可以用malloc,在存储上可以不是连续的,但,逻辑上是连续的,链表的基本是要求有数据域和指针域,这是最基本的