数据结构作业答案.docx
《数据结构作业答案.docx》由会员分享,可在线阅读,更多相关《数据结构作业答案.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构作业答案
第一章
单项选择题
一、以下关于算法的大体特点,说法不正确的选项是()。
能行性是算法中的每一个步骤必需能够实现且能达到预期的目的。
算法的确信性是指算法中的每一个步骤必需是有明确的概念,不许诺模棱两可。
算法的有穷性是指算法必需能在有限的时刻内做完。
算法与提供情报无关。
[D]教师批改:
D
二、算法的时刻复杂度取决于()。
问题的规模待处置的数据的初态
问题的难度A和B
[D]教师批改:
D
3、以下选项中,不是算法大体特点的是()。
可行性有穷性
确信性高效率
[D]教师批改:
D
4、通常一个好的算法应达到的目标中,不包括()。
正确性可读性
技术性健壮性
[C]教师批改:
C
五、在一样的运算机系统中,大体的运算和操作不包括()。
语法处置算术运算
关系运算数据传输
[A]教师批改:
A
六、工程上经常使用的分治法是()。
列举法归纳法
减半递推技术回溯法
[C]教师批改:
C
多项选择题
7、算法设计的要求包括()。
正确性可读性
健壮性唯一性
[ABC]教师批改:
A,B,C
八、算法的时刻复杂度应该与()无关。
所利用的运算机程序设计语言
大体运算的执行次数程序编制者
[ABD]教师批改:
A,B,D
九、以下关于算法的描述中,不正确的有()。
算法即是运算机程序算法是解决问题的计算方式
算法是排序方式算法是解决问题的有限运算序列
[ABC]教师批改:
A,B,C
填空题
1六、所谓算法是指()。
教师批改:
解题方案的准确而完整的描述
17、算法的大体特点有()、()、()和()
教师批改:
能行性、确信性、有穷性和拥有足够的情报。
1八、一个算法通常由两种大体要素组成,它们是()和()。
教师批改:
算法中对数据的运算和操作。
算法的操纵结构。
1九、工程上经常使用的几种算法设计方式有列举法、()、()、()、()和回溯法。
教师批改:
归纳法、递推、递归、减半递推技术。
20、算法的复杂度要紧包括()复杂度和()复杂度。
教师批改:
时刻、空间
综合题
21、设给定3个整数a,b,c,试写出寻觅这3个整数的中数的算法;并分析在平均情形与最坏情形下,该算法别离要做多少次比较?
寻觅这3个整数的中数的算法用C语言描述如下(中数m由函数值返回):
intmid(inta,intb,intc)
{intm;m=a;
if(m>=b){if(m>=c){if(b>=c)m=b;elsem=c;}}
else{if(m<=c){if(b>=c)m=c;elsem=b;}}
return(m);
}
假设a,b,c中的每一个数为中数的概率相等(均为1/3)。
由于当a为中数时需要比较2次,b或c为中数时均需要比较3次,因此,在平均情况下上述算法所需要的比较次数为
2*(1/3)+3*(1/3)+3*(1/3)=8/3
即在平均情况下,上述算法需要比较8/3次。
在最坏情况下,上述算法需要比较3次(当b或c为中数时)。
第二章
选择题
一、以下排序方式中,哪个是稳固的排序方式()。
归并排序稀尔排序
堆排序快速排序
[A]教师批改:
A
二、设输入序列为1,2,3,4,借助一个栈取得的输出序列能够是()。
3,4,1,24,2,1,3
4,1,2,31,3,4,2
[D]教师批改:
D
3、用数组A[m]寄存循环队列的元素值,假设其头尾指针别离为front和rear,那么循环队列中当前元素的个数为()。
(rear+front)%m(rear-front+m)%m
(rear-front)%m(rear-front+1)%m
[D]教师批改:
B
4、关于下三角矩阵A,假设采纳一个一维数组B以行为主顺序寄存紧缩矩阵A,那么A43寄存在()中.B7B8
B9B10
[C]教师批改:
C
五、深度为5的二叉树最多有()个结点。
1632
3110
[C]教师批改:
C
六、一个有n个极点的无向图最多有()条边。
nn(n-1)
n(n-1)/22n
[C]教师批改:
C
7、以下说法不正确的选项是()。
线性表能够顺序存储线性表能够链式存储
线性表在顺序存储下能够对分查找线性表在链式存储下能够对分查找
[D]教师批改:
D
八、栈和队列的一起点是()。
都是先进后出都是先进先出
只许诺在端点处插入和删除元素没有一起点
[C]教师批改:
C
九、假设进栈序列为A、B、C、D(进栈进程能够出栈),不可能取得的出栈序列是()。
A、D、C、BB、C、D、A
C、A、D、BC、D、B、A
[C]教师批改:
C
10、在一个单链表中,假设p结点不是最后一结点。
在p结点以后插入s结点的正确操作是()。
s->next=p;p->next=s;s->next=p->next;p->next=s;
s->next=p;p=p;p->next=s;s->next=p;
[B]教师批改:
B
1一、由3个结点能够构造出多少种不同的二叉树()。
24
58
[C]教师批改:
C
填空题
27、假设一棵完全二叉树共有100个结点,那么其叶子结点数为()。
教师批改:
50
2八、在单链表中设置(表)头结点的作用是()。
教师批改:
简化插入,删除算法,方便运算的实现。
2九、结点最少的树为(),结点最少的二叉树为()。
教师批改:
只有一个(根)结点的树。
空的二叉树。
34、在一棵二叉树中有30个叶子结点,仅有一个小孩的结点有20个,那么该二叉树结点数为()。
教师批改:
79
3五、在线性表的散列存储中,处置冲突有()和()两种方式。
教师批改:
拉链法、开地址法
3六、已知一棵二叉树的中序遍历序列和后序遍历序列别离为BDCEAFHG和DECBHGFA,试写出其前序遍历序列。
教师批改:
前序遍历:
ABCDEFGH
30、数据的()结构与数据元素本身的内容、形式、个数和相对位置无关。
教师批改:
逻辑
3一、数据的存储结构有四种大体的存储映射方式:
顺序、()、索引和()存储方式。
教师批改:
链式、散列
3二、用顺序方式将完全二叉树的结点逐层寄存在数组A[1]~A[n]中,假设结点A[i]
有右子女,那么右子女是结点为()。
教师批改:
A[2*i+1]
33、设有二维数组A4×6,其中每一个元素占两个字节,数组按列优先顺序存储,第一个元素a11的存储地址为100,那么元素a43的存储地址为()。
教师批改:
122
综合题
37、什么叫数据结构?
数据结构对算法有什么阻碍?
数据结构是指彼此有关联的数据元素的集合。
因此,一个数据结构既要反映数据元素的信息,又要反映数据元素之间的关系。
数据元素之间的关系能够是逻辑关系(通经常使用前后件关系来表示),也能够是数据元素在运算机中的存储位置。
反映数据元素之间逻辑关系的数据结构称为数据的逻辑结构。
数据的逻辑结构在计算机存储空间中的存放形式称为数据的存储结构,又称为数据的物理结构。
同一批数据元素的集合,采用不同的数据结构(特别是存储结构),其数据处理的效率是不一样的,主要体现在算法的时间复杂度与空间复杂度方面。
比如:
若只是对2~3个数进行排序,则用几个IF语句即可完成;而若对一般情况下的N个数进行排序,则要使用数组,通过(双重等)循环来完成。
38、试写出在顺序存储结构下逆转线性表的算法,要求利用最少的附加空间
顺序存储结构下逆转线性表的算法用C语言描述如下(其中ET为数据元素的类型):
voidinvsl(intn,ETa[])
{intk;ETt;
for(k=0;k{t=a[k];a[k]=a[n-1-k];a[n-1-k]=t;}
return;
}
39、设循环队列的容量为70(序号为1~70),现通过一系列的入队与退队运算后,有:
(1)front=14,rear=21。
(2)front=23,rear=12。
问在这两种情况下,循环队列中各有多少个元素?
设循环队列的容量为M。
如果rear>front,则循环队列中的元素个数为rear-front;
如果rear由此可以得到:
(1)循环队列中的元素个数为rear-front=21-14=7。
(2)循环队列中的元素个数为M+(rear-front)=70+(12-23)=59。
注:
求循环队列中元素个数的通用式为:
(rear-front+M)%M。
其中%为求余运算。
40、试编写一个算法,将两个有序的顺序表归并为一个有序的顺序表。
归并有序顺序表的算法如下描述。
输入:
长度为的有序数组A(1:
n),长度为的有序数组B(1:
m)。
输出:
有序数组A与有序数组B合并后的有序数组C(1:
mn)。
其中mn=m+n。
上述算法用C语言描述如下(其中ET为数据元素的类型):
voidmgsl(intn,ETa[],intm,ETb[],ETc[])
{inti,j,k,t;
i=0;j=0;k=0;
while((i{if(a[i]<=b[j])
{c[k]=a[i];i=i+1;}
else{c[k]=b[j];j=j+1;}
k=k+1;
}
if(i==n)
for(t=j;t{c[k]=b[t];k=k+1;
else
for(t=i;t{c[k]=a[t];k=k+1;}
return;
}
41、试写出计算循环链表长度的算法。
算法用C语言描述如下(其中ET为数据元素类型,函数值返回循环链表的长度n):
structnode/*定义循环链表结点类型*/
{ETd;/*定义循环链表结点数据类型*/
structnode*next;/*结点指针*/
};
intlencst(structnode*head)
{intn;structnode*p;
n=0;p=head->next;
while(p!
=head){n=n+1;p=p->next;}
return(n);
}
42、试写出逆转(带表头结点的)线性单链表的算法。
设其头指针为head,数据元素类型为ET。
算法用C语言描述如下:
structnode/*定义线性单链表结点类型*/
{ETd;/*定义线性单链表结点数据类型*/
structnode*next;/*结点指针*/
};
voidinvlst(structnode*head)
{structnode*p,*q;
p=head->next;
head->next=NULL;
while(p!
=NULL)
{q=p;p=p->next;
q->next=head->next;head->next=q;
}
return;
}
43、设有两个有序线性单链表,头指针别离为AH与BH。
试写出将这两个有序线性单链表归并为一个头指针为CH的有序线性单链表的算法。
输入:
头指针别离为AH与BH的两个有序线性单链表。
输出:
将头指针别离为AH与BH的两个有序线性单链表归并后的头指针为CH的有序线性单链表。
算法用C语言描述如下(其中ET为数据元素类型):
structnode/*概念线性单链表结点类型*/
{ETd;/*概念线性单链表结点数据类型*/
structnode*next;/*结点指针*/
};
#include““
voidmglst(structnode*ah,structnode*bh,structnode**ch)
{structnode*i,*j,*k,*p;
i=ah;j=bh;*ch=NULL;k=NULL;
while((i!
=NULL)&&(j!
=NULL))
{p=(structnode*)malloc(sizeof(structnode));/*取得一个新结点*/
if(j->d>=i->d){p->d=i->d;i=i->next;}
else{p->d=j->d;j=j->next;}
if(*ch==NULL)*ch=p;
elsek->next=p;
k=p;
}
if(j==NULL)
while(i!
=NULL)
{p=(structnode*)malloc(sizeof(structnode));/*取得一个新结点*/
p->d=i->d;i=i->next;
if(*ch==NULL)*ch=p;
elsek->next=p;
k=p;
}
else
while(j!
=NULL)
{p=(structnode*)malloc(sizeof(structnode));/*取得一个新结点*/
p->d=j->d;j=j->next;
if(*ch==NULL)*ch=p;
elsek->next=p;
k=p;
}
if(k!
=NULL)k->next=NULL;
return;
}
44、已给一个带表头结点的单链表head,它含有重复结点,即它含有数据域的值相同的结点,试用C语言(或类C语言)写出以下算法函数:
(1)删除单链表中重复的多余结点。
(2)输出不含重复结点的单链表。
(1)voiddeletenode(NODE*head)
{NODE*r,*p,*q;
r=head->next;
while(r!
=NULL)
{intm=r->data;
p=r;
while(p!
=NULL)
{q=p;p=p->next;
if(p->data==m)
{q->next=p->next;free(p);
p=q->next;}
}
}
}
(2)voidprint(NODE*head)
{NODE*p;p=head->next;
while(p!
=NULL)
{printf(“%c”,p->data);
p=p->next;
}
printf(“\n”);
}
45、设树T的度为4,其中度为1,2,3,4的结点个数别离为4,2,1,1。
问T中有多少个叶子结点?
依照给定的条件,在树T中,各结点射出的分支总数为:
4*1+2*2+1*3+1*4=15
树T中的总结点数为:
15(各结点射出的分支总数)+1(根结点)=16
非叶子结点总数为:
4+2+1+1=8
因此,叶子结点数为:
16(总结点数)-8(非叶子结点总数)=8
46、设有n个人围成一圈,每一个人的编号依次为1,2,3,。
。
。
,n。
现从编号为k的人开始报数,数到m的人出列,接着从出列的下一个人开始从头报数,数到m的人又出列,依此类推,直到所有人都出列为止。
现要求该n个人的出列顺序。
那个问题称为约瑟夫(Josephu)问题。
试编写求解约瑟夫问题的算法。
设以自然数1,2,3,。
。
。
,n为元素组成一个循环队列,并用一个数组A(1:
n)寄存该队列中各元素的直接后继,其中A(i)表示表示整数i的下一个整数。
在开始时,该数组中的各元素为:
A(i)=i+1;i=1,2,3,…….,n-1
A(n)=1;
以后由于不断地有元素从这个队列中出来,该数组中的元素值也在不断地变化。
即当有元素出列后,某些整数i的下一个数就不一定是i+1了。
下面的算法中用数组B(1:
n)依次存放每次的出列者。
#include““
voidjsphu(intn,intm,intk,intb[])
{inti,j,t,*a;
a=malloc(n*sizeof(int));
for(i=0;ia[i]=i+1;
a[n-1]=0;
k=k-1;
for(j=0;j{for(i=0;i{t=k;k=a[k];}
b[j]=k+1;a[t]=a[k];
k=a[k];
}
free(a);
return;
}