数据结构实用教程+(第二版)+课后答案+(徐孝...
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
K={a,b,c,d,e,f,g,h} R={r} r={<a,b>,<b,c>,<c,d>,<d,e>,<e,f>,<f,g>,<g,h>} ⑶ C=(K,R)其中 K={a,b,c,d,f,g,h} R={r} r={<d,b>,<d,g>,<b,a>,<b,c>,<g,e>,<g,h>,<e,f>} ⑷ D=(K,R)其中 K={1,2,3,4,5,6} R={r} r={(1,2),(2,3),(2,4),(3,4),(3,5),(3,6),(4,5),(4,6)} ⑸ E=(K,R)其中 K={48,25,64,57,82,36,75,43} R={r1,r2,r3} r1={<48,25>,<25,64>,<64,57>,<57,82>,<82,36>,<36,75>,<75,43>} r2={<48,25>,<48,64>,<64,57>,<64,82>,<25,36>,<82,75>,<36,43>} r3={<25,36>,<36,43>,<43,48>,<48,57>,<57,64>,<64,75>,<75,82>} 解:⑴是集合结构;⑵是线性结构;⑶⑷是树型结构;⑸散列结构。只作为参考。 2.设计二次多项式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;
第一章绪习 题 一 一、单选题 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<m;i++) for(int j=0;j<n;j++) a[i][j]=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)/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!) 二、填空题 1.数据的逻辑结构被除数分为 集合结构 、 线性结构 、 树型结构 和 图形结构 四种。 2.数据的存储结构被分为 顺序结构 、 链接结构 、 索引结构 和 散列结构 四种。 3.在线性结构、树型结构和图形结构中,前驱和后继结点之间分别存在着 1对1 、 1对N 和 M对N 的关系。 4.一种抽象数据类型包括 数据 和 操作 两个部分。 5.当一个形参类型的长度较大时,应最好说明为 引用 ,以节省参数值的传输时间和存储参数的空间。 6.当需要用一个形参访问对应的实参时,则该形参应说明为 引用 。 7.在函数中对引用形参的修改就是对相应 实参 的修改,对 值(或赋值)形参的修改只局限在该 函数的内部,不会反映到对应的实参上。
} return s; } 其时间复杂度为O(n) ⑸ 假定一维数组a[n]中的每个元素值均在[0,200]区间内,分别统计出落在[0,20) ,[20,50),[50,80),[80,130),[130,200]等各区间的元素个数。 解: int Count(int a[],int n,int c[5])//用数组c[5]保存统计结果 { int d[5]={20,50,80,130,201};//用来保存各统计区间的上限 int i,j; for(i=0;i<5;i++)c[i]=0;//给数组c[5]中的每个元素赋初值0 for(i=0;i<n;i++) { if(a[i]<0||a[i]>200) return 0;//返回数值0表示数组中数据有错,统计失败 for(j=0;j<5;j++)//查找a[i]所在区间 if(a[i]<d[j]) break; c[j]++;//使统计相应区间的元素增1 } return 1;//返回数值1表示统计成功 } 其时间复杂度为O(n) ⑹ 从二维整型数组a[m][n]中查找出最大元素所在的行、列下标。 解: void find(int a[M][N],int m,int n,int&Lin,int&Col) //M和N为全局常量,应满足M>=n和N>=n的条件,Lin和Col为引用 //形参,它是对应实参的别名,其值由实参带回 { Lin=0;Col=0; for(int i=0;i<m;i++) for(int j=0;j<n;j++) if(a[i][j]>a[Lin][Col]){Lin=i;Col=j;} } 其时间复杂度为O(m*n) 4.指出下列各算法的功能并求出其时间复杂度。 ⑴ int prime(int n) { int i=2; int x=(int)sqrt(n); while(i<=x){ if(n%i==0)break; i++; }
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<<q.a<<"x**2"; if(q.b) if(q.b>0) cout<<"+"<<q.b<<"x"; else cout<<q.b<<"x"; if(q.c) if(q.c>0) cout<<"+"<<q.c; else cout<<q.c; cout<<end1; }
3.用c++函数描述下列每一个算法,并分别求出它们的时间复杂度。 ⑴ 比较同一简单类型的两个数据x1和x2的大小,对于x1>x2,x1=x2和x1<x2这三种不同 情况分别返回'>''='和'<'字符。假定简单类型用SimpleType表示,它可通过typedef 语句定义为任一简单类型。 解: char compare(SimpleType x1,SimpleType x2) { if(x1>x2) return'>'; else if(x1==x2) return '='; else return'<'; } 其时间复杂度为O(1) ⑵ 将一个字符串中的所有字符按相反方的次序重新放置。 解: void Reverse(char*p) { int n=strlen(p); for(int i=0;i<n/2;i++){ char ch; ch=p[i] p[i]=p[n-i-1]; p[n-i-1]=ch; } } 其时间复杂度为O(n) ⑶ 求一维double型数组a[n]中的所有元素之乘积。 解: double product(double a[],int n) { double p=1; for(int i=0;i<n;i++) p*=a[i]; return p; } 其时间复杂度为O(n) ⑷ 计算∑ni=0xi/i+1的值。 解: double Accumulate(double x,int n) { double p=1,s=1; for(int i=1;i<=n;i++){ p*=x; s+=p/(i+1);
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) 。 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.有下列几种用二元组来自百度文库示的数据结构,试画出它们分别对应的图形表示(当出现多个关系时, 对每个关系画出相应的结构图),并指出它们分别属于何种结构。 ⑴ A=(K,R)其中 K={a1,a2,a3...,an} R={} ⑵ B=(K,R)其中