数据结构专科形成性考核册及参考答案.docx
- 文档编号:10262904
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:53
- 大小:118.49KB
数据结构专科形成性考核册及参考答案.docx
《数据结构专科形成性考核册及参考答案.docx》由会员分享,可在线阅读,更多相关《数据结构专科形成性考核册及参考答案.docx(53页珍藏版)》请在冰豆网上搜索。
数据结构专科形成性考核册及参考答案
《数据结构(专科)》形成性考核册及参考答案
作业一
((第一章——第二章)
一、单选题
1.一个数组元素a[i]与A的表示等价。
A*(a+i)Ba+iC*a+iD&a+i
2.对于两个函数,若函数名相同,但只是C不同则不是重载函数。
A参数类型B参数个数C函数类型
3.若需要利用形参直接访问实参,则应把形参变量说明为B参数。
A指针B引用C值
4.下面程序段的复杂度为C。
for(inti=0;i for(intj=0;j a[i][j]=i*j; AO(m2)BO(n2)CO(m*n)DO(m+n) 5.执行下面程序段时,执行S语句的次数为D。 for(inti=1;i<=n;i++) for(intj=1;j<=i;j++) S; An2Bn2/2Cn(n+1)Dn(n+1)/2 6.下面算法的时间复杂度为B。 intf(unsignedintn){ if(n==0||n==1)return1; Elsereturnn*f(n-1); } AO (1)BO(n)CO(n2)DO(n! ) 二、填空题 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()%21能够产生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)。 inti=0,s=0; while(++i<=n){ intp=1; for(intj=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。 QuadraticInitQuadratic(floataa=0,floatbb=0,floatcc=0); 解: QuadraticInitQuadratic(floataa,floatbb,floatcc) { Quadraticq; q.a=aa; q.b=bb; q.c=cc; returnq; } ⑵做两个多项式加法,即使对应的系数相加,并返回相加的结果。 QuadraticAdd(Quadraticq1,Quadraticq2); 解: QuadraticAdd(Quadraticq1,Quadraticq2); { Quadraticq; q.a=q1.a+q2.a; q.b=q1.b+q2.b; q.c=q1.c+q2.c; returnq; } ⑶根据给定x的值计算多项式的值。 floatEval(Quadraticq,floatx); 解: floatEval(Quadraticq,floatx) { return(q.a*x*x+q.b*x+q.c); } ⑷计算方程ax2+bx+c=0的两个实数根,对于有实根、无实根和不是实根方程 (即a==0)这三种情况要返回不同的整数值,以便于工作调用函数做不同的处理。 intRoot(Quadraticq,float&r1,float&r2); 解: intRoot(Quadraticq,float&r1,float&r2) { if(q.a==0)return-1; floatx=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); return1; } else return0; } ⑸按照ax**2+bx+c的格式(x2用x**2表示)输出二次多项式,在输出时要注意 去掉系数为0的项,并且当b和c的值为负时,其前不能出现加号。 voidPrint(Quadraticq) 解: voidPrint(Quadraticq) { if(q.a)cout< if(q.b) if(q.b>0) cout<<"+"< else cout< if(q.c) if(q.c>0) cout<<"+"< else cout< cout< } 2.指出下列各算法的功能并求出其时间复杂度。 ⑴intprime(intn) { inti=1; intx=(int)sqrt(n); while(++i<=x) if(n%i==0)break; if(i>x)return1; elsereturn0; } 解: 判断n是否是一个素数,若是则返回数值1,否则返回0。 该算法的时间复杂度为O(n1/2)。 ⑵intsum1(intn) { intp=1,s=0; for(inti=1;i<=n;i++){ p*=i; s+=p; } returns; } 解: 计算∑i! (上标为n,下标为i=1)的值,其时间的复杂度为O(n)。 ⑶intsum2(intn) { ints=0; for(inti=1;i<=n;i++){ intp=1; for(intj=1;j<=i;j++) p*=j; s+=p; } returns; } 解: 计算∑i! 的值,时间复杂度为O(n2) ⑷intfun(intn) { inti=1,s=1; while(s s+=++i; returni; } 解: 求出满足不等式1+2+3...+i≥n的最小i值,其时间复杂度为O(n1/2)。 ⑸voidUseFile(ifstream&inp,intc[10]) //假定inp所对应的文件中保存有n个整数 { for(inti=0;i<10;i++) c[i]=0; intx; while(inp>>x){ i=x%10; c[i]++; } } 解: 利用数组c[10]中的每个元素c[i]对应统计出inp所联系的整数文件中个位值同为i的整数个 数,时间复杂度为O(n) ⑹voidmtable(intn) { for(inti=1;i<=n;i++){ for(intj=i;j<=n;j++) cout< < (2)< cout< } } 解: 打印出一个具有n行的乘法表,第i行(1≤i≤n)中有n-i+1个乘法项,每个乘法项为i与j(i≤j≤n)的乘积,时间复杂度为O(n2)。 ⑺voidcmatrix(inta[M][N],intd) //M和N为全局整型常量 { for(inti=0;i for(intj=0;j a[i][j]*=d; } 解: 使数组a[M][N]中的每一个元素均详细以d的值,时间复杂度为O(M*N) ⑻voidmatrimult(inta[M][N],intb[N][L],intc[M][L]) { inti,j,k; for(i=0;i for(j=0;j c[i][j]=0; for(i=0;i for(j=0;j for(k=0;k 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); inta[]={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++){ intx=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类型的线性表,编写出下列每个算法。 ⑴从线性表中删除具有最小值的元素并由函数返回,空出的位置由最后一个元素填补,若 线性表为空则显示出错信息并退出运行。 解: ElemTypeDMValue(List&L) //从线性表中删除具有最小值的元素并由函数返回,空出的位置 //由最后一个元素填补,若线性表为空则显示出错信息并退出运行 { if(ListEmpty(L)){ cerr<<"ListisEmpty! "< exit (1); } ElemTypex; x=L.list[0]; intk=0; for(inti=1;i ElemTypey=L.list[i]; if(y } L.list[k]=L.list[L.size-1]; L.size--; returnx;} ⑵从线性表中删除第i个元素并由函数返回。 解: intDeletel(List&L,inti) //从线性表中删除第i个元素并由函数返回 { if(i<1||i>L.size){ cerr<<"Indexisoutrange! "< exit (1); } ElemTypex; x=L.list[i-1]; for(intj=i-1;j L.list[j]=L.list[j+1]; L.size--; returnx; } ⑶向线性表中第i个元素位置插入一个元素。 解: voidInser1(List&L,inti,ElemTypex) //向线性表中第i个元素位置插入一个元素 { if(i<1||i>L.size+1){ cerr<<"Indexisoutrange! "< exit (1); } if(L.size==MaxSize) { cerr<<"Listoverflow! "< exit (1); } for(intj=L.size-1;j>i-1;j--) L.list[j+1]=L.list[j]; L.list[i-1]=x; L.size++; } ⑷从线性表中删除具有给定值x的所有元素。 解: voidDelete2(List&L,ElemTypex) //从线性表中删除具有给定值x的所有元素 { inti=0; while(i if(L.list[i]==x){ for(intj=i+1;j L.list[j-1]=L.list[j]; L.size--; } else i++; } 4.对于结点类型为LNode的单链接表,编写出下列每个算法。 ⑴将一个单链接表按逆序链接,即若原单链表中存储元素的次序为a1,a2,...,an,则 逆序链接后变为an,an-1,...a1。 解: voidContrary(LNode*&HL) //将一个单多办实事有按逆序链接 { LNode*p=HL;//p指向待逆序的第一个结点,初始指向原表头结点 HL=NULL;//HL仍为逆序后的表头指针,禄始值为空 while(p! =NULL) {//把原单链表中的结点依次进行逆序链接 LNode*q=p;//q指向待处理的结点 p=p->next;//p指向下一个待逆序的结点 //将q结点插入到已陈序单链表的表头 q->next=HL; HL=q; } } ⑵删除单链表中的第i个结点。 解: voidDelete1(LNode*&HL,inti) //删除单链表中的第i个结点 { if(i<1||HL==NULL){ cerr<<"Indexisoutrange! "< exit (1); } LNode*ap,*cp; ap=NULL;cp=HL;//cp指向当前结点,ap指向其前驱结点 intj=1; while(cp! =NULL) if(j==i) break;//cp结点即为第i个结点 else{//继续向后寻找 ap=cp; cp=cp->next; j++; } if(cp==NULL){ cerr<<"Indexisoutrange! "< exit (1); } if(ap==NULL) HL=HL->next; else ap->next=cp->next; deletecp;} ⑶从单链表中查找出所有元素的最大值,该值由函数返回,若单链表为空,则显示出错信息 并停止运行。 解: ElemTypeMaxValue(LNode*HL) //从单链表中查找出所有元素的最大值,该值由函数返回 { if(HL==NULL){ cerr<<"Linkedlistisempty! "< exit (1); } ElemTypemax=HL->data; LNode*p=HL->next; while(p! =NULL){ if(max p=p->next; } returnmax; } ⑷统计出单链表中结点的值等于给定值x的结点数。 解: intCount(LNode*HL,ElemTypex) //统计出单链表中结点的值等于给定值x的结点数 { intn=0; while(HL! =NULL){ if(HL->data==x)n++; HL=HL->next; } returnn;} 作业二 ((第三章——第四章) 一、单选题 1.在稀疏矩阵的带行指针指向量的链接存储中,每个行单链表中的结点都具有相同的 A。 A行号B列号C元素值D地址 2.设一个具有t个非零元素的m*n大小的稀疏矩阵采用顺序存储,求其转置矩阵的普通 转置算法的时间复杂度为D。 AO(m)BO(n)CO(n+t)DO(n*t) 3.设一个广义表中结点的个数为n,则求广义表深度算法的时间复杂度为B。 AO (1)BO(n)CO(n2)DO(log2n) 二、填空题 1.在一个稀疏矩阵中,每个非零元素所对应的三元组包括该元素的行号、列号、和 元素值。 2.在稀疏矩阵所对应的三元组线性表中,每个三元组元素按行号为主序、列号为辅 助的次序排列。 3.在初始化一个稀疏矩阵的函数定义中,矩阵形参应说明为引用参数。 4.在稀疏矩阵的顺序存储中,利用一个数组来存储非零元素,该数组的长度应大于 等于对应的三元线性表的长度。 5.在稀疏矩阵的带行指针向量的链接存储中,每个结点包含有4个域,在相应的 十字链接存储中,每个结点包含有5个域。 6.在稀疏矩阵的十字链接存储中,每个结点的down指针域指向行号相同的下一个结点, right指针指向列号相同的下一个结点。 7.一个广义表中的元素为单元素和表元素两类。 8.一个广义表的深度等于括号嵌套的最大层数。 9.在广义表的存储结构中,每个结点均包含有3个域。 10.在广义表的存储结构中,单元素结点与表元素结点有一个域对应不同,各自分别为 值域和子表指针域。 11.若把整个广义表也看为一个表结点,则该结点的tag域的值为true或1、next域的值为NULL或0。 三、应用题 1.已知一个稀疏矩阵如图3-11所示: 0400000 000-3001 8000000 0005000 0-700020 0006000 图3-11具有6行×7列的一个稀疏矩阵 ⑴写出它的三元组线性表; 解: ((1,2,4),(2,4,-3),(2,7,1),(3,1,8),(4,4,5),(5,,2,-7),(5,6,2),(6,4,6)) ⑵给出它的顺序存储表示; 解: 下标 1 2 3 4 5 6 7 8 ... MaxTerms row(行号) 1 2 2 3 4 5 5 6 col(列号) 2 4 7 1 4 2 6 4 val(元素值) 4 -3 1 8 5 -7 2 6 ⑶给出它的转置矩阵的三元组线性表和顺序存储表示; 解: ((1,3,8),(2,1,4),(2,5,-7),(4,2,-3),(4,4,5),(4,6,6),(6,5,2),(7,2,1)) 下标 1 2 3 4 5 6 7 row(行号) 1 2 col(列号) 3 1 val(元素值) 8 4 2.画出下列每个广义表的带表头附加结点的链接存储结构图并分别计算出它们的长度和深度。 ⑴A=(()) ⑵B=(a,b,c) ⑶C=(a,(b,(c))) ⑷D=((a,b),(c,d)) ⑸E=(a,(b,(c,d)),(e)) ⑹F=((a,(b,(),c),((d)),e))) 解: 每小题的长度和深度如下表示。 题号 1 2 3 4 5 6 长度 1 3 2 2 3 1 深度 2 1 3 2 3 4 第四章栈和队列 一、应用题 1.设用第二章定义的类型为AlinkList的一维数组MS[MaxSize]建立三个链接堆栈,其中前三个元素的next域用来存储三个栈顶指针,从下标为3的元素起作为空闲元素提供给三个栈共同使用,试编写一个算法把从键盘上输入的n个整数按照下列条件分别进入不同的栈: ⑴若输入的整数x小于60,则进第一个栈; ⑵若输入的整数x大于等于60同时小于100,则进第二个栈; ⑶若输入的整数大于100,则进第三个栈。 解: voidMoreStack(ALinkListMS,intn) //把从键盘上输入的n个整
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 专科 形成 考核 参考答案
![提示](https://static.bdocx.com/images/bang_tan.gif)