说明:
- 题目来自PTA平台的C语言与数据结构考研模拟卷(5)
- 部分题目没答案是因为博主也做错了,不知道正确答案
- 如果有不会做的题目或者知道正确答案,可以评论或者私信我,谢谢
选择题
2-1
若变量已正确定义并且指针p已经指向某个变量x,则(*p)++相当于____。
选项 | |
---|---|
A | p++ |
B | x++ |
C | *(p++) |
D | &x++ |
2-2
下列程序for
循环退出时,i
和 j
的值分别是:
for (i=0,j=0; (i<5)&& (j!=4); i++,j++);
选项 | |
---|---|
A | 4,4 |
B | 4,5 |
C | 5,4 |
D | 三个选项都不对 |
2-3
设变量定义为 char a[20], *p=a;
下面赋值语句中正确的是:
选项 | |
---|---|
A | p= “Zhejiang”; |
B | a= “Zhejiang”; |
C | *p= “Zhejiang”; |
D | a[20]= “Zhejiang”; |
2-4
设有变量定义: int a[2][3]={0,1,2,3,4,5};
下面 4 个表达式中最大的是:
选项 | |
---|---|
A | a[1][2]-2 |
B | a[0][3]+1 |
C | a[2][-3] |
D | *(*a+3) |
2-5
下列程序段的输出结果是:
char *s[]={"Zhejiang", "University", "Computer", "Science"};
printf("%s", *(s+2)+3);
选项 | |
---|---|
A | versity |
B | puter |
C | ence |
D | 程序有错 |
2-6
下列程序的输出结果是:
void fun(int n, int *m)
{ n=n+2;
*m += n;
}
int main( )
{ int a=1,b=2;
fun(a,&b);
printf("%d %d",a,b);
return 0;
}
选项 | |
---|---|
A | 1 2 |
B | 1 5 |
C | 3 2 |
D | 3 5 |
2-7
表达式 -1<0<1
的值是:
选项 | |
---|---|
A | -1 |
B | 1 |
C | 0 |
D | 语法错误 |
2-8
对于以下变量定义,赋值错误的是:
struct node {
char s[10];
int i;
} p[5];
char *t= “abc”;
选项 | |
---|---|
A | p[0].i=2; |
B | (p+2)->s=t; |
C | (*p).i=*(t+1)-‘a’; |
D | *(p->s)= *(t+1); |
2-9
以下不是无限循环的语句是:
选项 | |
---|---|
A | for(; ; x++); |
B | while(0) { x++;} |
C | for(y=0,x=1; x>y++; x++); |
D | for(i=0; ; i–) sum+=i; |
2-10
下列程序的执行结果是:
int main()
{ int i;
char *s= “i=\t%d\n”;
for (i=0; *s++; i++);
printf(“%d”, i);
return 0;
}
选项 | |
---|---|
A | 6 |
B | 7 |
C | 8 |
D | 三种选项均不是 |
2-11
执行完以下语句段后,s
的值是:
int i=5, s=0;
do {if (i%2) continue; else s+=i;} while (--i);
选项 | |
---|---|
A | 15 |
B | 9 |
C | 6 |
D | 5 |
2-12
执行下列语句段后,程序的输出是:
f (int x) {
if(x<=1) return 1;
else return f(x-1)+f(x-2);
}
int main( )
{ printf("%d", f(4));
}
选项 | |
---|---|
A | 3 |
B | 4 |
C | 5 |
D | 6 |
2-13
执行下列语句后,a
、b
值分别是:
char a = 3, b = 6;
a^=b^=a^=b;
选项 | |
---|---|
A | 3,3 |
B | 6,3 |
C | 6,6 |
D | 语法有错 |
2-14
设有如下函数 strnp()
,期望返回字符串s
的最后n
个字符所构成的子串。比如,strnp("abcdef",3)
将返回"def"
。空缺的语句应该是:
char *strnp(char s[],int n)
{ return ______;
}
选项 | |
---|---|
A | s+strlen(s)-n; |
B | s+n; |
C | s-n; |
D | s[strlen(s)-n]; |
2-15
设 x
、y
、z
均为 int
类型,若表达式 x||y&&z
的值为 1,则
选项 | |
---|---|
A | 若 x 为 0,则 y 和 z 必均为 1 |
B | 若 y 和 z 均为 1,则 x 必为 0 |
C | x、y、z 必都为 1 |
D | 若 x 为 0,则 y 和 z 均不为 0 |
2-16
以下给出四种算法的时间复杂度,对于充分大的N,哪种算法最快?
选项 | |
---|---|
A | O(N2)O(N^2)O(N2) |
B | O(N(logN)2)O(N(\log N)^2)O(N(logN)2) |
C | O(N2logN)O(N^2\log N)O(N2logN) |
D | O(Nlog(N2))O(N\log (N^2))O(Nlog(N2)) |
2-17
对于顺序存储和单向链式存储的长度为 N 的线性表,删除最后一个结点的时间复杂度分别为:
选项 | |
---|---|
A | O(1)O(1)O(1)和O(N)O(N)O(N) |
B | O(N)O(N)O(N)和O(1)O(1)O(1) |
C | O(1)O(1)O(1)和O(1)O(1)O(1) |
D | O(N)O(N)O(N)和O(N)O(N)O(N) |
2-18
某队列允许在其两端进行出队操作,但仅允许在一端进行入队操作。若按1、2、3、4、5的顺序入队,则不可能得到的出队序列是:
选项 | |
---|---|
A | 1、3、2、5、4 |
B | 2、3、1、4、5 |
C | 5、1、3、2、4 |
D | 3、5、1、4、2 |
2-19
对于一棵满三叉树(即树中除了叶结点外,其它结点的度均为3,称为“满结点”),如果树中有61个叶结点,则一定有多少个满结点?
选项 | |
---|---|
A | 30 |
B | 31 |
C | 32 |
D | 无法确定 |
2-20
某非空二叉树的先序遍历和后序遍历序列正好相反,则该二叉树一定是:
选项 | |
---|---|
A | 只有一个根结点 |
B | 所有结点只有左孩子 |
C | 所有结点只有右孩子 |
D | 无法确定 |
2-21
关于有 N 个结点的二叉搜索树(排序树),不正确的说法是:
选项 | |
---|---|
A | 其中序遍历序列一定是有序的 |
B | 其层序遍历的最后一个结点键值一定比根结点键值大 |
C | 同一层结点的键值从左到右一定是有序的 |
D | 查找一个键值需要的比较次数有可能达到 N |
2-22
将下列数(21, 33, 25, 16, 8, 12, 5)按顺序插入初始为空的 AVL 树中,关于所形成的 AVL 树,错误的描述是:
选项 | |
---|---|
A | 33 是 25 的右孩子 |
B | 12 是 16 的父结点 |
C | 8 是 5 的父结点 |
D | 25 和 8 是兄弟结点 |
2-23
设最小堆(小根堆)序列为 { 1, 3, 5, 9, 12, 10 }。删除堆顶元素后再插入 4,调整后得到的最小堆序列是:
选项 | |
---|---|
A | 3,9,5,4,12,10 |
B | 3,5,9,12,10,4 |
C | 4,3,5,9,12,10 |
D | 3,9,4,10,12,5 |
2-24
将文本“this is a test”进行哈夫曼编码后,该文本所占总位数为:
选项 | |
---|---|
A | 42 |
B | 38 |
C | 29 |
D | 27 |
2-25
关于有向图,下列哪个结论是正确的?
选项 | |
---|---|
A | 所有顶点的入度与出度之和等于所有边之和 |
B | 其邻接矩阵表示比邻接表表示更易于求一个顶点的入度 |
C | 其邻接矩阵总是不对称的 |
D | 如果图是弱连通但不是强连通的,则至少有一个顶点的入度为 1 |
2-26
关于有权无向图,下列哪个结论是错误的?
选项 | |
---|---|
A | 其邻接矩阵总是对称的 |
B | 如果一次广度优先搜索不能访问其所有顶点,则该图一定不连通 |
C | 如果图不连通,则至少有一个顶点的度为0 |
D | 权重最大的边也有可能出现在该图的最小生成树上 |
2-27
在拓扑排序算法中用堆栈和用队列存储 0 入度的结点,产生的结果会不同吗?
选项 | |
---|---|
A | 肯定不同 |
B | 肯定相同 |
C | 有可能不同 |
D | 不能用堆栈存储 0 入度的结点 |
2-28
使用迪杰斯特拉(Dijkstra)算法求下图中从顶点 1 到其他各顶点的最短路径,依次得到的各最短路径的目标顶点是:
选项 | |
---|---|
A | 1, 2, 3, 4, 5 |
B | 1, 4, 3, 2, 5 |
C | 1, 3, 4, 5, 2 |
D | 1, 3, 5, 2, 4 |
2-29
对下图从顶点 A 出发进行广度优先搜索,哪个是正确的搜索序列?
选项 | |
---|---|
A | ABFEGCD |
B | ADBCFEG |
C | ADBCFGE |
D | ACDFBEG |
2-30
将 8 个数字采用取模的散列方法插入到有 1024 个单元的散列表中,以下说法哪个是正确的?
选项 | |
---|---|
A | 插入时一定会产生冲突 |
B | 若采用线性探测法处理冲突,则所有 8 个数字都一定可以被插入 |
C | 插入时产生冲突的概率为 8/1024 |
D | 插入时不可能产生冲突 |
2-31
给定散列表大小为 11,散列函数为 H(Key)=KeyH(Key)=Key%11H(Key)=Key。若采用平方探测法处理冲突:hi(k)=(H(k)+i2)h_i (k)=(H(k)+i^2 )%11hi(k)=(H(k)+i2)。将关键字序列 { 23, 2, 16, 32, 12 } 依次插入到散列表中。那么元素 12 存放在散列表中的位置是:
选项 | |
---|---|
A | 6 |
B | 5 |
C | 1 |
D | 10 |
2-32
排序任务完成的速度与什么因素有关?
选项 | |
---|---|
A | 算法的时间复杂度 |
B | 待排序数据的存储方式 |
C | 待排序数据的初始状态 |
D | 三项全都是 |
2-33
输入 10610^6106 个 2 位数的、从大到小有序的整数,现需要将它们从小到大排序。就排序速度而言,以下哪组关系是正确的?
选项 | |
---|---|
A | 希尔排序>归并排序>堆排序 |
B | 选择排序>冒泡排序>基数排序 |
C | 堆排序>快速排序>表排序 |
D | 桶排序>快速排序>插入排序 |
2-34
下列排序方法中,若数据存储在单链表中,且不允许将数据复制到数组,则最慢的算法是:
选项 | |
---|---|
A | 快速排序 |
B | 归并排序 |
C | 插入排序 |
D | 堆排序 |
2-35
在将数据按递增顺序排列的过程中,数据序列 { 66, 59, 52, 35, 53, 41, 48, 79, 82 } 只能是下列哪种排序算法的两趟排序结果?
选项 | |
---|---|
A | 堆排序 |
B | 插入排序 |
C | 归并排序 |
D | 基数排序 |
填空题
4-1
若输入 -7+12*3/4=<回车>
, 则以下程序的输出结果是0, -7, 5, 15, 60,
#include <stdio.h>
int main()
{ int m=0, sum=0;
char c, oldc='+';
do {c=getchar();
if(c<='9'&&c>='0') m=10*m+c - '0';
else { if(oldc=='+') sum += m;
else if(oldc=='-')sum -= m;
else sum *= m;
m=0;
oldc=c;
printf("%d, ", sum);
}
} while(c!='=');
}
4-2(暂时未知正确答案)
对于下列程序
#include <stdio.h>
void f(char *s, char c)
{ int i,j;
for(i=0, j=0; s[i]!='\0';i++)
if (s[i]!=' ' && s[i]!='\t' && s[i]!='\n' && s[i]!=c)
s[j++]=s[i];
s[j]= '\0';
}
int main()
{ char s[20]= "This\took\n!!";
f(s,'o');
printf("%s\n", s);
}
(1) 程序运行结果是Thisk!!
(2)函数 f(char *s, char c) 的功能是从字符串中
4-3
下列程序的输出结果是 8 6 4 2
#include <stdlib.h>
#define LEN sizeof(struct line)
struct line
{ int num ;
struct line *next;
};
int main( )
{ int k ;
struct line *p , *head ;
head=NULL;
for(k=1; k<10; k++){
if (k%2==1) continue;
p=(struct line *) malloc (LEN) ;
p->num=k;
p->next=head;
head=p;
}
while(p!=NULL){
printf("%d ", p->num) ;
p=p->next;
}
return 0;
}
4-4
给定输入序列 { 29, 12, 91, 37, 2, 18, 45, 62, 87, 56, 7, 22, 13, 74, 40 },请写出希尔排序利用增量序列 { 1, 3, 5, 7 } 进行排序的分步结果。
请顺序填写数字,以1个半角逗号 ,
分隔,中间不得有任何空格。
增量 7:29,12,56,7,2,13,45,40,87,91,37,22,18,74,62
增量 5:13,12,18,7,2,29,22,40,74,62,37,45,56,87,91
增量 3:7,2,18,13,12,29,22,37,45,56,40,74,62,87,91
增量 1:2,7,12,13,18,22,29,37,40,45,56,62,74,87,91
4-5(暂时未知正确答案)
给定无向带权图如图所示:
(1)请给出从顶点 A 出发深度优先搜索遍历该图的顶点序列(多个顶点可以选择时按字母序):A
(注意:填空内容不包含A,所有大写字母顺序写出,不带任何空格和其他符号)
(2)按权重非递减序列出最小生成树的边。每条边用两端点编号表示,字母序小的字母在前,例如 BE
对应顶点 B
和顶点 E
之间的权重为 7 的边。等权重的边按字母序递增列出。格式为:边1,边2,...
,边与边用一个半角逗号 , 分隔,中间没有空格。例如 AE,AD,BD,DF,CG,DG,CH
构成了一个生成树,但并非最小生成树。
答案:
该树的权重为:24
程序填空题
5-1 求 1/n! 的和
下列程序输入 n(n>0)n (n>0)n(n>0), 计算 s=1/1!+1/2!+1/3!+⋯+1/n!s=1/1!+1/2!+1/3!+⋯+1/n!s=1/1!+1/2!+1/3!+⋯+1/n!。请将缺省的语句补上。
int main( )
{ int k, n;
float f, s;
scanf("%d", &n);
s=0; // 填空处
for (k=1,f=1 ; k<=n; k++){
f=f*k; // 填空处
s=s+1.0/f;
}
printf("sum=%f\n", s);
return 0;
}
5-2 文件读写并去除注释
下列程序将 C 语言源程序 exam.c 中的注释内容(/*
和 */
之间的部分)除去,并输出到文件 exam.out 中。请将空缺的部分补上。
#include <stdio.h>
void delcomm(FILE *fp1,FILE *fp2)
{ int i=0;
char c;
while((c=fgetc(fp1))!=EOF) // 填空处
if (c=='\n') fprintf(fp2,"\n");
else
switch(i){
case 0:
if(c=='/') i=1;
else fprintf(fp2,"%c",c);
break;
case 1:
if(c=='*') i=2;
else {
fprintf(fp2,"/%c",c);
i=0;
}
break;
case 2:
if(c=='*') i=3;
break;
case 3:
i=(c=='/')? 0:2; // 填空处
break;
}
}
int main()
{
FILE *fp1,*fp2;
fp1=fopen("exam.c","r");
fp2=fopen("exam.out","w");
delcomm(fp1,fp2); // 填空处
fclose(fp1); fclose(fp2);
return 0;
}
5-3 括号匹配
下列代码的功能是判断一个表达式字符串 expr[]
中的小括号和中括号是否正常匹配。若一切正常则返回 1,否则返回 0。请完成程序填空。
注:不可使用题中未定义的函数。
int Match( char expr[] )
{ char Stack[MAXS];
int top;
int i, ret;
top = -1; i = 0; ret = 1;
while (expr[i]!='\0') {
if (expr[i]=='(' || expr[i]=='[')
Stack[++top]=expr[i]; // 填空处
else if (expr[i]==')' || expr[i]==']') {
if (
top==-1
) {
ret = 0; break;
}
else {
if ((Stack[top]=='(' && expr[i]!=')')
|| (Stack[top]=='[' && expr[i]!=']')) {
ret = 0; break;
}
else top--; // 填空处
}
}
i++;
}
if (top!=-1) ret = 0; // 填空处
return ret;
}
函数题
6-1 二叉搜索树中不小于 X 的元素
给定一棵二叉搜索树 T
和一个整数 X
,要求编写函数,按非递增序打印出 T
中所有不小于 X
的元素。
函数接口定义:
void Print_NLT( Tree T, int X );
其中 Tree 定义为:
typedef struct TreeNode *Tree;
struct TreeNode {
int Element;
Tree Left;
Tree Right;
};
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode *Tree;
struct TreeNode {
int Element;
Tree Left;
Tree Right;
};
Tree BuildTree(); /* details omitted */
void Output( int X ); /* details omitted */
void Print_NLT( Tree T, int X );
int main()
{
Tree T;
int X;
T = BuildTree();
scanf("%d", &X);
Print_NLT( T, X );
printf("End\n");
return 0;
}
/* 请在这里填写答案 */
输入样例1(图1):
输出样例1:
92 91 90 85 81 80 End
输入样例2(图2):
输出样例2(针对图2):
End
参考答案:
void Print_NLT( Tree T, int X )
{
if (T == NULL)
return;
Print_NLT(T->Right, X);
if(T->Element >= X)
Output(T->Element);
Print_NLT(T->Left, X);
}