Skip to content

3.2 更多同型练习题

计算机程序设计 · C语言 · 3.2 更多同型练习题

更多同型练习题 · 计算机基础与程序设计

适用:2027 届广东专升本《计算机基础与程序设计》 覆盖:C语言10题 + 数据结构10题,每题配解析+秒懂技巧用法:先闭卷做,再看解析,错题回系统笔记补概念


C 语言部分(10题)

1. 以下程序输出结果是( )

c
int x = 5;
printf("%d", x-- - --x);

A. 0  B. 1  C. 2  D. 未定义行为

答案:D

解析: 同一个表达式中对 x 多次修改(x----x),顺序未定义,属于未定义行为。

💡 秒懂技巧: 就像你同时说"先吃饭再洗碗"和"先洗碗再吃饭"——两个指令冲突了,结果不确定。C语言规定:一条语句中,同一个变量最多只能被修改一次。


2. 以下程序输出结果是( )

c
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. 以下程序输出是( )

c
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. 以下程序输出是( )

c
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. 以下程序输出是( )

c
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. 以下程序输出是( )

c
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. 以下程序输出是( )

c
char s1[] = "abc";
char s2[] = "abc";
printf("%d", strcmp(s1, s2));

A. 0  B. 1  C. -1  D. 随机值

答案:A

解析: strcmp 比较两个字符串的内容是否相等。因为 s1s2 的内容都是 "abc",所以返回 0(相等)。

💡 秒懂技巧: strcmp 就像"逐字对照检查"——一个字一个字地比,全部一样就返回0。不相等时返回第一个不同字符的差值(正数表示s1更大,负数表示s2更大)。


8. 以下程序输出是( )

c
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——输出 CDE

💡 秒懂技巧: switch 就像电梯按钮——按了3楼,如果没有 break(没有"关门"指令),电梯会继续往上走,每层都停一下。所以记得在每个 case 后面加 break 来"关门"。


9. 以下程序定义了一个函数,它实现的是( )

c
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. 以下程序输出是( )

c
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. 在长度为 n 的顺序表中,删除第 i 个元素(1in)需要移动的元素个数是( )

A. i  B. ni  C. ni+1  D. ni1

答案:B

解析: 删除第 i 个元素后,它后面的 ni 个元素都需要向前移动一位。

💡 秒懂技巧: 就像排队时一个人被叫走了——他后面的人全部往前挪一步。第 i 个走了,后面 ni 个人都要挪。


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

解析:

  • 冒泡排序:最坏 O(n2)
  • 快速排序:最坏 O(n2)(但平均 O(nlogn)
  • 直接插入排序:最坏 O(n2)
  • 归并排序:最坏 O(nlogn)

所以归并排序的最坏情况最优。

💡 秒懂技巧:

  • 冒泡 = 相邻两个人比身高,高的往后站 → 慢但稳
  • 快速 = 选一个"基准",比他小的站左边,大的站右边 → 大多数情况很快,但运气不好时很慢
  • 归并 = 先分成最小单位,再两两合并 → 稳定发挥,不管什么情况都一样快

19. 在一个长度为 n 的有序表中,采用折半查找,查找成功的最多比较次数是( )

A. n  B. log2n  C. log2n+1  D. n/2

答案:C

解析: 折半查找每次排除一半区间,最多比较 log2n+1 次。

💡 秒懂技巧: 折半查找就像猜数字游戏——100 以内的数,你猜 50,我说"大了",你就知道在 1-49 之间,一次排除一半。100 个数最多猜 7 次(log21006.64,+1 = 7 次)。


20. 一棵二叉树的中序遍历序列是 DBEAC,后序遍历序列是 DEBCA,则先序遍历序列是( )

A. ABCDE  B. ABDCE  C. ABDEC  D. ADBEC

答案:C

解析:

  • 后序最后一个元素是 A,所以 A 是根结点
  • 中序中 A 左边是 DBE(左子树),右边是 C(右子树)
  • 先序 = 根 → 左子树先序 → 右子树先序 = A → BDE → C = ABDEC

💡 秒懂技巧:

  • 后序最后一个 = 根
  • 先序第一个 = 根
  • 中序根左边 = 左子树,右边 = 右子树
  • 用这个规律,先找到根,再分左右子树,递归下去

答案速查

题号答案考点
1D未定义行为
2D指针与数组
3A二级指针
4Bbreak 语句
5B指针运算
6B指针赋值
7A字符串比较
8Cswitch 穿透
9B递归函数
10A结构体指针
11B顺序表删除
12B链表 vs 顺序表
13C栈的出栈序列
14B队列 FIFO
15A完全二叉树
16B深度优先遍历
17A哈希冲突解决
18D排序算法复杂度
19C折半查找比较次数
20C二叉树遍历还原

回系统笔记 · 高频考点强化练习 · 回真题总览

仅供个人学习 · 考生回忆版 · 非考试院原卷