来自微信公众账号:开点工作室(kaidiancs)
导语:计算机专业基础包括了程序设计,数据结构,算法,操作系统,计算机系统,计算机网络,编译原理,数据库技术等内容,是每个计算机专业学生必须要认真学习和熟练掌握的基本功,也是IT企业招聘程序员进行笔试面试的必考内容。临近期末,为了能让大家更好的复习专业基础知识,我们将陆续推送一批高质量的计算机专业基础知识练习题,大家可以测评一下自己基础知识的掌握情况,打造自己的专业知识题库为准备明年的春季招聘查漏补缺。今天推出第一期,有关程序设计基础知识的测试题目,内容包括C语言和数据结构。
1.下列运算符中优先级别最高的是
A.<
B.!
C.!=
D.&&
2.if语句的格式如下
if ( 表达式 ) 语句
其中的“表达式”
A.必须是逻辑表达式
B.必须是关系表达式
C.可以是逻辑表达式或关系表达式
D.可以是任意合法的表达式
3.C语言中数组名作为函数参数时,其数据传递方式是
A.地址传递
B.单向值传递
C.返回值传递
D.全局变量传递
4.下面程序的运行结果是
main ( )
{ int a=3, b=4, *q=&b;
*q= a+b; a = 5;
q =(a
printf ( "%d %d %d\n", a, b, *q );
}
A.3 4 4
B.3 4 5
C.5 7 5
D.5 7 7
5.已知:
struct date
{ int year;
int month;
int day;
} d, *p = &d;
下列引用结构成员的表达式中,错误的是
A.*p->year
B.d.day
C.p->month
D.(*p).year
6.在下列时间复杂度中,最大的是
A.O(n)
B.O( n log2 n)
C.O(n2)
D.O(2n)
7.在长度为n的链表的第i个节点后插入一个新节点,需要移动的节点数是
A.0
B.i
C.n-i
D.n-i+1
8.下列关于循环队列的叙述中,正确的是
A.队头指针固定不变,队尾指针随队列长度变化
B.队尾指针固定不变,队头指针随队列长度变化
C.队头指针可以大于队尾指针,也可以小于队尾指针
D.队头指针只能小于等于队尾指针,两者的差值为队长
9.下列关于哈夫曼树的叙述中,错误的是
A.哈夫曼树中没有度为1的节点
B.哈夫曼树是带权路径长度最小的二叉树
C.一组互不相同的权值可唯一确定一棵哈夫曼树
D.哈夫曼树的节点总数等于叶节点数的2倍减1
10.下图中不同的最小生成树的个数是
A.2
B.3
C.4
D.5
11.下列关于折半查找算法的叙述中,正确的是
A.可以用于有序的顺序表,也可以用于有序的链表
B.可以用于有序的顺序表,但不能用于有序的链表
C.可以用于无序的顺序表,也可以用于无序的链表
D.可以用于无序的顺序表,但不能用于无序的链表
12.如果说一个排序算法是稳定的,则它的含义是
A.待排序记录的关键字均互不相同
B.关键字相同的记录在排序前后的相对位置不变
C.该排序算法既可用于内排序,也可用于外排序
D.该排序算法既可用于顺序存储,也可用于链式存储
二.填空题
13.已知int a=5,b=8, c; 表达式 c= a/b*b的值是______。
14.C语言中强制退出当前循环可使用的语句是__________。
15.已知char a='A';语句printf ("%c",a+3 ); 的输出结果是______。
16.已知chars1[20]="Good", *s2="Luck!"; 函数strlen ( strcat (s1, s2 ))的值是______。
17.对以下二叉树进行后序遍历,得到的序列是_____________。
18.具有n个顶点的完全无向图,其顶点的度之和是______。
19.直接选择排序的时间复杂度为______。
三.简答题
20.已知顺序栈s的定义如下:
struct {
datatypedata[N]; /* 栈内最多存放N个元素 */
inttop; /* 栈顶指针,指向栈顶元素 */
} s; /* 栈名为s */
要求:
(1)给出判断栈空的条件;
(2)给出退栈操作的算法描述。
21.已知序列(20, 15, 18, 30, 25, 70, 80, 65),按给定顺序构造一棵二叉排序树,并给出成功查找时的平均查找长度。
四.程序分析题
22.请写出下列程序的输出结果。
void f30 ( int x[ ], int y[ ],int n, int m )
{ int i, count=0;
for ( i = 0 ; i < n ; i++ )
if ( x[i] > m )
y[ ++count ] = x[i];
y[0] = count;
}
main( )
{ int a[10] = {156, 12, 89, 44, 38, 45, 31, 27,55, 72}, b[11];
f30 ( a, b, 10, 50 );
for ( int i = 1 ; i < b[0] ; i++ )
printf ( "%d, ", b[i] );
printf ( "%d\n", b[ b[0] ] );
}
23.请写出下列程序的输出结果。
#include
main( )
{ int a[10] = { 79, 64, 15, 21, 67, 91, 39, 180,55, 49 };
int i, x, y;
if ( a[0] < a[1] )
{ x = a[0]; y = a[1]; }
else { x = a[1]; y = a[0]; }
printf ( "%d, %d, ", x, y );
for ( i = 2 ; i < 10 ; i++)
if ( a[i] < x )
x = a[i];
else
if ( a[i] > y )
y = a[i];
printf ( "%d, %d\n", x, y );
}
}
24.下列程序的功能是将带头节点的单链表head倒置后输出,请将程序空白处补充完整。
#include
structnode
{ int data;
struct node *next;
};
void f33 ( struct node *head )
{ struct node *h =head->next, *p, *q = ______; ①
while ( ______ ) ②
{ p= h;
h = h->next;
p->next = q;
______; ③
}
head->next = q;
}
void main ( )
{ struct node a[5] = {{0,&a[1]},{2,&a[2]},{4,&a[3]},{6,&a[4]},{8,NULL}};
struct node *head= a; /* a[0]为头节点 */
f33 ( head );
head = head->next;
while ( head )
{ printf( "%d ", head->data );
______; ④
}
printf ( "\n" );
}
五.程序设计题
25.设二叉树以二叉链表进行存储,节点结构如下:Lchild
data
Rchild
其中data的数据类型为int。要求:
(1)请给出该二叉树节点类型的C语言描述;
(2)编写一个递归函数count2计算给定二叉树中度为2的节点。
参考答案:
一、单项选择题
1.B
2.D
3.A
4.C
5.A
6.D
7.A
8.C
9.C
10.A
11.B
12.B
二、填空题
13.0
14.break(或goto)
15.D
16.9
17.d b e g f c a
18.n(n-1)
19.O(n2)
三.简答题
20.【参考答案1】
(1)
栈空的判断条件是:s.top == -1;
(2)
void pop( s, x )
{ if ( s.top == -1 ) 下溢;
else x= s.data[s.top--];
}
【参考答案2】
(1)
栈空的判断条件是:s.top == 0;
(2)
void pop( s,x )
{ if ( s.top == 0 ) 下溢;
else
{ s.top --;
x =s.data[s.top];
}
}
21.
平均查找长度=(1+2*2+3*3+2*4)/ 8 = 22 / 8 = 2.75
四、程序分析题
22.结果输出为:156,89, 55, 72
23.结果输出为:64, 79,15, 180
24.① NULL
② h或 h != NULL
③ q = p
④ head = head->next
五.程序设计题
25.【参考程序】
struct node
{ int data;
struct node * Lchild, * Rchild;
};
int n = 0; /* 外部变量,计算二叉树中度为2的节点数量 */
void count2 ( struct node * BT ) /* 按照后序遍历的思想进行计数 */
{ if ( BT != NULL )
{ if ( BT->Lchild != NULL&& BT->Rchild != NULL )
n++;
if( BT->Lchild != NULL )
count2( BT->Lchild );
if( BT->Rchild != NULL )
count2( BT->Rchild );
}
}