数据结构(专科)形成性考核册及参考答案

更新时间:2023-09-19 05:38:01 阅读量: 小学教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《数据结构(专科)》形成性考核册及参考答案

作业一

((第一章——第二章)

一、单选题

1.一个数组元素a[i]与 A 的表示等价。 A *(a+i) B a+i C *a+i D &a+i

2.对于两个函数,若函数名相同,但只是 C 不同则不是重载函数。 A 参数类型 B 参数个数 C 函数类型

3.若需要利用形参直接访问实参,则应把形参变量说明为 B 参数。 A 指针 B 引用 C 值 4.下面程序段的复杂度为 C 。 for(int i=0;i

A O(m) B O(n) C O(m*n) D O(m+n) 5.执行下面程序段时,执行S语句的次数为 D 。 for(int i=1;i<=n;i++) for(int j=1; j<=i;j++) S;

A n2 B n2/2 C n(n+1) D n(n+1)/2 6.下面算法的时间复杂度为 B 。 int f(unsigned int n){ if(n==0||n==1) return 1; Else return n*f(n-1); }

A O(1) B O(n) C O(n2) D O(n!)

2

2

二、填空题

1.数据的逻辑结构被除数分为 集合结构 、 线性结构 、 树型结构 和 图形结构 四种。 2.数据的存储结构被分为 顺序结构 、 链接结构 、 索引结构 和 散列结构 四种。 3.在线性结构、树型结构和图形结构中,前驱和后继结点之间分别存在着 1对1 、 1对N 和 M对N 的关系。

4.一种抽象数据类型包括 数据 和 操作 两个部分。

5.当一个形参类型的长度较大时,应最好说明为 引用 ,以节省参数值的传输时间和存储参数的空间。

6.当需要用一个形参访问对应的实参时,则该形参应说明为 引用 。

7.在函数中对引用形参的修改就是对相应 实参 的修改,对 值(或赋值)形参的修改只局限在该函数的内部,不会反映到对应的实参上。

8.当需要进行标准I/O操作时,则应在程序文件中包含 iostream.h 头文件,当需要进行文件I/O操作时,则应在程序文件中包含 fstream.h 头文件。

9.在包含有 stdlib.h 头文件的程序文件中,使用 rand()! 能够产生0-20之间的一个随机数。

10.一个记录r理论上占有的存储空间的大小等于所有域的 长度之和 ,实际上占有的存储空间的大小即记录长度为 sizeof(r) 。

11.一个数组a所占有的存储空间的大小即数组长度为 sizeof(a) ,下标为i的元数a[i]的存储地址为 a+1 ,或者为 (char*)a+i*sizeof(a[i]) 。 12.函数重载要求 参数类型 、 参数个数 或 排列顺序 有所不同。

13.对于双目操作符,其重载函数带有 2 个参数,其中至少有一个为 用户自定义 的类型。

14.若对象ra和rb中至少有一个属于用户定义的类型,则执行ra==rb时,需要调用 等于号(==) 重载函数,该函数第一个参数应与 ra ,的类型相同,第二个参数应与 rb 的类型相同。

15.从一维数组a[n]中顺序查找出一个最大值元素的时间复杂度为 O(n) ,输出一个二维 数组b[m][n]中所有元素值的时间复杂度为 O(m*n) 。

16.在下面程序段中,s=s+p语句的执行次数为 n ,p*=j语句的执行次数为n(n+1)/2,该 程序段的时间复杂度为 O(n2) 。 int i=0,s=0; while(++i<=n){

int p=1;

for(int j=1;j<=i;j++) P*=j; s=s+p; }

17.一个算法的时间复杂度为(3n2+2nlog2n+4n-7)/(5n),其数量级表示为 O(n) 。 18.从一个数组a[7]中顺序查找元素时,假定查找第一个元素a[0]的概率为1/3,查找第二个元素a[1]的概率为1/4,查找其余元素的概率均相同,则在查找成功时同元素的平均比较次数为 35/12 。

三、应用题

1.设计二次多项式ax2+bx+c的一种抽象数据类型,假定起名为QIAdratic,该类型的数据部分分为三个系数项a、b和c,操作部分为:(请写出下面每一个操作的具体实现)。 ⑴ 初始化数据成员ab和c(假定用记录类型Quadratie定义成员),每个数据成 员的默认值为0。

Quadratic InitQuadratic(float aa=0,float bb=0,float cc=0); 解:

Quadratic InitQuadratic(float aa,float bb,float cc) {

Quadratic q; q.a=aa; q.b=bb; q.c=cc; return q; }

⑵ 做两个多项式加法,即使对应的系数相加,并返回相加的结果。 Quadratic Add(Quadratic q1,Quadratic q2); 解:

Quadratic Add(Quadratic q1,Quadratic q2); {

Quadratic q;

q.a=q1.a+q2.a; q.b=q1.b+q2.b; q.c=q1.c+q2.c; return q; }

⑶ 根据给定x的值计算多项式的值。 float Eval(Quadratic q,float x); 解:

float Eval(Quadratic q,float x) {

return(q.a*x*x+q.b*x+q.c); }

⑷ 计算方程ax2+bx+c=0的两个实数根,对于有实根、无实根和不是实根方程 (即a==0)这三种情况要返回不同的整数值,以便于工作调用函数做不同的处理。 int Root(Quadratic q,float& r1,float& r2); 解:

int Root(Quadratic q,float& r1,float& r2) {

if(q.a==0)return -1; float x=q.b*q.b-4*q.a*q.c; if(x>=0){

r1=(float)(-q.b+sqrt(x))/(2*q.a); r2=(float)(-q.b-sqrt(x))/(2*q.a); return 1; } else

return 0; }

⑸ 按照ax**2+bx+c的格式(x2用x**2表示)输出二次多项式,在输出时要注意 去掉系数为0的项,并且当b和c的值为负时,其前不能出现加号。 void Print(Quadratic q) 解:

void Print(Quadratic q) {

if(q.a) cout<0)

cout<<\ else

cout<0) cout<<\ else cout<

2.指出下列各算法的功能并求出其时间复杂度。 ⑴ int prime(int n) { int i=1;

int x=(int)sqrt(n);

while(++i<=x) if(n%i==0)break; if(i>x) return 1; else return 0; } 解:

判断n是否是一个素数,若是则返回数值1,否则返回0。该算法的时间复杂度为 O(n1/2)。

⑵ int sum1(int n) {

int p=1,s=0;

for(int i=1;i<=n;i++){ p*=i; s+=p; }

return s; }

解: 计算∑i!(上标为n,下标为i=1)的值,其时间的复杂度为O(n)。

⑶ int sum2(int n) {

int s=0;

for(int i=1;i<=n;i++){ int p=1;

for(int j=1;j<=i;j++) p*=j; s+=p; } return s; }

解: 计算∑i!的值,时间复杂度为O(n2) ⑷ int fun(int n) {

int i=1,s=1; while(s

解: 求出满足不等式1+2+3...+i≥n的最小i值, 其时间复杂度为O(n1/2)。

⑸ void UseFile(ifstream& inp,int c[10]) //假定inp所对应的文件中保存有n个整数 {

for(int i=0;i<10;i++) c[i]=0; int x;

while(inp>>x){ i=x; c[i]++; } } 解:

利用数组c[10]中的每个元素c[i]对应统计出inp所联系的整数文件中个位值同为i的整数个

数,时间复杂度为O(n)

⑹ void mtable(int n) {

for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++) cout<

打印出一个具有n行的乘法表,第i行(1≤i≤n)中有n-i+1个乘法项,每个乘法项为i与j(i≤j≤n)的乘积,时间复杂度为O(n2)。

⑺ void cmatrix(int a[M][N],int d) //M和N为全局整型常量 {

for(int i=0;i

使数组a[M][N]中的每一个元素均详细以d的值,时间复杂度为O(M*N)

⑻ void matrimult(int a[M][N],int b[N][L],int c[M][L]) {

int i,j,k; for(i=0;i

c[i][j]+=a[i][k]*b[k][j]; } 解:

矩阵相乘,即a[M][N]×b[N][L]→c[M][L],时间复杂度为O(M×N×L)。

第二章 线性表

一、在下面每个程序段中,假定线性表La的类型为List,元素类型ElemType为int,并假定每个程序段是连续执行的,试写出每个程序段执行后所得到的线性表La。 ⑴ InitList(La);

int a[ ]={48,26,57,34,62,79}; for(i=0;i<6;i++)

InsertFront(La,a[i]; TraverseList(La); 解:(79,62,34,57,26,48)

⑵InitList(La); for(I=0;I<6;I++) Insert (La,a[i]); TraverseList(La);

解:(26,34,48,57,62,79)

⑶Insert(La,56); DeleteFront(La);

InsertRear(La,DeleteFront(La)); TraverseList(La); 解:(48,56,57,62,79,34)

⑷for(i=1;i<=3;i++){

int x=GetElem(La,i); if(x%2==0)Delete(La,x); }

TraverseList(La); 解:(56,57,79,34)

⑸ClearList(La); for(i=0;i<6;i++)

InsertRear(La,a[i]); Delete(La,a[5]); Sort(La);

Insert(La,a[5]/2); TraverseList(La); 解:(26,34,39,48,57,62)

二、对于List类型的线性表,编写出下列每个算法。

⑴ 从线性表中删除具有最小值的元素并由函数返回,空出的位置由最后一个元素填补,若

线性表为空则显示出错信息并退出运行。 解: ElemType DMValue(List&L)

//从线性表中删除具有最小值的元素并由函数返回,空出的位置 //由最后一个元素填补,若线性表为空则显示出错信息并退出运行 {

if(ListEmpty(L)){

cerr<<\ exit(1); }

ElemType x; x=L.list[0]; int k=0;

for(int i=1;i

L.list[k]=L.list[L.size-1]; L.size--; return x;}

二、应用题

1、假定查找有序表A[25]中每一元素的概率相等,试分别求出进行顺序、二分和分块(假定被分为5块,每块5个元素)查找每一元素的平均查找长度。

解:

顺序查找:ASL=12.5 二分查找: ASL=99/25 分块查找: ASL=6

2. 编写一个非递归算法,在稀疏有序索引表中二分查找出给定值K所对应的索引项,即索引值刚好大于等于K的索引项,返回该索引项的start域的值,若查找失败则返回-1。

解:

int Binsch(indexlist B, int m, IndexKeyType K) {

int low=0, high=m-1; while(low<=high) {

int mid=(low+high)/2; if(K==B[mid].index)

return B[mid].start; else if(K

low=mid+1; }

if(low

3. 假定一个待散列存储的线性表为(32,75,29,63,48,94,25,46,18,70),散列地址空间为HT[13],若采用除留余数法构造散列函数和线性探查法处理冲突,试求出每一元素的散列地址,画出最后得到的散列表,求出平均查找长度。 解:

每一元素的散列地址为:

h(32)=32=6 h(75)=75=10 h(29)=29=3

h(63)=63=11 h(48)=48=9 h(94)=94=3 冲突 h1(94)=h(94)+1=4 h(25)=25=12 h(46)=46=7

h(18)=18=5 h(70)=70=5 冲突 h1(70)=h(70)+1=6 冲突 h2(70)=7 冲突 h3(70)=8

平均查找长度ASL=(8+2+4)/10=1.4 散列表Ht[13]为: 0 1

4. 假定一个待散列存储的线性表为(32,75,29,63,48,94,25,36,18,70),散列地址空

2 3 29 4 94 5 18 6 7 8 70 9 48 10 75 11 63 12 25 32 46 间为HT[11],若采用除留余数法构造散列函数和链接法处理冲突,试求出每一元素的散列

地址,画出最后得到的散列表,求出平均查找长度。

解:平均查找长度ASL=(7*1+3*2)/10=1.3

5. 已知一组关键字为(26,38,12,45,73,64,30,56),试依次插入关键字生成一棵3阶的B_树,画出每次插入一个关键字后B_树的结构。

第九章排序

一、填空题

1.每次从无序表中取出一个元素,把它插入到有序表中的适当位置,此种排序方法叫做 插入 排序;每次从无序表中挑选出一个最小或最大元素,把它交换到有序表的一端,此种排序方法叫做 选择排序。

2每次直接或通过基准元素间接比较两个元素,若出现逆序排列时就交换它们的位置,此种排序方法叫做交换排序,每次使两个相邻的有序表合并成一个有序表的排序方法叫做二路归并排序。

3在直接选择排序中,记录比较次数的时间复杂度为 O(n2),记录移动次数的时间复 杂度为 O(n) 。

4在堆排序的过程中,对n个记录建立初始堆需要进行[n/2]次筛运算,由初始堆到堆排序结束,需要对树根结点进行n-1次筛运算。

5在堆排序过程中,对任一分支结点进行筛运算的时间复杂度为O(log2n),整个堆排序过程的时间复杂度为O(nlog2n)。

6假定一组的记录的排序码为(46,79,56,38,40,84),则利用堆排序方法建立的初始堆为(84,79,56,38,40,46)。

7快速排序在平均情况下的时间复杂度为O(nlog2n),在最坏情况下的时间复杂度为O(n2)。 8快速排序在平均情况下的空间复杂度为O(log2n),在最坏情况下的空间复杂度为O(n) 。 9在快速排序方法中,进行每次划分时,是从当前待排序空间的 两端 向 中间 依次查找出处于逆序的元素并交换之,最后将基准元素交换到一个确定位置,从而以该位置把当前区间划分为前后两个子区间。

10假定一组记录的排序码为(46,79,56,38,40,80),对其进行快速排序的一次划分的结果为[38 40]46[56 79 84]。

11假定一组记录的排序码为(46,79,56,38,40,80),对其进行快速排序过程中,对应二叉树的深度为4 ,分支点结点数为 4 。

12在二路归并排中,对n个记录进行归并的趟数为 [log2n] 。

13在归并排序中,进行每趟归并的时间复杂度为O(n),整个排序过程的时间复杂度为O(nlog2n),空间复杂度为 O(n) 。

14对20个记录进行归并排序时,共需要进行 5 趟归并,在第三趟归并时是把长度为 4 的有序表两两归并为长度为 8 的有序表。

15假定一组记录的排序码为(46,79,56,38,40,80),对其进行归并排序的过程中,第二趟归并后的结果为[38 46 56 79][40 84]。

二、应用题

1. 给出每一种排序算法的时间复杂度、空间复杂度及稳定性。

解:排序方法 时间复杂度 空间复杂度 稳定性 快速 O(nlog2n) O(log2n) 不稳定 堆 O(nlog2n) O(1) 不稳定 归并 O(nlog2n) O(n) 稳定 直接插入 O(n2) O(1) 稳定 直接选择 O(n2) O(1) 不稳定 气泡 O(n2) O(1) 稳定

2. 已知一组元素的排序码为

(46,74,16,53,14,26,40,38,86,65,27,34)

(1)利用直接插入排序的方法写出每次向前面有序表插入一个元素后的排列结果。(略) (2) 利用直接选择排序方法写出每次选择和交换后的排列结果。(略)

(3) 利用堆排序的方法写出在构成初始堆和利用堆排序的过程中,每次筛运算后的排列结果,并画出初始堆所对应的完全二叉树。

解:

在构成初始堆的过程中,每次筛运算后的数据排列情况为: 0 1 2 3 4 5 6 7 8 9 10 11 (0) 46 74 16 53 14 26 40 38 86 65 27 34 (1) 46 74 16 53 14 34 40 38 86 65 27 26 (2) 46 74 16 53 65 34 40 38 86 14 27 26 (3) 46 74 16 86 65 34 40 38 53 14 27 26 (4) 46 74 40 86 65 34 16 38 53 14 27 26 (5) 46 86 40 74 65 34 16 38 53 14 27 26 (6) 86 74 40 53 65 34 16 38 46 14 27 26

在利用堆排序的过程中,每次筛运算后的数据排列情况为: 0 1 2 3 4 5 6 7 8 9 10 11 (0) 86 74 40 53 65 34 16 38 46 14 27 26 (1) 74 65 40 53 27 34 16 38 46 14 26 86 (2) 65 53 40 46 27 34 16 38 26 14 74 86 (3) 53 46 40 38 27 34 16 14 26 65 74 86 (4) 46 38 40 26 27 34 16 14 53 65 74 86 (5) 40 38 34 26 27 14 16 46 53 65 74 86 (6) 38 27 34 26 16 14 40 46 53 65 74 86 (7) 34 27 14 26 16 38 40 46 53 65 74 86 (8) 27 26 14 16 34 38 40 46 53 65 74 86 (9) 26 16 14 27 34 38 40 46 53 65 74 86 (10)16 14 26 27 34 38 40 46 53 65 74 86 (11)14 16 26 27 34 38 40 46 53 65 74 86

(4) 利用快速排序的方法写出每一层划分后的排列结果,并画出由此快速排序得到的二叉搜索树。 解:

0 1 2 3 4 5 6 7 8 9 10 11 (0) 46 74 16 53 14 26 40 38 86 65 27 34 (1) [38 34 16 27 14 26 40] 46 [86 65 53 74] (2) [26 34 16 27 14] 38 40 46 [74 65 53] 86 (3) [16 14] 26 [27 34] 38 40 46 [53 65] 74 86

(4) 14 16 26 27 34 38 40 46 53 65 74 86

(5) 利用归并排序的方法写出每一趟二路归并排序后的结果。 解:

0 1 2 3 4 5 6 7 8 9 10 11 (0) [46] [74] [16] [53] [14] [26] [40] [38] [86] [65] [27] [34] (1) [46 74] [16 53] [14 26] [38 40] [65 86] [27 34] (2) [16 46 53 74] [14 26 38 40] [27 34 65 86] (3) [14 16 26 38 40 46 53 74] [27 34 65 86] (4) 14 16 26 27 34 38 40 46 53 65 74 86

本文来源:https://www.bwwdw.com/article/0krh.html

Top