第一部分数据结构一、是非判断题(本题共10分,每小题各1分)(对于下面给出的论述,你认为正确,请在小题后的括号中填入符号√,否则,填入符号×)1.对算法进行分析的目的是为了提高算法的质量。
()2.一般情况下,双向链表比单向链表要占用更多的存储空间。
()3.将插入与删除操作限制在表的一端的线性表被称为堆栈。
()4.完全二叉树不一定是满二叉树,满二叉树一定是完全二叉树。
()5.利用二叉树的前序遍历序列和后序遍历序列一定可以构造出一棵二叉树。
()6.邻接表中边结点数目为偶数的图一定是无向图。
()7.拓扑排序不是检测有向图中是否存在回路的惟一方法。
()8.采用折半查找的线性表只要求表中元素按值的大小有序排列就可以。
()9.对具有n个元素的序列进行插入排序,排序的总趟数为n-1。
()10.无论什么情况,快速排序法比其他排序法的时间效率都要高。
()二、填空题(本题共15分,每小题各1分)1.若长度为n的线性表采用顺序存储结构,当不溢出时,在其第i个位置(1≤i≤n+1)插入一个新的数据元素之前需要依次移动()个元素的位置。
2.在非空双向循环链表中由q指的链结点前面插入一个p指的链结点的过程对应的语句依次为:p->rlink=q; p->llink=q->llink; q->llink=p; ()。
(空白处为一条语句)3.在实际应用中,当堆栈的最大长度难以估计时,堆栈最好采用()存储结构。
4.若a,b,c,d是初始为空的队列的输入序列,则此时该队列的输出序列是()。
5.若具有n个结点的二叉树采用二叉链表存储,则链表中有()个指针域存放着NULL。
6.已知二叉树的前序遍历序列为ABDCEFG,中序遍历序列为DBCAFEG,其后序遍历序列为()。
7.采用“逐点插入法”建立序列(54,28,16,34,73,62,95,60,26,43)的二叉排序树后,在该二叉排序树中查找到数据元素62时一共进行了()次元素之间的比较。
8.在一个图中,所有顶点的度数之和等于所有边数的()倍。
9.具有n个顶点的有向图最多有()条边。
10.具有n个顶点的无向连通图采用邻接矩阵表示,邻接矩阵中至少有()个非零元素。
11.将数据元素2,4,6,8,10,12,14,16,18,20依次存放于一个一维数组中(设数组下标从0开始),然后采用折半查找方法查找元素12,被比较过的数组元素的下标依次为()。
12.若一个待散列存储的线性表为K=(18,25,63,50,42,32,9,45),散列函数为H(k)=k MOD 9,则与元素18发生冲突的元素有()个。
13.若对序列(1,2,5,3,4)采用泡排序法按元素值从小到大进行排序,则整个排序过程中进行的元素之间的比较次数为()。
14.若对序列(tang, deng, an, wang, shi, bai, fang, liu)采用选择排序法按字典顺序进行排序,则第三趟排序结束时序列的状态是()。
15.设有10000个元素组成的序列,希望尽快挑选出其中前10个(仅挑出前10个!)最大值元,在不改变已有算法结构的前提下,插入排序法、快速排序法、堆积排序法和泡排序法这4种内排序算法中,最合适的是()。
三、综合题(本题共15分,每小题各5分)1.证明:具有n个结点的非空满二叉树,其叶结点的数目为(n+1)/2。
2.已知某带权连通图采用邻接矩阵存储,邻接矩阵以三元组表形式给出。
邻接矩阵下三角形部分的元素(不包括主对角线上元素)对应的各三元组分别为),∝),(5,2,4),(5,3,∝(2,1,7),(3,1,6),(3,2,8),(4,1,9),(4,2,4),(4,3,6),(5,1, (5,4,2)。
请分别画出该连通图所有可能的最小生成树。
3.已知散列函数为H(key)=(key%3) MOD 11,散列地址空间为[0..10],并且采用线性探测再散列法处理冲突。
请画出在初始为空的散列表中依次插入22,41,53,8,46,30,1,31,66以后散列表的状态。
四、算法设计题(本题10分)结点的祖先定义为从根结点到该结点的所有分支上经过的结点。
已知非空二叉排序树采用二叉链表存储结构,链结点构造为lchild data rchild, 根结点指针为T。
请写一非递归算法, 依次打印数据信息为item的结点的祖先结点。
设结点的数据信息分别为整数,并且假设该结点的祖先结点存在。
第二部分 C语言程序设计五、单项选择题(本题共20分,每小题各1分)1.一个C语言程序是由()。
A.一个主程序和若干个子程序组成 B.函数组成C.若干过程组成D.若干子程序组成2.当把以下四个表达式用作if语句的控制表达式时,其中有一个选项与其他三个选项的含义不同,这个选项是()。
A.k%2 B.k%2==1 C.(k%2)!=0 D.!k%2==13.下列运算符中优先级最低的是()。
A.+ B.&& C.?: D.!=4.以下能够正确地定义整型变量a,b和c,并且为其赋初值5的语句是()。
A.int a=b=c=5; B.int a,b,c=5;C.a=5,b=5,c=5; D.a=b=c=5;5.若有说明:double y=0.5,z=1.5; int x=10; 则能够正确使用C语言库函数的赋值语句是()。
A.z=exp(y)+fabs(x); B.y=log10(y)+pow(y);C.z=sqrt(y-z); D.x=(int)(atan2((double)x,y)+exp(y-0.2));6.以下对二维数组a的正确说明是()。
A.int a[3][]; B.float a(3,4); C.double a[1][4]; D.float a(3)(4);7.若有条件表达式(exp) ? a++ : b--,则以下表达式中能够完全等价于表达式(exp)的是()。
A.(exp==0) B.(exp!=0) C.(exp==1) D.(exp!=1)8.以下不正确的if语句形式是()。
A.if(a>b&&a!=b); B.if(a==b) a+=b;C.if(a<b) {a++;b++;} D.if(a!=b) scanf(“%d”,&a) else scanf(“%d”,&b);9.若有以下语句int x=3;do{ printf(“%d\n”,x-=2); }while(!(--x));则上面程序段()。
A.输出结果是1 B.输出结果是3和0 C.输出结果是1和-2 D.是死循环10.以下for循环语句的执行次数是()。
for(x=0,y=0;(y=123)&&(x<4);x++);A.执行4次 B.执行3次 C.是无限循环D.循环次数不定11.设有如下程序段:t=0;while(printf(“*”)){t++;if(t<3) break;}下面给出的4个描述中,正确的是()。
A.其中循环控制表达式是不合法的B.其中循环控制表达式与0等价C.其中循环控制表达式与‘0’等价 D.以上说法都不对12.C语言允许函数值类型缺省定义,此时该函数值隐含的类型是()。
A.int类型 B.float类型C.long类型 D.double类型13.对于C语言而言,以下正确的描述是()。
A.函数的定义可以嵌套,但函数的调用不可以嵌套B.函数的定义不可以嵌套,但函数的调用可以嵌套C.函数的定义和函数的调用都不可以嵌套D.函数的定义和函数的调用都可以嵌套14.以下关于宏替换的叙述中,错误的是()。
A.宏替换不占用运行时间 B.宏名无类型C.宏替换只是字符替换D.宏名必须用大写字母表示15.若已有定义:int k=2; int *p1, *p2; 且p1和p2均已指向变量k,则下面不能正确执行的赋值语句是()。
A.k=*p1+*p2; B.p1=p2; C.p2=k; D.k=*p1*(*p2);16.若已有定义:int a[2][3]; 则对a数组的第i行第j列(假设i,j已正确说明并已赋值)元素地址的正确引用为()。
A.*(a+j) B.a+j C.(a+i) D.*(a+j)17.若有说明:int *p,m=5,n; 则下面给出的4个程序段中,正确的是()。
A.p=&n; B.p=&n;scanf(“%d”,&p);scanf(“%d”,*p);C.scanf(“%d”,&p); D.p=&n;*p=n; *p=m;18.已有函数max(a,b),为了让函数指针变量p指向函数max,正确的赋值方法是()。
A.p=max; B.*p=max; C.p=max(a,b); D.*p=max(a,b);19.以下对结构体变量stu1中成员age的不正确引用的是()。
struct student{int age;int num;}stu1,*p;p=&stu1;A.student.age B.stu1.age C.p->age D.(*p).age20.在C语言中,库函数fgets(str,n,fp)的功能是()。
A.从str中读取至多n个字符到文件fpB.从文件fp中读取长度为n的字符串存入str指向的内存C.从文件fp中读取长度不超过n-1的字符串存入str指向的内存D.从文件fp中读取n个字符串存入str指向的内存六、填空题(本题共15分,每小题各3分)1.若运行以下程序时,从键盘输入2473<CR>(<CR>表示回车。
下同),则下面程序的运行结果是()。
#include <stdio.h>main( ){ int c;while((c=getchar())!=‘\n’)switch(c-‘2’){case 0:case 1: putchar(c+4);case 2: putchar(c+4); break;case 3: putchar(c+3);default: putchar(c+2); break;}printf(“\n”):}2.当从键盘上输入18<CR>以后,下面程序的运行结果是()。
main( ){ int x,u,i,j,a[8];scanf(“%d”,&x);i=0;do{u=x/2;a=x%2;i++;x=u;}while(x>=1);for(j=i-1;j>=0;j--)printf(“%d”,a[j]);}3.以下程序的运行结果是()。
main( ){ increment();increment();increment();}increment(){ static int y=0;y+=1;printf(“%d”,y);}4.下面程序的运行结果是()。