830数据结构真题答案有错.docx
- 文档编号:8004853
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:27
- 大小:22.44KB
830数据结构真题答案有错.docx
《830数据结构真题答案有错.docx》由会员分享,可在线阅读,更多相关《830数据结构真题答案有错.docx(27页珍藏版)》请在冰豆网上搜索。
830数据结构真题答案有错
2
一、选择题
1
1
1
.B2.A3.C4.A5.D6.A7.B8.A9.C10.C
1.B12.C13.A14.C15.B16.D17.D18.D19.A20.A
5解释:
线索二叉树中某结点是否有左孩子,不能通过左指针域是否为空来判
断,而要判断左标志是否为1。
二、填空题
1
2
3
.归并排序。
.能否将关键字均匀影射到哈希空间上
.一端先进后出
有无好的解决冲突的方法
4
5
6
7
8
9
.顺序存储或链式存储(1+n)/2
.从任意节点出发都能访问到整个链表
.时间空间
.n-1n(n-1)/2
.2n-1
.nn
三、判断题
1
2
3
4
5
6
7
8
9
1
1
1
1
1
1
.F
.F非空才成立
.F有向的非强连通图,不成立
.T
.F表头没有前驱,表尾没有后序
.T
.F先序跟后序不行,中序才行
.T
.F不可能
0.T
1.F
2.T
3.F
4.F
5.F
四、应用题
1
.逻辑结构是从操作对象抽象出来的数学模型,结构定义中的“关系”描述的
是数据元素之间的逻辑关系;物理结构是数据结构在计算机中的表示(又称
映像),又称存储结构。
物理结构是指数据具体存放在哪个位置,逻辑结构是
2
3
.由AOV网构造拓扑序列的拓扑排序算法主要是循环执行以下两步,直到不存
在入度为0的顶点为止。
(1)选择一个入度为0的顶点并输出之;
(2)从网
中删除此顶点及所有出边。
拓扑序列1:
abcdef拓扑序列2:
adbcef
.二叉树图如下:
4
5
.略。
已经不纳入考纲
.哈夫曼编码问题
编码:
3:
0000
20:
10
10:
0001
22:
11
18:
001
37:
01
6.二叉排序树问题
比根节点小的往左子树插,大的往右子树插。
图如下:
删除50有两种做法:
《数据结构》中的解析
这里我用第二种做法:
五.算法设计题
1
&
.算法填空
(L.elem[i-1])L.length-1++p*pL.length-1;
2.设计算法:
输入n个元素的值创建带头结点的单链线性表L。
voidCreateList_L(LinkList&L,intn){
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(inti=n;i>0;i--){
p=(LinkList)malloc(sizeof(Lnode));
scanf(&p->data);
p->next=L->next;
L->next=p;
}
}
3.弗洛伊德算法或者迪杰斯特拉算法都可以解决
采用弗洛伊德算法
(1)采用邻接矩阵,邻接矩阵的值代表乘车费用。
(2)这里算法不详细给出,《数据结构》书中有算法,这两个算法很重要。
一
定要自己完全理解。
2
011参考答案
一.选择题
1
8
.C2.A3.C4.D5.B6.D7.C
.C9.D10.C11.A12.D13.D14.A15.A
二.填空题
1
2
3
4
5
6
7
8
9
1
.线性结构非线性结构
.(8,9,4,3,6,2,12,13,19,18)
.二叉树小顶堆
.89
.存入元素移动指针(严蔚敏书中入栈是这么操作,实际看自己怎么规定)
.队列中仅有一个元素(或删除队列变成空)
.n-1
.k2
.b
0.n²
三、判断题
1
2
3
4
5
6
7
8
9
1
.T
.F
.T
.F
.T
.T
.T
.F
.F
0.F
四.简答题
1
.
第一趟结果:
13,27,51,55,10,49,38,65,97,75
元素移动五次。
2
.邻接矩阵图如下:
邻接表图如下:
拓扑序列:
abgcdfe
3
.关键活动和关键路径
关键路径:
从起点到终点的最长路径长度,这个最长的路径就叫做关键路径。
关键活动:
关键路径上的所有活动都是关键活动。
关键活动:
a1-a4-a8-a11关键路径:
a-b-e-h-k
4
.这道题很重要。
《数据结构》上有解析,请认真理解好。
5
(
.哈夫曼树问题
1)注意:
规定权值较小的结点为左子树
(
3)需要总bit数:
17*2+12*3+5*4+28*2+35*2+3*4=228
(
需要字节数:
228/8=28.5=29需要29个字节。
(4)
翻译后的正文是:
BCBAE
.哈希平均查找长度问题
6
五、算法填空
.
(1)p->next->data<=mink
(2)p->next==null||p->next->data>=maxk(3)p->next=q;
1
2
.(4)v QueueEmpty(Q) (7)DeQueue(Q,u)(8)EnQueue(Q,w) 六、编写算法 1.后序遍历二叉树 voidPostOrderTraversal(BinTreeNode*BT) { if(BT! =NULL){ PostOrderTraversal(BT->Left); PostOrderTraversal(BT->Right); printf("%c",BT->TData); } } 2 / .这道题也可以参考《高分笔记》 /邻接矩阵 typedefstruct_graph{ charvexs[MAX];//顶点集合 intvexnum;//顶点数 intedgnum;//边数 intmatrix[MAX][MAX];//邻接矩阵 } / Graph,*PGraph; /边的结构体 typedefstruct_EdgeData{ charstart;//边的起点 charend;//边的终点 intweight;//边的权重 }EData voidkruskal(GraphG) { inti,m,n,p1,p2; intlength; intindex=0;//rets数组的索引 intvends[MAX]={0};//用于保存"已有最小生成树"中每个顶点在该最小树中 的终 点。 EDatarets[MAX];//结果数组,保存kruskal最小生成树的边 EData*edges;//图对应的所有边 / /获取"图中所有的边" edges=get_edges(G); /将边按照"权"的大小进行排序(从小到大) / sorted_edges(edges,G.edgnum); for(i=0;i { p1=get_position(G,edges[i].start);//获取第i条边的"起点"的序号 p2=get_position(G,edges[i].end);//获取第i条边的"终点"的序号 m=get_end(vends,p1);//获取p1在"已有的最小生成树"中的 终点 n=get_end(vends,p2);//获取p2在"已有的最小生成树"中的 终点 / /如果m! =n,意味着"边i"与"已经添加到最小生成树中的顶点"没有形成环路 if(m! =n) { vends[m]=n;//设置m在"已有的最小生成树"中的 终点为n rets[index++]=edges[i];//保存结果 } } free(edges) } 2 012参考答案 一、选择题 1.A2.C3.C4.B5.A6.C7.A8.D9.C10.B11.B12.C13.D14.B15.D 13解释: 判断对满的条件(Q.rear+1)%MAXQSIZE==Q.front,可以看出跟队列 大小,头尾指针有关,所以D对。 二、填空题 1 2 3 4 5 6 7 8 9 1 .7 .线性和非线性结构 .2n-1 .能否将关键字均匀影射到哈希空间上有无好的解决冲突的方法 .插入和删除首结点时不必对头指针进行特殊处理 .2k-12k-1 .2e .p->lchild==NULL&&p->rchild==NULL .一端先进后出 0.021,235,346,256,558 三、判断题 1 2 3 4 5 .T .F .F .T .F 不一定,要是有两条关键路径,有一段是重合的,那么提高重合这一段的活动速 度是可以缩短工期的。 否则是,是不能缩短整个工期的。 6 7 8 9 1 .F .T .F .F先序和后序是不能确定一颗树的 0.F需要1+2+……+n=(1+n)n/2个空间 四、简答题 .//快速排序,两边同时遍历,当遇到小于枢轴的数就往左边放,大于枢轴的就 往右边放,一趟排序下来,比枢轴小的都在枢轴左边,比枢轴大的都在枢轴右边 1 6 3 3 3 5,57,45,39,12,98,86,35 5,57,45,39,12,98,86,35 5,57,45,39,12,98,86,98 5,57,45,39,12,65,86,98 2 .删除线性表L中大于X小于Y的节点 3.按边的权值排序: 3,5,12,14,15,17,25 依次选取,如果不构成回路,则加入;否则,就跳过该边。 最小生成树如下: 4 5 .深度优先搜索遍历: V0V1V4V2V3V5V6 广度优先遍历: V0V1V2V3V4V5V6 .弗洛伊德算法,请认真理解。 6 . 五、算法填空 1 2 .(QueuePtr)malloc(sizeof(QNode))NULLQ.rear->nextp .! StackEmpty()||p! =NULLPush(S,p)Pop(S,p)p->rchild 六、编写算法 1 .voidpreOrderTraverse(BiTreeT,int*count){ if(T){//T不空 /如果为叶子节点,就加1 if(T->lchild==NULL&&T->rchild==NULL){ / * } count++; preOrderTraverse(T->lchild,count); preOrderTraverse(T->rchild,count); } } 2.设计一个图的数组表示存储结构,并编写采用数组表示法构造一个无向网的 算法 # defineMAX_VERTEX_NUM20 typedefstructArcCell{ VRTypeadj; InfoType*info; ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; } typedefstruct{ VertexTypevexs[MAX_VERTEX_NUM]; AdjMatrixarcs; intvexnum,arcnum; GraphKindkind; } MGraph; 2 013参考答案 一.选择题 1 1 .C2.D3.C4.C5.A6.C7.C8.C9.A10.A11.A 2.C13.D14.A15.C 二、填空题 1 2 3 4 5 6 7 1 8 9 1 十字链表三元组 .一对一一对多 .2n-1 .能否将关键字均匀影射到哈希空间上 .前驱结点后继结点 有无好的解决冲突的方法 .n2+1 .60 解释: 三元组存储行标,列表,非零元。 一个需要六个字节, 0*6=60 .L->next=L .44 0.15,40,95,20,50,70 三.判断题 1 2 3 4 5 6 7 8 9 1 .F相当于树的先序遍历 .T .F .F .F .F .F .T .F 0.F 四、简答题 1.从顶点0到其余各节点的最短路径 2 . 3 4 .计算节点值为0的节点个数。 .这里要区别克鲁斯卡尔跟普利姆算法的区别 普利姆算法: 每次选取从这个节点到其他未被选择节点的最短边加入。 克鲁斯卡尔: 给边排好序,每次选取最短的边,如果不构成回路就加入 5 . 先序序列: ABDGCEHIF中序遍历: DGBAHEICF 后序遍历: GDBHIEFCA 6 . (1)采用头插法,看清楚题目 (2)比较4次 (3)(1*5+2*2+3+4)/9=1.78平均查找长度为1.78 五、算法填空 1 2 .p->next! =NULLp=p->nextp->next=q->nextfree(q) .j 六、编写算法 1.设计在顺序有序表中实现折半查找的算法。 (10分) 2 .设计AOV-网拓扑排序的算法(12分) 数据结构》第七章有向无环图及其应用拓扑排序 《 2 014参考答案 一、选择题 1.C2.A3.A4.B5.D6.D7.C8.C9.C10.A11.A12.D13.B14.A15.A 二、填空题 1 2 3 4 5 6 .一对多多对多 .插入和删除首结点时不必对头指针进行特殊处理 .2n-1 .将矩阵第i行全部置为零 .队尾对头先进先出 .能否将关键字均匀影射到哈希空间上有无好的解决冲突的方法 三、判断题 1 2 3 4 5 6 7 8 .F .T .T .F .T .F .T .T 9 1 .F 解释: 0.T 四、简答题 1 . 2 .关键路径: 从源点到汇点的路径长度最长的路径叫关键路径。 关键路径: a1a5a6a8a7a10 3 4 .在排好序的线性表中,删除值为X的所有元素。 . 五、算法填空 1 2 .sizeof(ElemType)! S.baseS.stacksizeetop+1 .v Visited[w]TRUEEnQueue(Q,w) 六、编写算法 .设计将两个有序链表合并为一个有序链表的算法.假设有序链表的元素按照非递减排 列.(10分) 1 2 .给定带权有向图G和源点V0,设计V0到其余顶点的最短路径.(15分) 2 015参考答案 一、选择题 1.D2.C3.C4.B5.C6.A7.A8.B9.A10.C11.A12.C13.B14.A15.A 二、填空题 1 2 3 4 5 、从任意节点出发都能访问到整个链表 、集合 、520 、O(n²) 、2h-1 图形结构 6 7 、m⌈m/2⌉ 、s->next=p->next;p->next=s; 三、判断题 1 2 3 4 5 6 7 8 9 1 .T .F .T .F .T .F .T .T .F 0.T 表头没有前驱,表尾没有后继 不唯一 四、简答题 1 2 .树的非递归中序遍历 . 3 .快速排序: 两边同时遍历,大于枢轴的交换到右边,小于的交换到左边 此处不给该题的具体实现,解题过程参照下图: 4 ( . 1) ( ( 2)拓扑排序: V1v3v2v6v5v4 3)迪杰斯特拉算法问题: 5 . 构造哈夫曼树如上图,编码 a: 11b: 100c: 001d: 0001e: 101f: 01g: 0000 五、算法填空 1 2 、①! P②e③NULL④Q.rear->next⑤p 、v visited[v]TRUEw>=0 DFS(G,w) 六、编写算法 1.voidProcess(LinkList&L,intx,inty){//L线性表的元素递增有 序排列 LinkListp=L,q,s; if((p->next! =NULL)&&(x<=y)) { while(p->next! =NULL&&p->next->data<=x)p=p->next; if(p->next==NULL||p->next->data>=y)returnERROR; q=p->next; while(q->next! =NULL&&q->data {s=q;q=q->next;free(s);} p->next=q; } } 2.思路: 利用图的广度优先遍历,那么最后一个遍历的节点一定离顶点最远。 intMaxdist(AGragh*G,intv){ ArcNode*p; intQu[MAXV];//循环队列 intfront=0,rear=0;//队列的头、尾指针 intvisited[MAXV];//初始化访问数组 inti,j,k; for(i=0;i visited[i]=1;//初始化访问标志数组 rear++; Qu[rear]=v;//顶点v进队 visited[v]=1;//顶点v已访问 while(front! =rear) { front=(front+1)%MAXV; k=Qu[front];//顶点k出队 p=G->adjlist[k].firstarc;//找到第一个邻节点 while(p! =NULL)//所有未访问过的相邻点进队 { j=p->adjvex;//邻接点为顶点j if(visited[j]==0)//若j未访问过 { visited[j]==1; rear=(rear+1)%MAXV;//进队 Qu[rear]=j; } p=p->nextarc;//找下一个邻接点 } } returnk;} 2 016参考答案 一、选择题 1.B2.B3.A4.C5.A6.A7.A8.B9.C10.D11.D12.A13.D14.C15.A 二、填空题 1 2 3 4 5 6 7 8 .n-i .(SQ.front+1)%(m+1) .p->next=q->nextfree(q) .n+1 .89 .O(log2n)O(nlog2n) .d .1、4、2、3 三、判断题 1 2 3 4 5 6 7 8 9 1 .F .T .F .T .F .F .F .T .T 0.F 四、简答题 1. (1) (2) 2. 3.平衡二叉树旋转的问题 4. (1) (2) (3)深度优先搜索序列: a,b,c,d,e,f 深度优先生成树: 5. (1)希尔排序 (2)出始堆(题目要求升序,因此要构建大顶堆) 第一趟排序后的结果: 推荐阅读以便理解堆排: 五.算法填空 1 2 3 .p->next=LL=p; .T->lchild p=p->lchildp->rchild! =Tp=p->rchildp=p->lchild .! TT->lchildT->rchild 六、编写算法 ii (1)参照快速排序思想。 i,j分别从前后遍历,要是a[i]>K将其往后仍,a[j] 扔 (2)哈夫曼算法(构造哈夫曼树and求各个字符的哈夫曼编码)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 830 数据结构 答案 有错