830数据结构真题答案有错Word下载.docx

上传人:b****5 文档编号:21141123 上传时间:2023-01-27 格式:DOCX 页数:27 大小:22.44KB
下载 相关 举报
830数据结构真题答案有错Word下载.docx_第1页
第1页 / 共27页
830数据结构真题答案有错Word下载.docx_第2页
第2页 / 共27页
830数据结构真题答案有错Word下载.docx_第3页
第3页 / 共27页
830数据结构真题答案有错Word下载.docx_第4页
第4页 / 共27页
830数据结构真题答案有错Word下载.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

830数据结构真题答案有错Word下载.docx

《830数据结构真题答案有错Word下载.docx》由会员分享,可在线阅读,更多相关《830数据结构真题答案有错Word下载.docx(27页珍藏版)》请在冰豆网上搜索。

830数据结构真题答案有错Word下载.docx

abcdef拓扑序列2:

adbcef

.二叉树图如下:

.略。

已经不纳入考纲

.哈夫曼编码问题

编码:

3:

0000

20:

10

10:

0001

22:

11

18:

001

37:

01

6.二叉排序树问题

比根节点小的往左子树插,大的往右子树插。

图如下:

删除50有两种做法:

《数据结构》中的解析

这里我用第二种做法:

五.算法设计题

&

.算法填空

(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);

next=L->

next;

next=p;

}

3.弗洛伊德算法或者迪杰斯特拉算法都可以解决

采用弗洛伊德算法

(1)采用邻接矩阵,邻接矩阵的值代表乘车费用。

(2)这里算法不详细给出,《数据结构》书中有算法,这两个算法很重要。

定要自己完全理解。

011参考答案

一.选择题

.C2.A3.C4.D5.B6.D7.C

.C9.D10.C11.A12.D13.D14.A15.A

二.填空题

.线性结构非线性结构

.(8,9,4,3,6,2,12,13,19,18)

.二叉树小顶堆

.89

.存入元素移动指针(严蔚敏书中入栈是这么操作,实际看自己怎么规定)

.队列中仅有一个元素(或删除队列变成空)

.n-1

.k2

.b

0.n²

三、判断题

0.F

四.简答题

第一趟结果:

13,27,51,55,10,49,38,65,97,75

元素移动五次。

.邻接矩阵图如下:

邻接表图如下:

拓扑序列:

abgcdfe

.关键活动和关键路径

关键路径:

从起点到终点的最长路径长度,这个最长的路径就叫做关键路径。

关键活动:

关键路径上的所有活动都是关键活动。

a1-a4-a8-a11关键路径:

a-b-e-h-k

.这道题很重要。

《数据结构》上有解析,请认真理解好。

.哈夫曼树问题

1)注意:

规定权值较小的结点为左子树

3)需要总bit数:

17*2+12*3+5*4+28*2+35*2+3*4=228

需要字节数:

228/8=28.5=29需要29个字节。

(4)

翻译后的正文是:

BCBAE

.哈希平均查找长度问题

五、算法填空

.

(1)p->

next->

data<

=mink

(2)p->

next==null||p->

data>

=maxk(3)p->

next=q;

.(4)v<

G.vexnum(5)visit(v)(6)!

QueueEmpty(Q)

(7)DeQueue(Q,u)(8)EnQueue(Q,w)

六、编写算法

1.后序遍历二叉树

voidPostOrderTraversal(BinTreeNode*BT)

{

if(BT!

=NULL){

PostOrderTraversal(BT->

Left);

Right);

printf("

%c"

BT->

TData);

/

.这道题也可以参考《高分笔记》

/邻接矩阵

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<

G.edgnum;

i++)

p1=get_position(G,edges[i].start);

//获取第i条边的"

起点"

的序号

p2=get_position(G,edges[i].end);

终点"

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)

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对。

二、填空题

.7

.线性和非线性结构

.能否将关键字均匀影射到哈希空间上有无好的解决冲突的方法

.插入和删除首结点时不必对头指针进行特殊处理

.2k-12k-1

.2e

.p->

lchild==NULL&

rchild==NULL

0.021,235,346,256,558

不一定,要是有两条关键路径,有一段是重合的,那么提高重合这一段的活动速

度是可以缩短工期的。

否则是,是不能缩短整个工期的。

.F先序和后序是不能确定一颗树的

0.F需要1+2+……+n=(1+n)n/2个空间

四、简答题

.//快速排序,两边同时遍历,当遇到小于枢轴的数就往左边放,大于枢轴的就

往右边放,一趟排序下来,比枢轴小的都在枢轴左边,比枢轴大的都在枢轴右边

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

.删除线性表L中大于X小于Y的节点

3.按边的权值排序:

3,5,12,14,15,17,25

依次选取,如果不构成回路,则加入;

否则,就跳过该边。

最小生成树如下:

.深度优先搜索遍历:

V0V1V4V2V3V5V6

广度优先遍历:

V0V1V2V3V4V5V6

.弗洛伊德算法,请认真理解。

.

.(QueuePtr)malloc(sizeof(QNode))NULLQ.rear->

nextp

.!

StackEmpty()||p!

=NULLPush(S,p)Pop(S,p)p->

rchild

.voidpreOrderTraverse(BiTreeT,int*count){

if(T){//T不空

/如果为叶子节点,就加1

if(T->

T->

rchild==NULL){

*

count++;

preOrderTraverse(T->

lchild,count);

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;

013参考答案

.C2.D3.C4.C5.A6.C7.C8.C9.A10.A11.A

2.C13.D14.A15.C

十字链表三元组

.一对一一对多

.前驱结点后继结点

.n2+1

.60

解释:

三元组存储行标,列表,非零元。

一个需要六个字节,

0*6=60

.L->

next=L

.44

0.15,40,95,20,50,70

三.判断题

.F相当于树的先序遍历

1.从顶点0到其余各节点的最短路径

.计算节点值为0的节点个数。

.这里要区别克鲁斯卡尔跟普利姆算法的区别

普利姆算法:

每次选取从这个节点到其他未被选择节点的最短边加入。

克鲁斯卡尔:

给边排好序,每次选取最短的边,如果不构成回路就加入

先序序列:

ABDGCEHIF中序遍历:

DGBAHEICF

后序遍历:

GDBHIEFCA

(1)采用头插法,看清楚题目

(2)比较4次

(3)(1*5+2*2+3+4)/9=1.78平均查找长度为1.78

.p->

next!

=NULLp=p->

nextp->

next=q->

nextfree(q)

.j<

ni>

ja[i]=a[i+1]a[i+1]=tempflag==0

1.设计在顺序有序表中实现折半查找的算法。

(10分)

.设计AOV-网拓扑排序的算法(12分)

数据结构》第七章有向无环图及其应用拓扑排序

014参考答案

1.C2.A3.A4.B5.D6.D7.C8.C9.C10.A11.A12.D13.B14.A15.A

.一对多多对多

.将矩阵第i行全部置为零

.队尾对头先进先出

.能否将关键字均匀影射到哈希空间上有无好的解决冲突的方法

.关键路径:

从源点到汇点的路径长度最长的路径叫关键路径。

a1a5a6a8a7a10

.在排好序的线性表中,删除值为X的所有元素。

 

.sizeof(ElemType)!

S.baseS.stacksizeetop+1

.v<

G.vexnumDeQueueEmpty(Q,u)!

Visited[w]TRUEEnQueue(Q,w)

.设计将两个有序链表合并为一个有序链表的算法.假设有序链表的元素按照非递减排

列.(10分)

.给定带权有向图G和源点V0,设计V0到其余顶点的最短路径.(15分)

015参考答案

1.D2.C3.C4.B5.C6.A7.A8.B9.A10.C11.A12.C13.B14.A15.A

、从任意节点出发都能访问到整个链表

、集合

、520

、O(n²

、2h-1

图形结构

、m⌈m/2⌉

、s->

next=p->

p->

next=s;

表头没有前驱,表尾没有后继

不唯一

.树的非递归中序遍历

.快速排序:

两边同时遍历,大于枢轴的交换到右边,小于的交换到左边

此处不给该题的具体实现,解题过程参照下图:

1)

2)拓扑排序:

V1v3v2v6v5v4

3)迪杰斯特拉算法问题:

构造哈夫曼树如上图,编码

a:

11b:

100c:

001d:

0001e:

101f:

01g:

0000

、①!

P②e③NULL④Q.rear->

next⑤p

、v<

G.vexnum!

visited[v]TRUEw>

=0

DFS(G,w)

1.voidProcess(LinkList&

L,intx,inty){//L线性表的元素递增有

序排列

LinkListp=L,q,s;

if((p->

=NULL)&

(x<

=y))

while(p->

=NULL&

=x)p=p->

if(p->

next==NULL||p->

=y)returnERROR;

q=p->

while(q->

q->

y)

{s=q;

q=q->

free(s);

}

2.思路:

利用图的广度优先遍历,那么最后一个遍历的节点一定离顶点最远。

intMaxdist(AGragh*G,intv){

ArcNode*p;

intQu[MAXV];

//循环队列

intfront=0,rear=0;

//队列的头、尾指针

intvisited[MAXV];

//初始化访问数组

inti,j,k;

for(i=0;

i<

G->

n;

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;

016参考答案

1.B2.B3.A4.C5.A6.A7.A8.B9.C10.D11.D12.A13.D14.C15.A

.n-i

.(SQ.front+1)%(m+1)

.n+1

.O(log2n)O(nlog2n)

.d

.1、4、2、3

1.

(1)

(2)

2.

3.平衡二叉树旋转的问题

4.

(3)深度优先搜索序列:

a,b,c,d,e,f

深度优先生成树:

5.

(1)希尔排序

(2)出始堆(题目要求升序,因此要构建大顶堆)

第一趟排序后的结果:

推荐阅读以便理解堆排:

五.算法填空

next=LL=p;

.T->

lchild

lchildp->

rchild!

=Tp=p->

rchildp=p->

TT->

lchildT->

ii

(1)参照快速排序思想。

i,j分别从前后遍历,要是a[i]>

K将其往后仍,a[j]<

K则将其往前

(2)哈夫曼算法(构造哈夫曼树and求各个字符的哈夫曼编码)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1