电大计算机专科【数据结构】形成性考核册答案(附题目).doc_第1页
电大计算机专科【数据结构】形成性考核册答案(附题目).doc_第2页
电大计算机专科【数据结构】形成性考核册答案(附题目).doc_第3页
电大计算机专科【数据结构】形成性考核册答案(附题目).doc_第4页
电大计算机专科【数据结构】形成性考核册答案(附题目).doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电大【数据结构】形成性考核册答案(专科)电大【数据结构】形考作业一答案:(第一章第二章)一、单选题1.一个数组元素ai与 A 的表示等价。 A *(a+i) B a+i C *a+i D &a+i2.对于两个函数,若函数名相同,但只是 C 不同则不是重载函数。 A 参数类型 B 参数个数 C 函数类型 3.若需要利用形参直接访问实参,则应把形参变量说明为 B 参数。 A 指针 B 引用 C 值4.下面程序段的复杂度为 C 。 for(int i=0;im;i+) for(int j=0;jn;j+) aij=i*j; A O(m2) B O(n2) 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)/26.下面算法的时间复杂度为 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!)二、填空题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的元数ai的存储地址为 a+1 ,或者为 (char*)a+i*sizeof(ai) 。12.函数重载要求 参数类型 、 参数个数 或 排列顺序 有所不同。13.对于双目操作符,其重载函数带有 2 个参数,其中至少有一个为 用户自定义 的类型。14.若对象ra和rb中至少有一个属于用户定义的类型,则执行ra=rb时,需要调用 等于号(=) 重载函数,该函数第一个参数应与 ra ,的类型相同,第二个参数应与 rb 的类型相同。15.从一维数组an中顺序查找出一个最大值元素的时间复杂度为 O(n) ,输出一个二维数组bmn中所有元素值的时间复杂度为 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=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) coutq.a0) cout+q.bx; else coutq.b0) cout+q.c; else coutq.c; coutend1; 2.指出下列各算法的功能并求出其时间复杂度。 int prime(int n) int i=1; int x=(int)sqrt(n);while(+ix) 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(sn) s+=+i; return i; 解: 求出满足不等式1+2+3.+in的最小i值, 其时间复杂度为O(n1/2)。 void UseFile(ifstream& inp,int c10) /假定inp所对应的文件中保存有n个整数 for(int i=0;ix) i=x%10; ci+; 解: 利用数组c10中的每个元素ci对应统计出inp所联系的整数文件中个位值同为i的整数个数,时间复杂度为O(n) void mtable(int n) for(int i=1;i=n;i+) for(int j=i;j=n;j+) couti*j= setw(2)i*j; coutend1; 解: 打印出一个具有n行的乘法表,第i行(1in)中有n-i+1个乘法项,每个乘法项为i与j(ijn)的乘积,时间复杂度为O(n2)。 void cmatrix(int aMN,int d) /M和N为全局整型常量 for(int i=0;iM;i+) for(int j=0;jN;j+) aij*=d; 解: 使数组aMN中的每一个元素均详细以d的值,时间复杂度为O(M*N) void matrimult(int aMN,int bNL,int cML) int i,j,k; for(i=0;iM;i+) for(j=0;jL;j+) cij=0; for(i=0;iM;i+) for(j=0;jL;j+) for(k=0;kN;k+) cij+=aik*bkj; 解: 矩阵相乘,即aMNbNLcML,时间复杂度为O(MNL)。第二章 线性表一、在下面每个程序段中,假定线性表La的类型为List,元素类型ElemType为int,并假定每个程序段是连续执行的,试写出每个程序段执行后所得到的线性表La。 InitList(La); int a =48,26,57,34,62,79; for(i=0;i6;i+) InsertFront(La,ai; TraverseList(La);解:(79,62,34,57,26,48)InitList(La); for(I=0;I6;I+) Insert (La,ai); 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;i6;i+)InsertRear(La,ai); Delete(La,a5); Sort(La); Insert(La,a5/2); TraverseList(La);解:(26,34,39,48,57,62)二、对于List类型的线性表,编写出下列每个算法。 从线性表中删除具有最小值的元素并由函数返回,空出的位置由最后一个元素填补,若线性表为空则显示出错信息并退出运行。解: ElemType DMValue(List&L) /从线性表中删除具有最小值的元素并由函数返回,空出的位置 /由最后一个元素填补,若线性表为空则显示出错信息并退出运行 if(ListEmpty(L) cerrList is Empty!end1; exit(1); ElemType x; x=L.list0; int k=0; for(int i=1;iL.size;i+) ElemType y=L.listi; if(yx)x=y;k=i; L.listk=L.listL.size-1; L.size-; return x; 从线性表中删除第i个元素并由函数返回。解:int Deletel(List& L,int i) /从线性表中删除第i个元素并由函数返回 if(iL.size) cerrIndex is out range!end1; exit(1); ElemType x; x=L.listi-1; for(int j=i-1;jL.size-1;j+) L.listj=L.listj+1; L.size-; return x; 向线性表中第i个元素位置插入一个元素。解:void Inser1(List& L,int i,ElemType x) /向线性表中第i个元素位置插入一个元素 if(iL.size+1) cerrIndex is out range!end1; exit(1); if(L.size=MaxSize) cerrList overflow!i-1;j-) L.listj+1=L.listj; L.listi-1=x; L.size+; 从线性表中删除具有给定值x的所有元素。解:void Delete2(List& L,ElemType x) /从线性表中删除具有给定值x的所有元素 int i=0; while(iL.size) if(L.listi=x) for(int j=i+1;jnext; /p指向下一个待逆序的结点 /将q结点插入到已陈序单链表的表头 q-next=HL; HL=q; 删除单链表中的第i个结点。解:void Delete1(LNode*&HL,int i) /删除单链表中的第i个结点 if(i1|HL=NULL) cerrIndex is out range!next; j+; if(cp=NULL) cerrIndex is out range!next; else ap-next=cp-next; delete cp; 从单链表中查找出所有元素的最大值,该值由函数返回,若单链表为空,则显示出错信息并停止运行。解:ElemType MaxValue(LNode*HL) /从单链表中查找出所有元素的最大值,该值由函数返回 if(HL=NULL) cerrLinked list is empty!data; LNode*p=HL-next; while(p!=NULL) if(maxdata) max=p-data; p=p-next; return max; 统计出单链表中结点的值等于给定值x的结点数。解:int Count(LNode*HL,ElemType x) /统计出单链表中结点的值等于给定值x的结点数 int n=0; while(HL!=NULL) if(HL-data=x) n+; HL=HL-next; return n;电大天堂【数据结构】形考作业二答案:(第三章第四章)一、单选题1.在稀疏矩阵的带行指针指向量的链接存储中,每个行单链表中的结点都具有相同的 A 。 A 行号 B 列号 C 元素值 D 地址2.设一个具有t个非零元素的m*n大小的稀疏矩阵采用顺序存储,求其转置矩阵的普通转置算法的时间复杂度为 D 。 A O(m) B O(n) C O(n+t) D O(n*t)3.设一个广义表中结点的个数为n,则求广义表深度算法的时间复杂度为 B。 A O(1) B O(n) C O(n2) D O(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所示: 0 4 0 0 0 0 0 0 0 0 -3 0 0 1 8 0 0 0 0 0 0 0 0 0 5 0 0 0 0 -7 0 0 0 2 0 0 0 0 6 0 0 0 图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)给出它的顺序存储表示;解:下标12345678.MaxTermsrow(行号)12234556col(列号)24714264val(元素值)4-3185-726给出它的转置矩阵的三元组线性表和顺序存储表示;解:(1,3,8),(2,1,4),(2,5,-7),(4,2,-3),(4,4,5),(4,6,6),(6,5,2),(7,2,1)下标1234567row(行号)12col(列号)31val(元素值)842.画出下列每个广义表的带表头附加结点的链接存储结构图并分别计算出它们的长度和深度。 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)解:每小题的长度和深度如下表示。题号123456长度132231深度213234第四章 栈和队列一、应用题1.设用第二章定义的类型为AlinkList的一维数组MSMaxSize建立三个链接堆栈,其中前三个元素的next域用来存储三个栈顶指针,从下标为3的元素起作为空闲元素提供给三个栈共同使用,试编写一个算法把从键盘上输入的n个整数按照下列条件分别进入不同的栈:若输入的整数x小于60,则进第一个栈;若输入的整数x大于等于60同时小于100,则进第二个栈;若输入的整数大于100,则进第三个栈。解: void MoreStack(ALinkList MS,int n) /把从键盘上输入的n个整数按不同条件分别进入到三个不同的链接栈中 if(nMaxSize-3) cerr存储空间不足!; exit(1); int i,x,av; for(i=0;i3;i+) MSi.next=0/置空栈,即给三个栈顶指针赋0 av=3;/av指向可利用元素的下标,赋初值为3 cout输入n个整数:end1; for(i=0;ix; MSav.data=x; /按条件把av元素压入不同的栈,即链接到相应栈的栈顶 if(x=60&x=100) MSav.next=MS1.next; MS1.next=av; else MSav.next=MS2.next; MS2.next=av; /使av指向下一个可利用元素 av+; 2.编写一个程序,首先调用上题算法,然后分别打印出每个栈中的内容。解: #include #include const int MaxSize=50;/要至少定义为比输入的整数个数大3 typedef int ElemType; struct ALNode ElemType data; int next; ; typedef ALNode ALinkListMaxSize; void MoreStack(ALinkList MS,int n) /函数体在此省略 void main() ALinkList a; int n; coutn; MoreStack(a,n); for(int i=0;i3;i+) /依次将每个栈中的元素全部出栈并打印出来 int j=ai.next; while(j!=0) coutaj.data; j=aj.next; coutend1; 一次输入和运行结果如下: 从键盘上输入的整数个数为(147):12 输入12个整数: 38 64 97 120 78 33 45 214 88 25 143 60 25 45 33 38 60 88 78 97 64 143 214 1203.已知一个中缀算术表达式为: 3+4/(25-(6+15)*8写出对应的后缀算术表达式。解:3 4 25 6 15 + - /8 * + 画出在转换成后缀表达式的过程中运算符栈的变化。解:步序运算符栈的变化 0# 1#+ 2#- 3#/ 4#* 5#+4.已知一个后缀算术表达式为: 24 8 + 3 * 4 10 7 - * / 写出对应的中缀算术表达式。解: (24+8)*3/(4*(10-7)画出在进行后缀算术表达式求值的过程中数值栈的变化。解: 24 8 + 3 * 4 10 7 - * / 数值符栈的变化8数值符栈的变化1296数值符栈的变化3496数值符栈的变化710496数值符栈的变化332数值符栈的变化8245.编写把十进制正整数转换为十六进制数输出的算法。解: void Transform(long num) /把一个正整数num转为一个十六进制数输出 Stack a; InitStack(a); while(num!=0) int k=num % 16; Push(a,k); num/=16; while(!StackEmpty(a) int X=Pop(a); if(x10) coutx; else switch(x) cass 10: coutA; break; cass 11: coutB; break; cass 12: coutC; break; cass 13: coutD; break; cass 14: coutE; break; cass 15: coutF; coutend1; 6.编写把十进制正整数转换为S进制(2S9)数输出的递归算法,然后若把425转换为六进制数,画出每次递归调用前和返回后系统栈的状态。解: 只给出递归算法,画图从略。 void Transform(long num,int s) /把十进制正整数转换为S进制数的递归算法 int k; if(num!=0) k=num%S; Transfrom(num/S,S); cout=2)Fib(n)=Fib(n)=Fib(n)= 试编写计算Fib(n)的递归算法和非递归算法,并分析它们的时间复杂度和空间复杂度。解: 递归算法为: long Fib(int n) if(n=1|n=2) /终止递归条件 return 1; else return Fib(n-1)+Fib(n-2); 非递归算法为 long Fib1(int n) int a,b,c;/C代表当前项,a和b分别代表当前项前面的第2项和第1项 a=b=1; /给a和b赋初值1 if(n=1|n=2) return 1; else for(int i=3;i0)为 a(i-1)/2 。19.对于一棵具有n个结点的二叉树,对应二叉链接表中指针总数为 2n 个,其中 n-1 个用于指向孩子结点, n+1 个指针空闲着。20.一棵二叉树广义表表示为a(b(d(,h),c(e,f(g,i(k),该树的结点数为 10 个,深度为 5 。21.在一棵

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论