DS考试大题集锦.docx
- 文档编号:8491626
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:21
- 大小:114.15KB
DS考试大题集锦.docx
《DS考试大题集锦.docx》由会员分享,可在线阅读,更多相关《DS考试大题集锦.docx(21页珍藏版)》请在冰豆网上搜索。
DS考试大题集锦
三.解答题(共38分)
17.(5分)请直接在以下二叉树中添加后序线索。
18.(10分)已知一个长度为12的表为
(Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec)
(1)试将表中元素依次插入到一棵初始为空的二叉排序树(字符串之间按字典顺序比较大小)。
画出该二叉排序树,并求出等概率情况下查找成功的平均查找长度。
(2)设哈希表长度为13,哈希函数H(k)=i/2,其中i为关键字k中第一个字母在字母表中的序号(例如A和D的序号分别为1和4),用链地址法解决冲突。
请画出通过依次插入表中元素所构造的散列表,并求出在等概率情况下查找成功的平均查找长度。
20.(8分)若对序列(25,19,7,41,29,12,23,26)按升序排序,请分别给出
(1)步长为4的一趟希尔排序的结果;
(2)初始大根堆。
22.(6分)函数f22定义如下,其中函数调用Insert(L,i,k)在顺序表L的第i位置插入k。
voidf22(SqList&L,inti){
if(i>0){
f22(L,i-1);
for(intk=1;k<=i;k++)
Insert(L,i,k);
}
}
设有空顺序表L=(),请写出调用递归函数f22(L,3)后
(1)L的长度:
(2)L=()
23.(6分)算法f23(L)将带头结点的单链表L逆置。
请在画线处填空。
voidf23(LinkList&L){
LinkListp=L->next;
L->next=;
while(p){
LinkLists=;
p->next=L->next;
L->next=;
p=s;
}
}
24.(6分)s是一个升序静态查找表,请简要说明函数调用f24(s,1,s.length,k)的意义。
intf24(SSTables,intlow,inthigh,KeyTypek){
if(low>high)return0;
intmid=(low+high)/2;
if(k==s.elem[mid].key)returnmid;
if(k>s.elem[mid].key)returnf24(s,mid+1,high,k);
elsereturnf24(s,low,mid-1,k);
}
25.(6分)请对以下函数填空,实现求二叉树T中各结点的子孙总数,并填入结点的DescNum域中的算法。
intf25(BiTreeT){
if()return-1;
else{
T->DescNum=f25(T->lchild)+
+
;
returnT->DescNum;
}
}
26.(6分)图的邻接矩阵表示和算法f26描述如下:
#defineMaxNum5
typedefstruct{
charvexs[MaxNum];intarcs[MaxNum][MaxNum];intn,e;
}MGraph;
intf26(MGraphG,inti){
intd=0;
for(intj=0;j if(G.arcs[i][j])d++; if(G.arcs[j][i])d++; } returnd; } 已知一个图G的邻接矩阵如下所示, (1)给出执行算法调用f26(G,4)的返回值; (2)简述该算法返回值的意义。 27.(8分)请设计实现删除单链表中值相同的多余结点的算法,先简述算法思想,然后写出算法的C语言描述。 17.(5分)后序线索 18.(10分)已知一个长度为12的表为 (Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec) (3)试将表中元素依次插入到一棵初始为空的二叉排序树(字符串之间按字典顺序比较大小)。 画出该二叉排序树,并求出等概率情况下查找成功的平均查找长度。 (4)设哈希表长度为13,哈希函数H(k)=i/2,其中i为关键字k中第一个字母在字母表中的序号(例如A和D的序号分别为1和4),用链地址法解决冲突。 请画出通过依次插入表中元素所构造的散列表,并求出在等概率情况下查找成功的平均查找长度。 0 1 2 3 4 5 6 7 8 9 10 11 12 May Aug Sep Nov Dec Feb July Mar Apr Oct June Jan 成功的平均查找长度=18/12 20.(8分)若对序列(25,19,7,41,29,12,23,26)按升序排序,请分别给出 (3)步长为4的一趟希尔排序的结果; (4)初始大根堆。 答: (1)(25,12,7,26,29,19,23,41) (2)(41,29,23,26,25,12,7,19)(先乱搞一个2叉树,然后大的上去) 22.(6分)函数f22定义如下,其中函数调用Insert(L,i,k)在顺序表L的第i位置插入k。 voidf22(SqList&L,inti){ if(i>0){ f22(L,i-1); for(intk=1;k<=i;k++) Insert(L,i,k); } } 设有空顺序表L=(),请写出调用递归函数f22(L,3)后 (1)L的长度: 6 (2)L=(1,2,3,2,1,1) 23.(6分)算法f23(L)将带头结点的单链表L逆置。 请在画线处填空。 voidf23(LinkList&L){ LinkListp=L->next; L->next=NULL; while(p){ LinkLists=p->next; p->next=L->next; L->next=p; p=s; } } 24.(6分)s是一个升序静态查找表,请简要说明函数调用f24(s,1,s.length,k)的意义。 intf24(SSTables,intlow,inthigh,KeyTypek){ if(low>high)return0; intmid=(low+high)/2; if(k==s.elem[mid].key)returnmid; if(k>s.elem[mid].key)returnf24(s,mid+1,high,k); elsereturnf24(s,low,mid-1,k); } 答: 在s中递归折半查找k。 25.(6分)请对以下函数填空,实现求二叉树T中各结点的子孙总数,并填入结点的DescNum域中的算法。 intf25(BiTreeT){ if(! T)return-1; else{ T->DescNum=f25(T->lchild)+ f25(T->rchild)+ 2; returnT->DescNum; } } 26.(6分)图的邻接矩阵表示和算法f26描述如下: #defineMaxNum5 typedefstruct{ charvexs[MaxNum];intarcs[MaxNum][MaxNum];intn,e; }MGraph; intf26(MGraphG,inti){ intd=0; for(intj=0;j if(G.arcs[i][j])d++; if(G.arcs[j][i])d++; } returnd; } 已知一个图G的邻接矩阵如右所示, (1)给出执行算法调用f26(G,4)的返回值;答: 5; (2)简述该算法返回值的意义。 答: 求图G第i顶点的度。 27.(8分)请设计实现删除单链表中值相同的多余结点的算法,先简述算法思想,然后写出算法的C语言描述。 voidpurge(LListL){ //删除链表中的“冗余”元素 LLists,q,p=L->next; while(p){//p指向当前被考察的结点 q=p; while(q->next)//考察q所指后继结点 if(q->next->data! =p->data) q=q->next; else//修改指针并释放结点空间 {s=q->next;q->next=s->next;free(s);} p=p->next; }//whilep }//purge 1.(10分)己知有向图G定义如下: G=(V,E) V={a,b,c,d,e,f} (1)画出图G。 (2)画出图G的邻接矩阵。 (3)写出G的全部拓扑有序序列。 afcbdeafcdbeafcdebafdcbeafdceb facbdefacdbefacdebfadcbefadceb acbfdeacfbdeacfdbeacfdeb 4.(10分)设哈希函数为H(key)=keyMOD11,用线性探测再散列的方法处理冲突。 请画出依次插入元素29,15,48,47,23,41,73,37后,该哈希表的状态,并在各元素下面标出其冲突次数。 冲突次数: 4.(10分) 0 1 2 3 4 5 6 7 8 9 10 23 47 15 48 37 29 41 73 1 2 2 四、算法设计题(共20分) 1.(10分)写出在带头结点的单链表上实现线性表操作LENGTH(L)的算法。 1.LENGTH(L)(10分) intLENGTH(L) { intlength=0; Nodt*p=L->head; while(p){ length++; p=p->next; } returnlength; } 每行语句1分 2.(10分)填空完成先序遍历建立二叉树的如下算法。 StatusCreateBiTree(BiTree&T){ scanf(&ch); if(ch=='')T=NULL; else{ ……//生成根结点 CreateBiTree(……);//构造左子树 CreateBiTree(……);//构造右子树 } returnOK; } 2.(10分) StatusCreateBiTree(BiTree&T){ scanf(&ch); if(ch=='')T=NULL; else{ T=newNode(ch);//生成根结点(4分) CreateBiTree(T->lchild);//构造左子树(3分) CreateBiTree(T->rchild);//构造右子树(3分) } returnOK; 2.(10分)以顺序表为存储结构,写出折半插入排序的算法。 voidBiInsertionSort(SqList&L){ for(i=2;i<=L.length;++i){ L.r[0]=L.r[i];//将L.r[i]暂存到L.r[0] low=1;high=i-1; while(low<=high){ m=(low+high)/2;//折半 if(L.r[0].key high=m-1;//插入点在低半区 elselow=m+1;//插入点在高半区 for(j=i-1;j>=high+1;--j) L.r[j+1]=L.r[j];//记录后移 L.r[high+1]=L.r[0];//插入 }//for }//BInsertSort 每条指令1分 1.voidAE(Stack&S){ InitStack(S); Push(S,3); Push(S,4); intx=Pop(S)+2*Pop(S); Push(S,x); inti,a[5]={1,5,8,12,15}; for(i=0;i<5;i++)Push(S,2*a[i]); while(! StackEmpty(S))cout< } 该算法被调用后得到的输出结果为: 2.voidABC(BTNode*BT,int&c1,int&c2){ if(BT! =NULL){ ABC(BT->left,c1,c2); c1++; if(BT->left==NULL&&BT->right==NULL)c2++; ABC(BT->right,c1,c2); }//if } 该函数执行的功能是什么? 一、算法填空(共8分) 向单链表的末尾添加一个元素的算法。 VoidInsertRear(LNode*&HL,constElemType&item) { LNode*newptr; newptr=newLNode; If(______________________) { cerr<<"Memoryallocationfailare! "< exit (1); } ________________________=item; newptr->next=NULL; if(HL==NULL) HL=__________________________; else{ LNode*P=HL; While(P->next! =NULL) ____________________; p->next=newptr; } } 二、编写算法(共8分) 编写从类型为List的线性表L中将第i个元素删除的算法,(假定不需要对i的值进行有效性检查,也不用判别L是否为空表。 ) voidDelete(List&L,inti) 一、阅读算法(每题7分,共14分) 1.30241610210 2.该函数的功能是: 统计出BT所指向的二叉树的结点总数和叶子总数 二、算法填空(共8分,每一空2分) newptr==NULLnewptr->=datanewptrp=p->next 三、编写算法(8分) voidDelete(List&L,inti) { for(intj=i-1;j L.list[j]=L.list[j+1];//第i个元素的下标为i-1 L.size--; } 4、(3分)按下列输入顺序,建立相应的二叉排序树。 (1)4,5,6 (2)5,4,6(3)6,5,4 (1) (2)(3) 二叉排序树(BinarySortTree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树; 7、数组A中,每个数据元素的长度为3个字节,行下标从1到8,列下标从3到10,存放该数组至少需要的单元数是(D)。 A、80B、100C、240D、270 11、某二叉树只有度为0和度为2的结点,如果该二叉树只有21个结点,则叶子结点数为(C)。 A、9B、10C、11D、12 14、如果要求一个线性表既能较快的查找,又能适应动态变化的要求,可以采用(A)方法。 A、分块B、顺序C、二分D、散列 15、在以下排序算法中,关键字的比较次数与记录的初始排列次序无关的是(D)。 A、希尔排序B、起泡排序C、插入排序D、选择排序 先按要求填空完成程序,再回答有关问题。 1、(31分)设h是带表头结点的单链表的头指针,请设计一个逆置这个单链表的程序。 即原链表为(a1,a2,a3…an),逆置后变为(an,an-1…a2,a1)。 单链表结点结构为: typedefstructnode{intdata; ___structnode*link;__(2分)}LNode; voidinvert(LNode*h) {LNode*s,*p; p=h->link; h->link=___NULL;或者0;(2分) while(p! =NULL) {s=p; p=p->link; __s->link=h->link;_(2分) h->link=s; } } 什么是表头结点? (2分) 如果该链表无表头结点,则原程序该做怎样的修改? (4分) 2、(13分)对以下函数填空,实现以带头结点的单链表h为存储结构的直接选择排序。 单链表的结点结构定义为 typedefstructnode{intkey; structnode*next;}JD; voidzjxzpx(JD*h) {JD*p,*q,*m; intx; p=h->next; while(p! =NULL) {q=p->next; m=p; while(q! =NULL) {if(m->key>q->key)_________;(2分) _____________;(2分) } if(p! =m) {x=p->key; p->key=m->key; m->key=x; } ______________;(2分) } 直接选择排序属于___________(稳定/不稳定)排序。 (2分) 该排序算法总的键值比较次数为____________。 (2分) 并分析什么情况下有最小移动记录次数? 什么情况下有最大移动记录次数? 算法的平均时间复杂度为多少? (3分) 3、(13分)对以下函数填空,实现以带头结点的单链表h为存储结构的直接选择排序。 单链表的结点结构定义为 typedefstructnode{intkey; structnode*next;}JD; voidzjxzpx(JD*h) {JD*p,*q,*m; intx; p=h->next; while(p! =NULL) {q=p->next; m=p; while(q! =NULL) {if(m->key>q->key)_________;(2分) _____________;(2分) } if(p! =m) {x=p->key; p->key=m->key; m->key=x; } ______________;(2分) } 直接选择排序属于___________(稳定/不稳定)排序。 (2分) 该排序算法总的键值比较次数为____________。 (2分) 并分析什么情况下有最小移动记录次数? 什么情况下有最大移动记录次数? 算法的平均时间复杂度为多少? (3分) 1、structnode*link;(2分) NULL;或者0;(2分) s->link=h->link;(2分) 什么是表头结点? 答: 表头结点是有时为了操作方便而在链表的第一结点之前添加的一个结点①,该结点结构与表中结点相同,但数据域不存放表中数据②,或者闲置不用,或者存放特殊信息。 表头结点的链域存放指向链表中第一个结点的指针③。 (2分,回答对①点给1分;②点0.5分;③点0.5分。 ) 如果该链表无表头结点该做怎样的修改? 修改如下: voidinvert(LNode*h) {LNode*s,*p; p=h;(1分) h=NULL;(1分) while(p! =NULL) {s=p; p=p->link; s->link=h;(1分) h=s;(1分) } } 2、m=q;(2分) q=q->link;(2分) p=p->link;(2分) 不稳定(2分) n(n-1)/2(2分) 当待排序序列为“正序”时,有最小移动次数0;(1分) 当待排序序列为“逆序”时,有最大移动次数3(n-1);(1分) 算法的平均时间复杂度为O(n2)。 (1分) 3、p->rchild;(2分) q->LTag! =1;(2分) 1(1分); NULL;或者0; 1、(6分)已知二叉树的层次序列为ABCDEFGHIJK,中序序列为DBGEHJACIKF,请构造一棵二叉树,并写出其后序序列。 2、(10分)已知二叉树的先序、中序和后序序列如下,其中有一些看不清的字母用*表示,请先补充*处的字母,再构造一棵符合条件的二叉树(画出图示),最后画出带头结点的中序线索链表。 前序序列: *BC***G* 中序序列: CB*EAGH* 后序序列: *EDB**FA 3、(6分)将下列二叉树还原成森林,并写出先序遍历森林序列。 5、(8分)已知图G=(V,E),其中V={a,b,c,d,e},E={,,,, 要求: (1)画出图G;(2分) (2)给出图G的邻接矩阵;(2分) (3)给出图G的邻接表;(2分) (4)给出图G的一种拓扑序列。 (2分) 三、应用题: 1、(4分,画对根结点1分,左子树正确1.5分,右子树正确1.5分) 后序序列为: DGJHEBKIFCA(2分) 2、前序序列补充完整为: ABCDEFGH(1分) 中序序列补充完整为: CBDEAGHF(1分) 后序序列补充完整为: CEDBHGFA(1分) (3分,画对根结点1分,左子树正确1分,右子树正确1分) (4分)画对各结点线索指针得2分,标志位正确得1分,表头结点正确得 3、(4分,画对各树根结点2分,画对各子树子女结点2分) 该森林的先序序列为: ABCMNSDEFGHKIJ(2分) 4、 (1)(2分,如果画的是无向图不給分)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS 考试大题集锦 考试 集锦