(A) 3 (B) 4 (C) 5 (D) 8 7.设用链表作为栈的存储结构则退栈操作( )。 (A) 必须判别栈是否为满 (B) 必须判别栈是否为空 (C) 判别栈元素的类型 (D) 对栈不作任何判别 8.下列四种排序中( )的空间复杂度最大。 (A) 快速排序 (B) 冒泡排序 (C) 希尔排序 (D) 堆
9.设某二叉树中度数为0的结点数为N0,度数为1的结点数为Nl,度数为2的结点数为N2,则下列等式成立的是( )。 (A) N0=N1+1 (B) N0=Nl+N2 (C) N0=N2+1 (D) N0=2N1+l
10.设有序顺序表中有n个数据元素,则利用二分查找法查找数据元素X的最多比较次数不超过( )。 (A) log2n+1 (B) log2n-1 (C) log2n (D) log2(n+1)
二、填空题(42分)
1. 1. 设有n个无序的记录关键字,则直接插入排序的时间复杂度为________,快速排
序的平均时间复杂度为_________。
2. 2. 设指针变量p指向双向循环链表中的结点X,则删除结点X需要执行的语句序列
为_________________________________________________________(设结点中的两个指针域分别为llink和rlink)。 3. 3. 根据初始关键字序列(19,22,01,38,10)建立的二叉排序树的高度为____________。 4. 4. 深度为k的完全二叉树中最少有____________个结点。
5. 5. 设初始记录关键字序列为(K1,K2,…,Kn),则用筛选法思想建堆必须从第______
个元素开始进行筛选。
6. 6. 设哈夫曼树中共有99个结点,则该树中有_________个叶子结点;若采用二叉链
表作为存储结构,则该树中有_____个空指针域。 7. 7. 设有一个顺序循环队列中有M个存储单元,则该循环队列中最多能够存储________
个队列元素;当前实际存储________________个队列元素(设头指针F指向当前队头元素的前一个位置,尾指针指向当前队尾元素的位置)。
8. 8. 设顺序线性表中有n个数据元素,则第i个位置上插入一个数据元素需要移动表
中_______个数据元素;删除第i个位置上的数据元素需要移动表中_______个元素。 9. 9. 设一组初始记录关键字序列为(20,18,22,16,30,19),则以20为中轴的一趟
快速排序结果为______________________________。
10.10.设一组初始记录关键字序列为(20,18,22,16,30,19),则根据这些初始关键字
序列建成的初始堆为________________________。
11.11.设某无向图G中有n个顶点,用邻接矩阵A作为该图的存储结构,则顶点i和顶
点j互为邻接点的条件是______________________。
12.12.设无向图对应的邻接矩阵为A,则A中第i上非0元素的个数_________第i列上
非0元素的个数(填等于,大于或小于)。
13.13.设前序遍历某二叉树的序列为ABCD,中序遍历该二叉树的序列为BADC,则后
序遍历该二叉树的序列为_____________。
14.14.设散列函数H(k)=k mod p,解决冲突的方法为链地址法。要求在下列算法划线处填
上正确的语句完成在散列表hashtalbe中查找关键字值等于k的结点,成功时返回指向关键字的指针,不成功时返回标志0。
typedef struct node {int key; struct node *next;} lklist; void createlkhash(lklist *hashtable[ ]) {
int i,k; lklist *s;
for(i=0;i s=(lklist *)malloc(sizeof(lklist)); s->key=a[i]; k=a[i] % p; s->next=hashtable[k];_______________________; } } 三、算法设计题(28分) 1. 1. 设单链表中有仅三类字符的数据元素(大写字母、数字和其它字符),要求利用原单 链表中结点空间设计出三个单链表的算法,使每个单链表只包含同类字符。 1. 2. 设计在链式存储结构上交换二叉树中所有结点左右子树的算法。 2. 3. 在链式存储结构上建立一棵二叉排序树。 数据结构试卷(四)参考答案 一、选择题 1.C 2.D 3.D 4.B 5.C 6.A 7.B 8.A 9.C 10.A 二、填空题 1. 1. O(n2),O(nlog2n) 2. 2. p>llink->rlink=p->rlink; p->rlink->llink=p->rlink 3. 3. 3 4. 4. 2k-1 5. 5. n/2 6. 6. 50,51 7. 7. m-1,(R-F+M)%M 8. 8. n+1-i,n-i 9. 9. (19,18,16,20,30,22) 10. 10. (16,18,19,20,32,22) 11. 11. A[i][j]=1 12. 12. 等于 13. 13. BDCA 14. 14. hashtable[i]=0,hashtable[k]=s 三、算法设计题 1. 1. 设单链表中有仅三类字符的数据元素(大写字母、数字和其它字符),要求利用原单 链表中结点空间设计出三个单链表的算法,使每个单链表只包含同类字符。 typedef char datatype; typedef struct node {datatype data; struct node *next;}lklist; void split(lklist *head,lklist *&ha,lklist *&hb,lklist *&hc) { lklist *p; ha=0,hb=0,hc=0; for(p=head;p!=0;p=head) { head=p->next; p->next=0; if (p->data>='A' && p->data<='Z') {p->next=ha; ha=p;} else if (p->data>='0' && p->data<='9') {p->next=hb; hb=p;} else {p->next=hc; hc=p;} } } 2. 2. 设计在链式存储结构上交换二叉树中所有结点左右子树的算法。 typedef struct node {int data; struct node *lchild,*rchild;} bitree; void swapbitree(bitree *bt) { bitree *p; if(bt==0) return; swapbitree(bt->lchild); swapbitree(bt->rchild); p=bt->lchild; bt->lchild=bt->rchild; bt->rchild=p; } 3. 3. 在链式存储结构上建立一棵二叉排序树。 #define n 10 typedef struct node{int key; struct node *lchild,*rchild;}bitree; void bstinsert(bitree *&bt,int key) { if (bt==0){bt=(bitree *)malloc(sizeof(bitree)); bt->key=key;bt->lchild=bt->rchild=0;} else if (bt->key>key) bstinsert(bt->lchild,key); else bstinsert(bt->rchild,key); } void createbsttree(bitree *&bt) { int i; for(i=1;i<=n;i++) bstinsert(bt,random(100)); } 数据结构试卷(五) 一、选择题(30分) 1.数据的最小单位是( )。 (A) 数据项 (B) 数据类型 (C) 数据元素 (D) 数据变量 2.设一组初始记录关键字序列为(50,40,95,20,15,70,60,45),则以增量d=4的一趟希尔排序结束后前4条记录关键字为( )。 (A) 40,50,20,95 (B) 15,40,60,20 (C) 15,20,40,45 (D) 45,40,15,20 3.设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70),其中含有5个长度为2的有序子表,则用归并排序的方法对该记录关键字序列进行一趟归并后的结果为( )。 (A) 15,25,35,50,20,40,80,85,36,70 (B) 15,25,35,50,80,20,85,40,70,36 (C) 15,25,35,50,80,85,20,36,40,70 (D) 15,25,35,50,80,20,36,40,70,85 4.函数substr(“DATASTRUCTURE”,5,9)的返回值为( )。 (A) “STRUCTURE” (B) “DATA” (C) “ASTRUCTUR” (D) “DATASTRUCTURE” 5.设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度为( )。 (A) O(log2n) (B) O(1) (C) O(n2) (D) O(n) 6.设一棵m叉树中度数为0的结点数为N0,度数为1的结点数为Nl,……,度数为m的结点数为Nm,则N0=( )。 (A) Nl+N2+……+Nm (B) l+N2+2N3+3N4+……+(m-1)Nm (C) N2+2N3+3N4+……+(m-1)Nm (D) 2Nl+3N2+……+(m+1)Nm 7.设有序表中有1000个元素,则用二分查找查找元素X最多需要比较( )次。 (A) 25 (B) 10 (C) 7 (D) 1 8.设连通图G中的边集E={(a,b),(a,e),(a,c),(b,e),(e,d),(d,f),(f,c)},则从顶点a出发可以得到一种深度优先遍历的顶点序列为( )。 (A) abedfc (B) acfebd (C) aebdfc (D) aedfcb 9.设输入序列是1、2、3、??、n,经过栈的作用后输出序列的第一个元素是n,则输出序列中第i个输出元素是( )。 (A) n-i (B) n-1-i (C) n+1-i (D) 不能确定 10 设一组初始记录关键字序列为(45,80,55,40,42,85),则以第一个记录关键字45为 基准而得到一趟快速排序的结果是( )。 (A) 40,42,45,55,80,83 (B) 42,40,45,80,85,88 (C) 42,40,45,55,80,85 (D) 42,40,45,85,55,80 二、填空题(共30分) 1. 1. 设有一个顺序共享栈S[0:n-1],其中第一个栈项指针top1的初值为-1,第二个栈 顶指针top2的初值为n,则判断共享栈满的条件是____________________。 2. 2. 在图的邻接表中用顺序存储结构存储表头结点的优点是____________________。 3. 3. 设有一个n阶的下三角矩阵A,如果按照行的顺序将下三角矩阵中的元素(包括 对角线上元素)存放在n(n+1)个连续的存储单元中,则A[i][j]与A[0][0]之间有_______个数据元素。 4. 4. 栈的插入和删除只能在栈的栈顶进行,后进栈的元素必定先出栈,所以又把栈称 为__________表;队列的插入和删除运算分别在队列的两端进行,先进队列的元素必定先出队列,所以又把队列称为_________表。 5. 5. 设一棵完全二叉树的顺序存储结构中存储数据元素为ABCDEF,则该二叉树的前 序遍历序列为___________,中序遍历序列为___________,后序遍历序列为___________。 6. 6. 设一棵完全二叉树有128个结点,则该完全二叉树的深度为________,有 __________个叶子结点。 7. 7. 设有向图G的存储结构用邻接矩阵A来表示,则A中第i行中所有非零元素个数 之和等于顶点i的________,第i列中所有非零元素个数之和等于顶点i的__________。 8. 8. 设一组初始记录关键字序列(k1,k2,……,kn)是堆,则对i=1,2,…,n/2而言 满足的条件为_______________________________。 9. 9. 下面程序段的功能是实现冒泡排序算法,请在下划线处填上正确的语句。 void bubble(int r[n]) { for(i=1;i<=n-1; i++) { for(exchange=0,j=0; j<_____________;j++) if (r[j]>r[j+1]){temp=r[j+1];______________;r[j]=temp;exchange=1;} if (exchange==0) return; } } 10. 10. 下面程序段的功能是实现二分查找算法,请在下划线处填上正确的语句。 struct record{int key; int others;}; int bisearch(struct record r[ ], int k) { int low=0,mid,high=n-1; while(low<=high) { ________________________________; if(r[mid].key==k) return(mid+1); else if(____________) high=mid-1;else low=mid+1; } return(0); } 三、应用题(24分) 1. 1. 设某棵二叉树的中序遍历序列为DBEAC,前序遍历序列为 ABDEC,要求给出该二叉树的的后序遍历序列。 2. 2. 设无向图G(如右图所示),给出该图的最小生成树上边的集 合并计算最小生成树各边上的权值之和。 3. 3. 设一组初始记录关键字序列为(15,17,18,22,35,51,60), 要求计算出成功查找时的平均查找长度。 4. 4. 设散列表的长度为8,散列函数H(k)=k mod 7,初始记录关 键字序列为(25,31,8,27,13,68),要求分别计算出用线性探测法和链地址法作为解决冲突方法的平均查找长度。 四、算法设计题(16分) 1. 1. 设计判断两个二叉树是否相同的算法。 2. 2. 设计两个有序单链表的合并排序算法。 数据结构试卷(五)参考答案 一、选择题 1.A 2.B 3.A 4.A 5.D 6.B 7.B 8.B 9.C 10.C 二、填空题 1. 1. top1+1=top2 2. 2. 可以随机访问到任一个顶点的简单链表 3. 3. i(i+1)/2+j-1 4. 4. FILO,FIFO 5. 5. ABDECF,DBEAFC,DEBFCA 6. 6. 8,64 7. 7. 出度,入度 8. 8. ki<=k2i && ki<=k2i+1 9. 9. n-i,r[j+1]=r[j] 10. 10. mid=(low+high)/2,r[mid].key>k 三、应用题 1. 1. DEBCA 2. 2. E={(1,5),(5,2),(5,3),(3,4)},W=10 3. 3. ASL=(1*1+2*2+3*4)/7=17/7 4. 4. ASL1=7/6,ASL2=4/3 四、算法设计题 1. 1. 设计判断两个二叉树是否相同的算法。 typedef struct node {datatype data; struct node *lchild,*rchild;} bitree; int judgebitree(bitree *bt1,bitree *bt2) { if (bt1==0 && bt2==0) return(1); else if (bt1==0 || bt2==0 ||bt1->data!=bt2->data) return(0); else return(judgebitree(bt1->lchild,bt2->lchild)*judgebitree(bt1->rchild,bt2->rchild)); } 2. 2. 设计两个有序单链表的合并排序算法。 void mergelklist(lklist *ha,lklist *hb,lklist *&hc) { lklist *s=hc=0; while(ha!=0 && hb!=0) if(ha->data