更多同型练习题 · 计算机基础与程序设计
适用:2027 届广东专升本《计算机基础与程序设计》 覆盖:C语言10题 + 数据结构10题,每题配解析+秒懂技巧用法:先闭卷做,再看解析,错题回系统笔记补概念
C 语言部分(10题)
1. 以下程序输出结果是( )
int x = 5;
printf("%d", x-- - --x);A. 0 B. 1 C. 2 D. 未定义行为
答案:D
解析: 同一个表达式中对
x多次修改(x--和--x),顺序未定义,属于未定义行为。💡 秒懂技巧: 就像你同时说"先吃饭再洗碗"和"先洗碗再吃饭"——两个指令冲突了,结果不确定。C语言规定:一条语句中,同一个变量最多只能被修改一次。
2. 以下程序输出结果是( )
int a[5] = {1, 2, 3, 4, 5};
printf("%d", *(a + 3));A. 1 B. 2 C. 3 D. 4
答案:D
解析:
a是数组首地址,a + 3指向第4个元素(下标从0开始),*(a + 3)取出该元素的值,即 4。a[3]和*(a + 3)是完全等价的。💡 秒懂技巧: 数组就像一排门牌号的房子。
a是1号门,a+3是4号门,*(a+3)就是敲4号门看里面住谁。a[3]是同样的意思——只是写法不同。
3. 以下程序输出是( )
int a = 10;
int *p = &a;
int **pp = &p;
printf("%d", **pp);A. 10 B. 地址值 C. 编译错误 D. 运行时错误
答案:A
解析:
pp是指向指针的指针(二级指针)。*pp得到p(指向a的指针),**pp得到a的值,即 10。💡 秒懂技巧: 二级指针就像"门牌号的门牌号"——
a是房子里的人,p是房子的门牌号,pp是写着"门牌号在哪"的纸条。一级一级查下去:查纸条 → 找到门牌号 → 找到人。
4. 以下程序输出是( )
int i;
for (i = 0; i < 5; i++) {
if (i == 2) break;
printf("%d ", i);
}A. 0 1 2 B. 0 1 C. 0 1 2 3 4 D. 2
答案:B
解析: 当
i == 2时,break立即结束整个循环。所以只输出0 1。💡 秒懂技巧:
break就像"比赛进行到一半突然喊停"——整个循环都结束了。continue是"跳过这一轮,下一轮继续"——就像考试跳过一道难题做下一题。
5. 以下程序输出是( )
int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr;
ptr++;
printf("%d", *ptr);A. 1 B. 2 C. 3 D. 地址值
答案:B
解析:
ptr初始指向数组首元素(arr[0]=1)。ptr++使指针向后移动一个int大小(4字节),指向arr[1],所以*ptr为 2。💡 秒懂技巧: 指针就像游戏里的"角色箭头"——一开始指向第1个人,
ptr++就是"箭头向右移一位",指向第2个人。移动的距离取决于指向的东西有多大(int占4个位置)。
6. 以下程序输出是( )
int a = 5, b = 10;
int *pa = &a, *pb = &b;
*pa = *pb;
printf("%d %d", a, b);A. 5 10 B. 10 10 C. 10 5 D. 5 5
答案:B
解析:
*pa = *pb表示把pb指向的值(b=10)赋值给pa指向的变量(a),所以a变成 10,b不变。💡 秒懂技巧:
pa指向a(就像门牌号写着"a的家"),pb指向b("b的家")。*pa = *pb就是"去b的家看看值多少钱,然后去a的家也改成这个数"——a的值变了,但b没变,pa和pb指向的地址也没变。
7. 以下程序输出是( )
char s1[] = "abc";
char s2[] = "abc";
printf("%d", strcmp(s1, s2));A. 0 B. 1 C. -1 D. 随机值
答案:A
解析:
strcmp比较两个字符串的内容是否相等。因为s1和s2的内容都是"abc",所以返回 0(相等)。💡 秒懂技巧:
strcmp就像"逐字对照检查"——一个字一个字地比,全部一样就返回0。不相等时返回第一个不同字符的差值(正数表示s1更大,负数表示s2更大)。
8. 以下程序输出是( )
int x = 3;
switch(x) {
case 1: printf("A");
case 2: printf("B");
case 3: printf("C");
case 4: printf("D");
default: printf("E");
}A. C B. CD C. CDE D. 编译错误
答案:C
解析:
x=3匹配case 3,但后面没有break,所以会"穿透"执行后续所有 case——输出C、D、E。💡 秒懂技巧: switch 就像电梯按钮——按了3楼,如果没有
break(没有"关门"指令),电梯会继续往上走,每层都停一下。所以记得在每个 case 后面加break来"关门"。
9. 以下程序定义了一个函数,它实现的是( )
int f(int n) {
if (n <= 1) return 1;
return n * f(n - 1);
}A. 斐波那契数列 B. 阶乘 C. 累加和 D. 幂运算
答案:B
解析: 这是一个递归函数。
f(3) = 3 * f(2) = 3 * 2 * f(1) = 3 * 2 * 1 = 6,正是 3!(阶乘)。💡 秒懂技巧: 递归就像"俄罗斯套娃"——想算 5!,先算 4!,再算 3!……直到最小的娃娃(n=1)。然后一路乘回来。递归必须要有"出口"(
n <= 1返回1),否则会无限套娃导致栈溢出。
10. 以下程序输出是( )
struct Student {
char name[20];
int age;
};
struct Student s = {"张三", 20};
struct Student *p = &s;
printf("%s", (*p).name);A. 张三 B. 地址值 C. 编译错误 D. 空
答案:A
解析:
(*p).name先解引用指针p得到结构体s,再访问name成员,输出 "张三"。等价于p->name。💡 秒懂技巧: 结构体指针就像"指向一张表格的箭头"——
(*p).name是"先顺着箭头找到表格,再看表格里的'姓名'这一栏"。更常用的写法是p->name,箭头符号->就是专门为结构体指针设计的快捷方式。
数据结构部分(10题)
11. 在长度为 的顺序表中,删除第 个元素( )需要移动的元素个数是( )
A.
答案:B
解析: 删除第
个元素后,它后面的 个元素都需要向前移动一位。 💡 秒懂技巧: 就像排队时一个人被叫走了——他后面的人全部往前挪一步。第
个走了,后面 个人都要挪。
12. 链表相对于顺序表的优势是( )
A. 随机存取 B. 插入删除不需要移动元素 C. 存储密度高 D. 查找速度快
答案:B
解析: 链表插入和删除只需修改指针指向,不需要移动其他元素。但链表不支持随机存取(必须从头遍历),且需要额外空间存储指针。
💡 秒懂技巧: 顺序表就像电影院座位——人挨着人,想插个人进去,后面全得挪。链表就像火车车厢——车厢之间用挂钩连接,想加一节车厢,只要把前后的挂钩解开再挂上就行,其他车厢不用动。
13. 一个栈的入栈序列是 1, 2, 3, 4,出栈序列不可能的是( )
A. 4, 3, 2, 1 B. 1, 2, 3, 4 C. 4, 3, 1, 2 D. 2, 1, 4, 3
答案:C
解析: 栈是 LIFO(后进先出)。对于 C 选项:4 先出说明 1,2,3,4 全部入栈,此时栈顶是 3,出栈顺序应该是 4,3,2,1,不可能先出 4,3 后出 1,2(因为 2 在 1 上面)。
💡 秒懂技巧: 栈就像一摞盘子——你只能从最上面拿。如果 4 先出,说明 1,2,3,4 都摞好了,那接下来只能拿 3,不能跳过 3 拿 1 或 2。
14. 一个队列的入队顺序是 A, B, C, D,出队顺序是( )
A. D, C, B, A B. A, B, C, D C. A, C, B, D D. 不确定
答案:B
解析: 队列是 FIFO(先进先出),先入队的先出队,所以出队顺序与入队顺序相同。
💡 秒懂技巧: 队列就像超市排队结账——先来的人先结账走人。A 先排,A 先走;B 其次,B 其次走。
15. 一棵完全二叉树有 100 个结点,其叶子结点数是( )
A. 50 B. 51 C. 49 D. 100
答案:A
解析: 完全二叉树中,叶子结点数 = 非叶子结点数(或比非叶子多1)。总结点数 100 为偶数,所以叶子结点数 = 50。
💡 秒懂技巧: 完全二叉树就像"按顺序坐座位"——先坐满第一排,再坐第二排……最后坐最后一排时,可能坐不满但必须从左到右连续坐。叶子结点就是最后一排的人。
16. 对下图进行深度优先遍历(DFS),从顶点 A 出发,正确的访问序列是( )
图:A 连接 B, C;B 连接 A, D;C 连接 A, D;D 连接 B, C
A. A, B, C, D B. A, B, D, C C. A, D, B, C D. A, C, D, B
答案:B
解析: DFS 从 A 出发,先访问 A,然后选择一条未访问路径深入。A→B→D→C 是一个可能的序列(A→B 深入,B→D,D→C)。
💡 秒懂技巧: DFS 就像"走迷宫走到底再回头"——从入口开始,选一条路一直走到底,走不通了再退回来走另一条。BFS 是"一层一层扩散"——像水波纹一样,从中心一圈一圈往外扩展。
17. 哈希查找中,解决冲突的两种主要方法是( )
A. 开放地址法和链地址法 B. 顺序查找和折半查找 C. 冒泡排序和快速排序 D. 先序遍历和后序遍历
答案:A
解析: 哈希表解决冲突的两种主要方法是开放地址法(线性探测、二次探测等)和链地址法(拉链法)。
💡 秒懂技巧: 哈希表就像"按姓名首字母分信箱"——但可能两个人姓的首字母一样(冲突)。开放地址法:如果 A 的信箱被占了,就放到旁边的空信箱。链地址法:每个信箱里放一个"小篮子",可以放多封信。
18. 下列排序算法中,最坏情况下时间复杂度最低(最优)的是( )
A. 冒泡排序 B. 快速排序 C. 直接插入排序 D. 归并排序
答案:D
解析:
- 冒泡排序:最坏
- 快速排序:最坏
(但平均 ) - 直接插入排序:最坏
- 归并排序:最坏
所以归并排序的最坏情况最优。
💡 秒懂技巧:
- 冒泡 = 相邻两个人比身高,高的往后站 → 慢但稳
- 快速 = 选一个"基准",比他小的站左边,大的站右边 → 大多数情况很快,但运气不好时很慢
- 归并 = 先分成最小单位,再两两合并 → 稳定发挥,不管什么情况都一样快
19. 在一个长度为 的有序表中,采用折半查找,查找成功的最多比较次数是( )
A.
答案:C
解析: 折半查找每次排除一半区间,最多比较
次。 💡 秒懂技巧: 折半查找就像猜数字游戏——100 以内的数,你猜 50,我说"大了",你就知道在 1-49 之间,一次排除一半。100 个数最多猜 7 次(
,+1 = 7 次)。
20. 一棵二叉树的中序遍历序列是 DBEAC,后序遍历序列是 DEBCA,则先序遍历序列是( )
A. ABCDE B. ABDCE C. ABDEC D. ADBEC
答案:C
解析:
- 后序最后一个元素是 A,所以 A 是根结点
- 中序中 A 左边是 DBE(左子树),右边是 C(右子树)
- 先序 = 根 → 左子树先序 → 右子树先序 = A → BDE → C = ABDEC
💡 秒懂技巧:
- 后序最后一个 = 根
- 先序第一个 = 根
- 中序根左边 = 左子树,右边 = 右子树
- 用这个规律,先找到根,再分左右子树,递归下去
答案速查
| 题号 | 答案 | 考点 |
|---|---|---|
| 1 | D | 未定义行为 |
| 2 | D | 指针与数组 |
| 3 | A | 二级指针 |
| 4 | B | break 语句 |
| 5 | B | 指针运算 |
| 6 | B | 指针赋值 |
| 7 | A | 字符串比较 |
| 8 | C | switch 穿透 |
| 9 | B | 递归函数 |
| 10 | A | 结构体指针 |
| 11 | B | 顺序表删除 |
| 12 | B | 链表 vs 顺序表 |
| 13 | C | 栈的出栈序列 |
| 14 | B | 队列 FIFO |
| 15 | A | 完全二叉树 |
| 16 | B | 深度优先遍历 |
| 17 | A | 哈希冲突解决 |
| 18 | D | 排序算法复杂度 |
| 19 | C | 折半查找比较次数 |
| 20 | C | 二叉树遍历还原 |