【PTA】【878真题】浙江大学软件学院878自命题2020真题

本文提供了一组C语言与数据结构的选择填空题,涉及指针操作、循环控制、字符串处理、数组、二叉树、排序算法等多个知识点。题目包括了变量指针的自增操作、循环条件判断、字符串赋值、数组元素访问、二叉树性质、排序算法效率比较等。解答这些题目有助于巩固C语言基础和深化对数据结构的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:

  • 题目来自PTA平台的C语言与数据结构考研模拟卷(5)
  • 部分题目没答案是因为博主也做错了,不知道正确答案
  • 如果有不会做的题目或者知道正确答案,可以评论或者私信我,谢谢

选择题

2-1

若变量已正确定义并且指针p已经指向某个变量x,则(*p)++相当于____。

选项
Ap++
B x++
C*(p++)
D&x++

2-2

下列程序for循环退出时,ij的值分别是:

for (i=0,j=0; (i<5)&& (j!=4); i++,j++);
选项
A4,4
B4,5
C5,4
D三个选项都不对

2-3

设变量定义为 char a[20], *p=a; 下面赋值语句中正确的是:

选项
Ap= “Zhejiang”;
Ba= “Zhejiang”;
C*p= “Zhejiang”;
Da[20]= “Zhejiang”;

2-4

设有变量定义: int a[2][3]={0,1,2,3,4,5}; 下面 4 个表达式中最大的是:

选项
Aa[1][2]-2
B a[0][3]+1
Ca[2][-3]
D*(*a+3)

2-5

下列程序段的输出结果是:

char *s[]={"Zhejiang", "University", "Computer", "Science"};
printf("%s", *(s+2)+3);
选项
Aversity
B puter
Cence
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;
}
选项
A1 2
B1 5
C3 2
D3 5

2-7

表达式 -1<0<1 的值是:

选项
A-1
B1
C0
D语法错误

2-8

对于以下变量定义,赋值错误的是:

struct node {
    char s[10];
    int i;
} p[5];
char *t= “abc”;
选项
Ap[0].i=2;
B(p+2)->s=t;
C(*p).i=*(t+1)-‘a’;
D*(p->s)= *(t+1);

2-9

以下不是无限循环的语句是:

选项
Afor(; ; x++);
B while(0) { x++;}
Cfor(y=0,x=1; x>y++; x++);
Dfor(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;
}
选项
A6
B7
C8
D三种选项均不是

2-11

执行完以下语句段后,s 的值是:

int i=5, s=0;
do  {if (i%2) continue; else s+=i;} while (--i);
选项
A15
B9
C6
D5

2-12

执行下列语句段后,程序的输出是:

f (int x) {   
    if(x<=1) return 1;
    else return f(x-1)+f(x-2);
}
int main( )
{  printf("%d", f(4));
}
选项
A3
B4
C5
D6

2-13

执行下列语句后,ab值分别是:

char  a = 3, b = 6;
a^=b^=a^=b;
选项
A3,3
B 6,3
C6,6
D语法有错

2-14

设有如下函数 strnp(),期望返回字符串s 的最后n 个字符所构成的子串。比如,strnp("abcdef",3) 将返回"def"。空缺的语句应该是:

char *strnp(char s[],int n)
{  return ______;
}
选项
As+strlen(s)-n;
Bs+n;
Cs-n;
Ds[strlen(s)-n];

2-15

xyz均为 int类型,若表达式 x||y&&z的值为 1,则

选项
A若 x 为 0,则 y 和 z 必均为 1
B若 y 和 z 均为 1,则 x 必为 0
Cx、y、z 必都为 1
D若 x 为 0,则 y 和 z 均不为 0

2-16

以下给出四种算法的时间复杂度,对于充分大的N,哪种算法最快?

选项
AO(N2)O(N^2)O(N2)
BO(N(log⁡N)2)O(N(\log N)^2)O(N(logN)2)
CO(N2log⁡N)O(N^2\log N)O(N2logN)
DO(Nlog⁡(N2))O(N\log (N^2))O(Nlog(N2))

2-17

对于顺序存储和单向链式存储的长度为 N 的线性表,删除最后一个结点的时间复杂度分别为:

选项
AO(1)O(1)O(1)O(N)O(N)O(N)
BO(N)O(N)O(N)O(1)O(1)O(1)
CO(1)O(1)O(1)O(1)O(1)O(1)
DO(N)O(N)O(N)O(N)O(N)O(N)

2-18

某队列允许在其两端进行出队操作,但仅允许在一端进行入队操作。若按1、2、3、4、5的顺序入队,则不可能得到的出队序列是:

选项
A1、3、2、5、4
B2、3、1、4、5
C5、1、3、2、4
D3、5、1、4、2

2-19

对于一棵满三叉树(即树中除了叶结点外,其它结点的度均为3,称为“满结点”),如果树中有61个叶结点,则一定有多少个满结点?

选项
A30
B31
C32
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 树,错误的描述是:

选项
A33 是 25 的右孩子
B12 是 16 的父结点
C8 是 5 的父结点
D25 和 8 是兄弟结点

2-23

设最小堆(小根堆)序列为 { 1, 3, 5, 9, 12, 10 }。删除堆顶元素后再插入 4,调整后得到的最小堆序列是:

选项
A3,9,5,4,12,10
B3,5,9,12,10,4
C4,3,5,9,12,10
D3,9,4,10,12,5

2-24

将文本“this is a test”进行哈夫曼编码后,该文本所占总位数为:

选项
A42
B38
C29
D27

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 到其他各顶点的最短路径,依次得到的各最短路径的目标顶点是:
在这里插入图片描述

选项
A1, 2, 3, 4, 5
B1, 4, 3, 2, 5
C1, 3, 4, 5, 2
D1, 3, 5, 2, 4

2-29

对下图从顶点 A 出发进行广度优先搜索,哪个是正确的搜索序列?
在这里插入图片描述

选项
AABFEGCD
BADBCFEG
CADBCFGE
DACDFBEG

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 存放在散列表中的位置是:

选项
A6
B5
C1
D10

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);
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值