计算机水平考试-程序员分类模拟题数据结构与算法(一).doc

时间:2022-05-28 06:01:12 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
程序员分类模拟题数据结构与算法(-)

综合知识试题

K对具有n个元索的顺序表(采用顺序存储的线性表)进行 _________ 操作,其耗时与n的大小无关。

A. 在第i(lWiWn)个元素Z后插入一个新元素 B. 删除第i(lWiWn)个元素

C. 对顺序表中的元素进行排序

D. 访问第i(lWiWn)个元素的前驱和后继

2 若字符串s的长度为n(n>l)且其中的字符互不相同,贝Us的长度为2的子串右 ________ 个。

A n B n-l C n-2 D. 2

3 栈的运算特点是后进先出。元索abcd依次入栈,则不能得到的出栈序列是 __________ A- a b c d B. c a b d C. d c b a D. b c d a 4、某循环队列的容量为M,队头指针指向队头元素,队尾指针指向队尾元素Z后,如图8-18所示则队列屮的元索数目为 _______________ (MOD表示整除取余运算)



5 设初始栈为空,s表示入栈操作,x表示岀栈操作,则 _________ 是合法的操作序列。

A sxxsssxxx B xxssxxss C- sxsxssxx D xssssxxx

6 n个元索依次全部进入栈后,再陆续出栈并经过一个队列输出。那么, _________

A. 元素的出队次序与进栈次序相同

储环队列指针示童图

队崔

A. rear-front B. front-rear

re

II



(M=8)
B. 元素的出队次序与进栈次序相反 C. 元素的进栈次序与进队次序相同 D. 元素的出栈次序与出队次序相反 7 与单向链表相比,双向链表 ________ o

A. 要较少的存储空间 B.遍历元素需要的时问较短

C.较易于访问相邻节点 D.较易于插入和删除元素

8、若一个栈以向ftv [1. .n]存储,且空栈的栈顶指针topn+l,则将元素x入栈的正确操作是


A top=top+l V[top]=x C. top=top-l V[top]=x B. V[top]=x top=top+l D. V[top]=x top=top-l



9 在执行递归过程吋,通常使用的数据结构是 _______

A. stack B.队歹J queue Cgraph D M tree

10 设数组a[1..6, 0. .9]的元素以行为主序存放,每个元素占用一个存储单元,则数组元素a [3, 3]的地址为 ________ o

A. a+23 B a+27

C a+39 D. a+35

IK若二维数组P[1..5, 0..8]的首地址为base,数组元素按行存储,且每个元素占用1个存储单 元,则元索P[3, 3]在该数组空间的地址为 _________________________

A. base+13 B. base+16 C. base+18 D. base+21

2、釆用一维数组S存储一个n阶对称矩阵A的下三角部分(按行存放,包括主对角线),设元素A[i] [j] 存放在S[k]ijk均从1开始取值),_&S[1]=A[1] [1],Ukij的对应关系是 _____________

A.

例如,元素A⑶⑵存在S[5]中。



C. D.

13. _____________________________ 数组A[-5・・5, 0..8]按列存储。若第一个元索的首地址为丄00,且每个元索占用4个存储单元, 则元素A[2, 3]的存储地址为 o

A. 244 B. 260 C 364 D 300

14. 若二叉树的前序遍历序列与中序遍历序列相同且树中节点数大于1,则该二叉树的 __________ o

A.只有根节点无左予树 B.只有根节点无右子树 C.非叶子节点只有左子树 D.非叶子节点只冇右子树 15 由关键字序列12, 7, 36, 25, 18, 2 构造一棵二叉排序树(初始为空,第一个关键字作为根

节点插入,此后对于任意关键字,若小于根节点的关键字,则插入左子树屮,若大于根节点的关键字, 插入右子树中,口左、右子树均为二叉排序树),该二叉排序树的高度(层数)为 _________ o

A. 6 B. 5 C. 4 D 3

16. ____________________________________________ 对连通图进行遍历前设置所冇顶点的访问标志false 未被访问),遍历图后得到一个遍历序 列,初始状态为空。深度优先遍历的含义是:从图中某个未被访问的顶点v出发开始遍历,先访问v 并设置其访问标志为true已访问)同时将v加入遍历序列,再从v的未被访问的邻接顶点中选一个 顶点,进行深度优先遍历;若v的所有邻接点都已访问,则冋到v在遍历序列的直接前驱顶点,再进 行深度优先遍历,直至图屮所有顶点被访问过。 是图8-19的深度优先遍历序列。

A




17>在任意一棵非空的二叉树中,终端节点(叶子)的数目总是比具有两个孩子的非终端节点的数目

A.0 B.1

C.2

D.3

满二叉树的特点是每层上的节点数都达到最大值,因此对于高度为hh>l的满二叉树,其节点总数 18。对非空满二叉树,由根节点开始,按照先根后了树、先左了树后右了树的次序,从1, 2,

D 2h-l+l D 2i+2

3,・・•依次编号,则对于树中编号为i的非叶子节点,其右子树的编号为19 (高度为3的满二叉树如 20、数据结构中的树最适合用来表示 ________ 的情况。

A.数据元索有序 B.数据元索之间具冇多对多关系

C.数据元素无序 D.数据元素Z间具有一对多关系

21、二叉排序树或者是一棵空树,或者是具冇如下性质的二叉树:特其左子树非空,则左子树上所 有节点的值均小于根节点的值;若其右子树非空,则右子树上所有节点的值均大于根节点的值;其左、 右子树木身就是两棵二叉排序树。根据该定义,对一棵非空的二叉排序树进行 _____________ 历,可得到 一个节点元索的递壇序列。

A.前序(根、左、右) B.中序(左、根、右)

C.后序(左、右、根) D.层序(从树根开始,按层次) 19> A 2i B. 2i-l C 2i+l

22、广度优先遍历的含义是:从图中某个顶点v出发,在访问了v之后依次访问v的各个未被访问过的 接点,然后分别从这些邻接点出发依次访问它们的邻接点,且''先被访问的顶点的邻接点〃先于'' 访问的顶点的邻接点〃被访问,直至图中所冇己被访问的顶点的邻接点都被访问到。 __________ 是图 8的广度优先遍历序列。




A.1 2 6 3 4 5 B. 1 2 3 4 5 6 C. 1 6 5 2 3 4 D.1 6 4 5 2 3

23、对图822所示的二叉树进行屮序遍历(左子树、根、右子树)的结果是




二叉拥示竟图

A. 2 5 3 4 6 1 B. 2 5 3 4 1 6 C 2 6 5 4 1 3 D 2 6 4 5 3 1

若将图8-23"所示的无向图改为完全图,则还需要增加24条边;b的邻接矩阵表示 25 (行列均

ABCDE为序)。



24A. 1 B. 2

C5 D15

0 110 10 10

110 1

(a)

25A.

0 1 0 0

(b)

1 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0



0 0 1 0 0 _1 0 0 1 B.

0

无向图和有向图示意国

1110 0 0 110 1 0 0 110

c.


0 0 1 1 0 0 0 0 10 1 0 0 0 10

0 0 0 0

0 0 0 0

26、对如图824所示的二叉树进行后序遍历(左子树、右子树、根节点)的结果是 _________



二叉树示意图

A. 5 2 3 4 6 1 B. 5 2 3 4 1 6 C. 2 6 4 1 3 5 D 2 5 6 4 3 1

27、若线性表(24, 13, 31, 6, 15, 18, 8)采用散列(Hash)法进行存储和查找,设散列函数为

H(Key) =Key mod ",贝U构造散列表时发生冲突的元索为 _________ (其中的mod表示整除取余运算)

A2413

B615

C624

D188

28 线性表采用顺序存储结构,若表长为m,且在任何一个合法插入位置上进行插入操作的概率相同, 则插入一个元素平均移动 ______ 个元素。

A. m- B. m/2 C. m/2 + 1 D m

29 两个递增序列AB的长度分别为mn(mVn),将两者归并为一个长度为m+n的递增序列时, 并过程中元素的比较次数最少。

A. A的最大元素大于B的最大元素时

B. A的最大元素小于B的最小元素时 C. A的最小元素大于B的最小元素时 D. A的最小元索小于B的最大元索时

30、对于n个元素的关键字序列{匕,k2, k },若将其按次序对应到一棵具有n个节点的完全二叉 树上,使得任意节点都不大于其孩子节点(若存在孩子节点),则称其为小顶堆。根据以上定义, 是小顶堆。


21

B.

63 25 23

D.



31、采用哈希(或散列)技术构造查找表时,需要考虑冲突(碰撞)的处理,冲突是指 _______

A. 关键字相同的记录被映射到不同的哈希地址 B. 关键字依次被映射到编号连续的哈希地址 C. 关键字不同的记录被映射到同一个哈希地址 D. 关键字的数目超过哈希地址的数目

32、对于长度为的顺序存储的有序表,若采用折半查找(向下取整),则找到第5个元素需要与表 中的 __________ 个元素进行比较操作(包描与笫5个元素的比较)。

A5 B4 C3 D2

33、如果待排序序列中两个元索具冇相同的值,在排序前后它们的相互位置发生颠倒,则称该排序 算法是不稳定的。 ____________ 是稳定的排序方法,因为这种方法在比较相邻元素时,值相同的元素并不 进行交换。

A.冒泡排序 B.希尔排序 C快速排序 D.简单选择排序 34、用二分法来检索数据,最确切的说法是 ________

A. 仅当数据随机排列时,才能正确地检索数据

B. 仅当数据有序排列时,才能正确地检索数据 C. 仅当数据量较大时,才能冇效地检索数据 D. 仅当数拯量较小时,才能有效地检索数据

35、若原始数据序列23, 4, 45, 67, 12, 8, 19, 7釆用直接插入排序法(顺序地将每个元素插 入到它之前的适当位置)排序,则进行完第4趟后的排序结果是 ___________________

A. 4, 8, 45, 23, 67, 12, 19, 7 B. 4, 7, 8, 12, 23, 45, 67, 19

C 4, 12, 8, 19, 7, 23, 45, 67 D 4, 12, 23, 45, 67, 8, 19, 7

案例分析试题 试题一

阅读以下说明和C语言函数,回答问题。

[说明]

函数sortNODE*head的功能是:用冒泡排序法对单链表中的元素进行非递减排序。对于两 个相邻节点屮的元素,若较小的元素在后而,则交换这两个节点中的元素值。其中,head指向链表 的头节点。排序时,为了避免每趟都扫描到链表的尾节点,设置一个指针endptr,使其指向下趟扫 描需要到达的最后一个节点。例如,对于图8-25 a所示的链表进行一趟冒泡排序后,得到图8-25 b 所示的链表。

endplr




endptr



(1»

琏表 链表的节点类型定义如下: typedef Struet Node { int data

struct Node *next }NODE;

[C语言函数]

void sort(NODE *head) {

NODE *ptr, *preptr, *endptr

int tempdata ptr=head- >next while 36 /*查找表尾节点*/

ptr=ptr- >next endpt r=ptr / ★令endpt r指向表尾节点* / ptr= 37

while(ptr!=endptr) {

while( 38 ) {

if (ptr- >data>ptr- >next- >data) { tempdata=ptr- >data /*交换相邻节点的数据*/

ptr- >data=ptr- >next->data ptr- >next- >data=tempdata }

preptr=_39_ ptr=ptr- >next }

endptr=_40_ ptr=head- >next

试题二

阅读以下说明和c程序,回答问题。

[说明]

卜•面的程序用Dole Rob算法生成NN为奇数)魔方阵(各行、列、对角线数字Z和相等)。 算法的过程为:从1开始,按如下方法依次插入各自然数,直到N2为止。

在笫一行的正中插入1

新位置应当处于最近插入位置的右上方,若该位置已超出方阵的上边界,则新位置取应选列 的最下一个位置;若超出右边界,则新位置取应选行的最左一个位置。

若最近插入的元素是N的整数倍,则选同列的下一行位置为新位置。 例如,3阶魔方阵如下所示: 8 16

3 5 7 4 9 2 [C程序]

#include #include h> #define SIZE 50 main46


{

int row, col, n, value int a[SIZE+l] [SIZE+1] ;

/*不使用下标为0的元素★/

printf "请输入要输出魔方阵的阶数n奇数,V%dni, SIZE.; scanfH %dH, &n




if (! (n%2) | | n41 ) { printf ( ”轴入数据有误! \n"); exit47 }

row=l col=(n+l)/2 value=l while (value<=_42_) {

a [row] [col]=value 八计算下一位置*/ if(value%n!=0){ row-- 43 if (row

if (col>n) 44

}

else row++ value= 45 }

printf ("\n%d阶魔方阵如下所刀七\n\nn z n) for (row=l row<=n row++) {

for (col = l col<=n col + +)

printf("%5d"z a[row][col]) printf(n\nH)

阅读以下说明和c函数, 回答问题。 试题三

[说明]

计算机在处理算术表达式时,首先将其转换为后缀表达式。例如,表达式''46 + 5* (120-37)" 的后缀表达式形式为''46 5 120 37- * +〃。

计算后缀表达式时,从左至右扫描后缀表达式:若遇到运算对象,则压入栈中;遇到运算符, 则从栈屮弹出相关运算对象进行计算,并将运算结果压入栈屮。重复以上过程,直到后缀表达式扫描 结束。例如,后缀表达式''46 5 120 37 - * + 〃的汁算过程如下。

依次将465120> 37压入栈中。

遇到、'.〃,取出37120,计算120-37 = 83,将其压入栈中。 遇到'"〃,取出835,计算5x83=415,将其压入栈中。

遇到'' + 〃,取出41546,计算46+415=461,将其压入栈中。 表达式结束,则计算过程完成。

函数computing (char expt [] , int *result)的功能是基于栈计算后缀形式的表达式( 串形式存入字符数组expr)的值,并通过参数result返回该值。函数的返回值为-1/0,分别表示表 达式有/无错误。假设表达式中仅包含数字、空格和算术运算符号,其中所有项均以空格分隔,且运 算符仅包含加('' + )、减(''-)(")、除('\)

函数computing中所用栈的基本操作的函数原型说明如下。 void InitStack (STACK *s):初始化栈。

void Push (STACK *sz int e):将一个整数压栈,栈屮元素数目增1 void Pop (STACK *s):栈顶元素出栈,栈中元素数目减

int Top (STACK s):返冋非空栈的栈顶元素值,栈屮元素数口不变。 int IsEmpty (STACK s):s是空栈,则返回1否则返回0 [C函数]

int computing (char expr [] , int *result) {

STACK s; int tnum, a, b char *ptr InitStack (&s)


ptr=expr pstr

while (*ptr! = 1\01 ) /*字符*旨针指向后缀表逆式串的第一个字符*/

{


if(*ptr==' ') { /*当前字符是空格*/

46 /*字符指针指向下一字符* / continue }

else if (isdigit(*ptr)) {

/*当前字符是数字,则将该数字开始的数字串转换为数值*/

tnum= 47 while (*ptr>= ' 0 * && *ptr<= * 9 1 ) { tnum=tnum *10+ 48 ; ptr++ } push( 49 )

} else /法当前字符是运算符或其他符号* /

if (*ptr==+i||*ptr=='-'||*ptr== if(!IsEmpty(S)){

a=Top (s) ; Pop (&s) ; /*取运算符的第二个运算数*/ if(!IsEmpty(S)){ b=Top(s) Pop(&s)

八取运算符的第一个运算数*/

}

else return-1 }

else return -1 switch (*ptr) { case 1 + f case 1 - 1 case 1 + f case 1/1 }

Push(&S, b+a) break else

Push(&s, b-a) break return -1

Push(&s, b*a) break 決字符指针指向下一字符*/ ptr++ }/*whil/Push(&s, b/a) break

e*/ if (IsEmpty(s)) return -1 else {

50 =Top(s) Pop (&s) /*取运算结果*/ if (!IsEmpty(s)) return -1 return 0 -}



试题四

阅渎以下说叫和c函数,回答问题。

[说明]

已知某二叉树的非叶子节点都有两个孩子节点,现将该二叉树存储在结构数组节点结构 及数组Ht定义如下:

#define MAXLEAFNUM 30 Struct node{ char ch char *pstr int parent int lchild, rchiid; };

Struct node Ht [2 *MJ\XLEAFNUM];

该二叉树的n个叶了节点存储在下标为1.nHt数组元素中。例如,某二叉树如图8-26所示, 存储结构如图8-27所示,其屮,与叶子节点a对应的数组元素下标为1, a的父节点存储在Ht [5],




表示为Ht [1] .parent = 5o [7] .parent = O表示7号节点是树木艮,Ht [7] .1 child=3> Ht [7] . rchild=6分别表示7号节点的左孩子是3号节点、右孩子是6号节点。

如果用''0〃或''1〃分别标识二叉树的左分支和右分支如图8-26所示,从根节点开始到叶子节点 为止,按所经过分支的次序将相应标识依次排列,可得到一个01序列,称之为对应叶子节点的编 码。例如,8-26abcd的编码分别是1001010llo

函数LeafCode (Ht [] , n)的功能是:求解存储在Ht屮的二叉树屮所冇叶子节点(n)的编码, 叶子节点

存储在Ht [1]Ht [n]中,求岀的编码存储区由对应的数组元素pstr域指示。



下标 ch



1 2

3 .4



purait 5 5 7 6 6 7 D

lehild



rchild 0 (1 0 0 2 4 6

b c d



0 0 0 1 5 3

二叉树

5 6 7





二叉树存储结构

函数LeafCode从叶子到根逆向求叶子节点的编码。例如,对图8-26中叶子节点a求编码的过程

pr

pc

828所示。

从叶子到根求节点編码示童图

[函数]

typedef enum Status {ERROR, OK} Status; Status LeafCode (Struet node Ht [] z int n) {

int pc, pf


int i, start

char tstr [31]={1\01)




for(i=l 51 i++) {

start=29

pc = i pf=Ht [i]parent while(Pf!= 52 ) { if( 53 • lchiid==pc) tstr [--start] = * 0' else

tstr [-start] = 11' pc= 54 pf=Ht[Pf]parent

}

Ht[i] >pstr=(char*)malloc(31-start) if(!Ht[i]pstr)return ERROR strcpy(Ht[i]• pstr, 55 ;

} return OK

}

试题五

回答问题。 阅读以下说明和c语言函数,

[说明]

已知包含头节点(不存储元素)的单链表的元素已经按照非递减方式排序,函数 compress (NODE *head)的功能是去掉其中重复的元素,使得链表屮的元素互不相同。

处理过程中,当元素重复出现时,保留元素第一次岀现所在的节点。 8-29 (a)(b)是经函数compress61处理前后的链表结构示例图。

dH 23| 4H351 ]

处理前•链表结构

hdfj肆耳一HI H 十匡IF

co处理后链表结构

'链表结构

链表的节点类型定义如下: typedef struct Node { int data

struct Node *next }NODE;

[C语言函数]

void compress(NODE *head) {

NODE *ptr, *q ptr= 56 ; / *取得第一个元素节点的指针★ / while ( 57 && ptr- >next) { q=ptr - >next while (q && 58 ) {/*处理重复元索*/

59 =q - >next free(q);

q=ptr- >next } _60_=ptr- >next } /*end of while*/ } /*end of compress*/


试题六 阅读以下说明和流程图,填补流程图中的空缺。

[说明]

卜•面流程图的功能是:在已知字符串A中杳找特定字符吊B,如杲存在,则输出B吊首字符在A 中的位置,否则输出-1设串An个字符A61A62.・・、A(n-l)组成,Bm个字符B61B62.. B(m-l)组成,其中n^m>Oo在串A中查找串B的基本算法如下:从串A的首字符A61开始,取子串 A61A62...i (m-1)与串B比较;若不同,则再取子串A62A69..A(m)与串B比较,以此类推。

例如,字符串''CABBRFFD"中存在字符子串、'BRF (输出3),不存在字符子串''RFD"(输出-1) 在流程图中,i用丁访问申A中的字符(i = 0, 1,・・・,n-1) , j用丁访I可吊B中的字符(j =0, 1,・・・, m-1) o 比较A(i) A(i + l)・・A(i+m-l)B61B62...B (m-1)时,需要对A⑴与B61> A(i+1) B62、••.、A(i + j)B(j)、•••逐对字符进行比较。若发现不同,则需要取下一个子串进行比较,以此 类推。

[流程图]



木题流程图如图8-30所示。

流程图

试题七

阅读以下说明和流程图,填补流程图中的空缺。

[说明]

假设数组A中的各元索A66, A6 7, ・・.A(M)已经按从小到大排序(M^l);数组E中的各元索B66, B67, B(N)也已经按从小到大排序(N^l) o执行卜•血的流程图后,可以将数组A与数组B中所有 的元素全都存入数C屮,冃按从小到大排序(注意:序列屮相同的数全部保留并不计排列顺序)。例 如,设数组A中有元

素:2, 5, 6, 7, 9数组B中有元素2, 3, 4, 7则数组C中将有元素:2, 2,

FalAe

False




3, 4, 5, 6, 7, 7, 9o

[流程图]

木题流程图如图8-31所示。

试题八 阅读以下说明和流程图,填补流程图中的空缺。

[说明]

某单-位动态收集的数据屮常包含重复的数据,所以需要进行处理,使得重复的数据仅出现一次。 面流程图的功能是:在n(n>l)个数据D2,氏中,选出其中所冇不重复的k个数据,置于原 来前k个数据的位置上。



(开始)





⑶一 C

汁—i k+1-k



I k+1-k





£6}-C(k) £71-C(k)



j+j



ii k-lk

流程

该流程图的算法如门第1个数据必然被选出,然后从第2个数据开始,逐个考察其余的数据。 假设D. D“・・・,Djm^l)是已经选出的、不重复的数据,则对于数据D'mViWn),将其依次与人, ・・•,R

进行比较,若没有发现与之相同者,则D,被选出并置于D*的位置上;否则对D,不做处理。 例如,如下10个数据:


(n=10) 5, 2, 2, 7, 4, 4, 7, 1, 9, 1 经过上述算法处理后的结果为: 5, 2, 7, 4, 1, 9 (k=6) [流程图]

木题流程图如图8 - 32所示。

处理遊站Di

E 1 (1)

i: 1

主控

处理数据Di

「循环结束

<





_____ F ______

输出处理结呆

遞冋



流程

注:循环开始的说明按照''循环变量名:循环初值,循环终值,增量〃格式描述。

答案:

综合知识试题

1> D

[解析]对具有n个元素的顺序表访问第i(lWiWn)个元素的前驱和后继,其耗吋与n的大小无关。

2 B [解析]若字符审s的长度为n(n>l)且其中的字符互不相同,贝b的长度为2的了吊有nJ个。 3 B


[解析]首先可用得到出栈序列dcba,如果毎个元素入栈后即出栈,则可得abed,c位于栈顶,而 ab在栈,则可得cbad,但不能得到cabdo

4 C

[解析]队列容量为M时,队头指针front和队尾指针rear的值在0M-丄之间循环,当rear>front 口寸,丿匸素数口为匕ear-f rontrearVf ront吋,7匸素数口为rear-f ront+M。所以,队歹lj1117U 索数廿为 (rear-front+M)MOD M 5 C

[解析]本题考查数据结构巾栈的基本知识。栈的特点是后进先出。对于一个关于初始为空的栈的操 序列,要求序列中任何一个操作之前,入栈操作的次数要大于等于出栈操作的次数。操作序列 SXSXSSXX满足条件。 6 B

[解析]栈是先进后出的线性表,n个元素全部进入栈后再依次出栈,则得到原序列的逆序。队列是 先进先出的线性表,元素的进入次序与输出次序相同,因此,n个元素先后经过栈和队列,得到的序 列与进入栈的序列相反。 7 C

[解析]本题考查链表存储结构的基本特点。在单向链表中只能沿一个方向进行访问节点,而在双向 表中既可以向前遍历,也可以向后遍历。因此,双向链表较易于访问相邻节点。 8 C

[解析]空栈的栈顶指针topn+1,说明栈顶指针随着元素入栈而减小,随着元素岀栈而增加,所 以元素x入栈的正确操作是top=top-l V top =Xo 9 A

[解析]在执行递归过程时,通常使用的数据结构是堆栈,耍求先调用后返回。 0A

[解析]以行为主序存储,元素a3, 3之前有23个元素,所以其相对于数组起始地址的偏移量为23, 址为a+23o 11> D

[解析]数组空间首地址为base,所以,元素Pl, 0的存储地址为base,按行存储时,P3, 3 Z前存储了2x9 + 3个元素,因此P3, 3在该数组空间的地址为base + 21o 12 D

[解析]子题考查特殊矩阵的压缩存储。对称矩阵下三角的兀密按行存储时,对于元素Ai j, 面的元素数目为 l+2+...+ i-l + j-l = i(i-l)/2 + j-l,因此元索 Ai j存储在 S i(i-l)/2 + j 中。 13 B [解析]数组按列存储时,存储在A 2, 3之前的元素个数为11x3 + 7,因此,其存储地址为 100+40x4=260 14 D

[解析]若二叉树的前序遍历序列与中序遍历序列相同,说明二叉树的根节点没有左了树,以此类推, 叉树所冇节点都没冇左子树,非叶子节点只冇右子树。 15 C

[解析]根据题意,由关键字序列(2, 7, 36, 25, 18, 2 )构造的二叉排序树的高度应该为4层, 第一层为12,第二层为736,第三层为225,最后一层为丄8 16 A

[解析]根据图屮的邻接关系,顼点4后应该就是顶点6,所以A选项正确。 17> B

[解析]在任意一棵非空的二叉树中,终端节点(叶子)的数目总是比具有两个孩子的非终端节点的数 1 个。18C 19 C

[解析]本题考杳数据结构中二叉树的基本知识。满二叉树的第[层(树根)1个节点,第二层有2 点,第三层冇4个节点,以此类推,第h层冇2h-l个节点。总节点数为20 + 21 + 22+...+2h-l = 2h-lo 依题意,显然对非空满二叉树中的节点i的左子树编号为2i,右子树编号为2i + l0


20 D

[解析]本题考查数据结构屮树的基本知识。数据结构屮的树最适合用来表示数据元素Z间具冇一对 关系的情况。 21> D

[解析]中序遍历二叉树的过程为:若二叉树为空,则进行空操作;否则中序遍历根的左子树:访问 节点;中序遍历根的右了树。显然,对一棵非空的二叉排序树进行中序遍历,可得到一个节点元素 的递增序列。 22 A [解析]根据题口描述,对题屮图进行广度优先遍历吋,先访问顶点1,由于26是顶点1的邻接顶点, 此接下來应访问顶点2或顶点6,若先访问顶点2,此吋的访问序列为1 2 6;反之,访问序列则为 16 2,然后访问顶点2662的邻接顶点。因此,最后的遍历序列为1 2634 5126 35 416254 3 1 6 2 4 5 3 23 D [解析]中序遍历的操作过程是:若二叉树为空,则进行空操作;否则先选小序遍历根的左子树,然 访问根节点,最后中序遍历根的右子树。因此,本题中的二叉树进行中序遍历,可以得到序列为2 6 4 5 3 24 C 25 D [解析]本题考查的是图的概念及存储结构。含有11个顶点的无向完全图共有nn-l/2条边。图的矩 表示法利用一个炬阵来表示图屮顶点之间的关系。根据邻接矩阵的特点可知D选项符合要求。 26 C [解析]本题考查的是二叉树的遍历运算。后序遍历是指先遍历左了树,再遍历右了树,最后访问根 点。所以,本题后序遍丿力结果应为264135c 27 A [解析]根据散列函数可得H24=H13=2,所以2412两个元素冲突。 28> B

[解析]线性表采用顺序存储结构,若表长为m,且在任何一个合法插入位置上进行插入操作的概率 相同,则插入一个元素平均移动ni/2个元素。 29 B [解析]若A的最大元素小于B的最小元素,则只需要比较m次,这吋归并过程屮元素的比较次数最少。 30 D [解析]木题考查排序方法中堆排序的基础知识。四个选项中只有选项D符合小顶堆的定义。 31 C

[解析]采用哈希(或散列)技术构造查找表时,需要考虑冲突(碰撞)的处理,冲突是指关键字不同的 记录被映射到同一个哈希地址。 32 B [解析]本题考杳折半(二分)查找。折半查找是指首先将待查找的元素与表中的中间元素比较(第6 元素),若相等,则找到,若大于屮间位置元素,则下一步到后半个子表进行折半查找,否则,下 一步到前半个子表进行折半查找。因此,要找表中的第5个元素,需要与第6345个元素依次比 较,查找成功,所以共比较4次。 33> A

[解析]木题考查排序算法。冒泡排序是稳定的排序方法,它比较相邻的元素,将较大者交换到后面, 于值相同的元素,则无须交换。 34B

[解析]对于二分查找方法,只有元素进行有序排列时,才能正确地进行查找。 35^ D

[解析]本题考查的是插入排序法。其实现方法是:在插入第i个记录吋,前i-l个数已经排好序,这 将记录的关键字ki依次与关键字ki-1, ki-2, kl进行比较,从而找到Ri应该插入的位置。


案例分析试题 试题一

36ptr- >next ptr

40^ preptr

37head- >next

38ptr ! = endptr,或其他等彳介丿孩式

39

[解析]

从⑴ 处代码中口Jptr最后应该指向表尾节点。所以⑴ 处应为ptr->nexto进彳亍钉泡排序 时,不断调整元素的位置,最终使最大元素放到表的最后,所以2处应为head->nexto 3处的 循环条件应该是扫描的节点,不是最后一个节点,所以3处应为ptr ! =endptro ptr每向后修改 一次,preptr就要修改一次,所以4处应为ptr, 5处应为preptro 试题二 41n>SIZE,或其等价表示 42^ n*n 43col + + ,+ + col,col=col + l, 其等价表示 44col-=n,col = l,或其等价表示 45 value+1,或其等价表示 [解析]程序中空1处判断n的合法性,n需为奇数,矩阵规模应不超过SIZE2o所以1处应为n >SIZE,或其等价表示。将数值填入方阵的语句为''a [row] [col] =value ,该语句在循环中, 循环条件为''value<=n*n^,所以2处应填入55〃。对于3阶魔方阵,1填入第1行第2列,2 入第3行第3列,3填入第2行第1列,其余位置按照算法步骤类推。所以3处填入、'col + + 〃或其等价 形式,4处填入= 或、'col-=n〃。程序中,本次填入的数值为value的值,下一次要填入的 数值为vahle1,因此,5处应填入''value+lz/

试题三

46 ptr+ + ,++ptr, SKptr=ptr+l,或其等彳介表示 470, ^Ktnum=0 48*ptr-48, *ptr- 'OS -其等价表示 49&s, tnum 50 *result

[解析]由于后缀表达式以字符串方式存储且以空格分隔符号(数值、运算符),因此遇到空格字符吋, 向表达式中字符的指针ptr应增加丄指向后续字符,所以1处应填入、'ptr++〃或其等价形式。 num的初始值应为0,因此,空2处应填入''0〃,空3 所在表达式将数字字符转换为数值,即空 3 处填入''*ptr-48/zo4处用于将转换所得的数值tnum压入栈项,根据题目屮Push的原型 ''void Push STACK*sz int e 〃,调用时第一个实际参数是STACK类型变量的地址,第二个实 际参数是一个整数,因此,空4处填入''&s,num"。由于函数computing char expr [] z int result通过参数result返回该表达式的值,因此需要将存在栈顶的运算结果赋值给result指向 的整型变量,即空5处填入'"result"

试题四

51> i<=n,或其等价形式 55> tstr+start^<[start]

52

53> Ht [pf ],* Ht+pf

54pf

[解析]题中已指出该二叉树的n个叶了节点存储在卜•标为1nHt数组元素中,同时举例说明父节 编号为0的节点是树根节点。所以,1处应为、'iV=n〃。而到达根即父节点为0时,所以2处为 ''0〃。pc用于指出树中的节点,pf则用于指出pc所对应节点的父节点,所以3处应为''Ht [pf ]", 4 处应为''pf o根据tstr的作用,strepy函数的实参应该是''tstr+start,z ''&tstr [start] ,所以5处应该为 ''tstr+start^^''[start]"

试题五

56head>next ptr- >next

57ptr

58ptr->data==q-或其等仔丫形式

59>

60ptr

[解析]本题考查的是对链表的查找、插入和删除等运算。耍找到重复的兀素并将其删除而使各兀素 互不相同。我们可以顺序遍历链表,比较逻辑上相邻的两个元索是否相同,如果相同则删除后一个元 素,以此类推。代码如下:

VOid CompressNODE *head {

NODE *ptr, *q ptr=head->next; /*取得第一个元索节点的指针*/


while (ptr && ptr- >next) q=ptr- >next

while (q && ptr ->data==q>data) {

ptr- >next=q- >next free(q);

q=ptr- >next

}

ptr=ptr- >next } /*end of while*/ } /*end of compress*/

{

/*处理重复元素*/

试题六

61j+l 65 -1

62i + 1

63

64

[解析]依题意,在已知字符串A屮查找特定字符串B,基本算法如下:从串A的首字符A(0)开始,取 子串A(0)A(l)..A(m-l)与串B比较;若不同,则再取子串A(l)A(2)..A(m)与串B比较,以此类推。 我们可以采用两重循环來实现。初始时,ij都设为0, i范围为0n-l, j范围为比较A(i + j) B(j)是否相等,在循环过程中只耍存在一个j使得A(i + j )不等TB(i),则退出本次循环,i + 1 重新进行遍历。如果最后i>n-m则说明不存在B字符串。否则,返冋B字符串的位置。

试题七

66 A(i) 74

67A(i) 73

68B (j )

69

70

71B (j )

72

[解析]本题中,iik是数组ABC的下标,初始时都应该是1。所以(1)处应为丄。为了实现 升序排,A(i)B(j)进行比较后,如果A(i)WB(j),那么应该将A(i)-C(k)。所以⑵处 A(i)。如果A(i)>B(j),则应B(j)->C(k) o所以(3)处应为B(j) o通过判断i>M是否成立 来比较数组A是否已经取完。如果i>M,则表示数组A屮的元素已经全部取击,需要将数组B屮剩余的 元索逐个移入C(k) o因此,空(4)处应填i,(6)处应填B(j) o对于数组B处的元索何时移完,需 要判断j>N是否成立。因此,(8)处应填j。同样,(3)处将B(j)存入C(k),直到j>N时数组B 屮的元素取完。此时,需要将数组A屮剩余的元素逐个移入C(k),i>M时全部完成。因此,空

(5) 处应填j,(7)处应填A(i),(9)处应填i

试题八

75>

76

77>

78 D[m+1]

79m^-m+1-其等价形式

[解析]在流程图中,初始时应将m设置为1,()处应为1,对于n个数据(n>l)而言,接着应逐个 考查D[2], D[n]的内容,因此循环应该对i=2, n, 1进行,所以(2)处应为2考查D[i]时, 需要将其分别与D[m] , D[m-1] , D[l]逐个比较,所以循环应对1, 进行,所以⑶处 应为当比较过程中发现重复时,则不做处理,若没有重复,则应将D[i]存入D[m+1],所以(4) 处应为D [m+1],然后,将重复计数器m加:L,所以(5)处应为mm+lo


本文来源:https://www.wddqw.com/doc/8edc676eab956bec0975f46527d3240c8447a103.html