数据结构(专科)作业1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ 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; }
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){
6.当需要用一个形参访问对应的实参时,则该形参应说明为 引用 。
7.在函数中对引用形参的修改就是对相应 实参 的修改,对 值(或赋值)形参的修改只局 限在该函数的内部,不会反映到对应的实参上。
8.当需要进行标准I/O操作时,则应在程序文件中包含 iostream.h 头文件,当需要进行 文件I/O操作时,则应在程序文件中包含 fstream.h 头文件。
二、对于List类型的线性表,编写出下列每个算法。 ⑴ 从线性表中删除具有最小值的元素并由函数返回,空出的位置由最后一个元素填补, 若线性表为空则显示出错信息并退出运行。 解: ElemType DMValue(List& L)
//从线性表中删除具有最小值的元素并由函数返回,空出的位置 //由最后一个元素填补,若线性表为空则显示出错信息并退出运行
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 源自文库(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
⑵ 从线性表中删除第i个元素并由函数返回。 解:int Deletel(List& L,int i)
//从线性表中删除第i个元素并由函数返回 { if(i<1||i>L.size){
cerr<<"Index is out range!"<<end1; exit(1); } ElemType x; x=L.list[i-1]; for(int j=i-1;j<L.size-1;j++)
⑶ 根据给定x的值计算多项式的值。 float Eval(Quadratic& q,float x); 解:
float Eval(Quadratic& q,float x) {
float value; value= q.a*x*x+q.b*x+q.c; return value; }
⑷ 计算方程ax2+bx+c=0的两个实数根,对于有实根、无实根和不是实根方程 (即a==0)这三种情况要返回不同的整数值,以便于工作调用函数做不同的处理。 int Root(Quadratic& q,float& r1,float& r2); 解:
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; } 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 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 。
L.list[j]=L.list[j+1]; L.size--;
return x; } ⑶ 向线性表中第i个元素位置插入一个元素。 解:void Insert1(List& L,int i,ElemType x) //向线性表中第i个元素位置插入一个元素 { if(i<1||i>L.size+1){ cerr<<"Index is out range!"<<end1; exit(1);
三、应用题 1.设计二次多项式ax2+bx+c的一种抽象数据类型,假定起名为QUAdratic, 该类型的数据部分分为三个系数项a、b和c,操作部分为:(请写出下面每一个 操作的具体实现)。
⑴ 初始化数据成员a,b和c(假定用记录类型Quadratie定义成员),每个数据成 员的缺省值为0。
Quadratic InitQuadratic(float aa=0,float bb=0,float cc=0); 解: Quadratic InitQuadratic(float aa,float bb,float cc)
⑺ void cmatrix(int a[M][N],int d) //M和N为全局整型常量
{ for(int i=0;i<M;i++) for(int j=0;j<N;j++) a[i][j]*=d; } 解: 使数组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<M;i++) for(j=0;j<L;j++) c[i][j]=0; for(i=0;i<M;i++) for(j=0;j<L;j++) for(k=0;k<N;k++) c[i][j]+=a[i][k]*b[k][j]; }
2.数据的存储结构被分为 顺序结构 、 链接结构 、 索引结构 和 散列结构 四种。
3.在线性结构、树型结构和图形结构中,前驱和后继结点之间分别存在着 1对1 、 1对N 和 M对N 的关系。
4.一种抽象数据类型包括 数据 和 操作 两个部分。
5.当一个形参类型的长度较大时,应最好说明为 引用 ,以节省参数值的传输时间和存储 参数的空间。
数据结构(专科)作业1
第一章 绪论
一、单选题 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 值
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;
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.数据的逻辑结构被除数分为 集合结构 、 线性结构 、 树型结构 和 图形结构 四种。
12.函数重载要求 参数类型 、 参数个数 或 排列顺序 有所不同。
13.对于双目操作符,其重载函数带有 2 个参数,其中至少有一个为 用户自定义 的类型。
14.若对象ra和rb中至少有一个属于用户定义的类型,则执行ra==rb时,需要调用 等于号 (==) 重载函数,该函数第一个参数应与 ra ,的类型相同,第二个参数应与 rb 的类型相同。
⑵ 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; }
} 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)
解: 利用数组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<<i<<"*"<<j<<"="
<<setw(2)<<i*j<<""; cout<<end1; } } 解: 打印出一个具有n行的乘法表,第i行(1≤i≤n)中有n-i+1个乘法项,每个乘法项为i与 j(i≤j≤n)的乘积,时间复杂度为O(n2)。
9.在包含有 stdlib.h 头文件的程序文件中,使用 rand()%21 能够产生0-20之间的一个 随机数。
10.一个记录r理论上占有的存储空间的大小等于所有域的 长度之和 ,实际上占有的存储 空间的大小即记录长度为 sizeof(r) 。
11.一个数组a所占有的存储空间的大小即数组长度为 sizeof(a) ,下标为i的元数a[i]的 存储地址为 a+i ,或者为 (char*)a+i*sizeof(a[i]) 。
解: 计算∑i!的值,时间复杂度为O(n2)
⑷ int fun(int n) { int i=1,s=1; while(s<n) s+=++i; return i; }
解: 求出满足不等式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%10; c[i]++; } }
解: 矩阵相乘,即a[M][N]×b[N][L]→c[M][L],时间复杂度为O(M×N×L)。
第二章 线性表 一、(答案) ⑴解:(79,62,34,57,26,48) ⑵解:(26,34,48,57,62,79) ⑶解:(48,56,57,62,79,34) ⑷解:(57,62,79,34) ⑸解:(26,34,39,48,57,62)
{ if(ListEmpty(L)){ cerr<<"List is Empty!"<<end1; exit(1);} ElemType x; x=L.list[0]; int k=0; for(int i=1;i<L.size;i++){ ElemType y=L.list[i]; if(y<x){x=y;k=i;} } L.list[k]=L.list[L.size-1]; L.size--; return x; }
}
⑵ 做两个多项式加法,即使对应的系数相加,并返回相加的结果。 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; }
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){
6.当需要用一个形参访问对应的实参时,则该形参应说明为 引用 。
7.在函数中对引用形参的修改就是对相应 实参 的修改,对 值(或赋值)形参的修改只局 限在该函数的内部,不会反映到对应的实参上。
8.当需要进行标准I/O操作时,则应在程序文件中包含 iostream.h 头文件,当需要进行 文件I/O操作时,则应在程序文件中包含 fstream.h 头文件。
二、对于List类型的线性表,编写出下列每个算法。 ⑴ 从线性表中删除具有最小值的元素并由函数返回,空出的位置由最后一个元素填补, 若线性表为空则显示出错信息并退出运行。 解: ElemType DMValue(List& L)
//从线性表中删除具有最小值的元素并由函数返回,空出的位置 //由最后一个元素填补,若线性表为空则显示出错信息并退出运行
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 源自文库(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
⑵ 从线性表中删除第i个元素并由函数返回。 解:int Deletel(List& L,int i)
//从线性表中删除第i个元素并由函数返回 { if(i<1||i>L.size){
cerr<<"Index is out range!"<<end1; exit(1); } ElemType x; x=L.list[i-1]; for(int j=i-1;j<L.size-1;j++)
⑶ 根据给定x的值计算多项式的值。 float Eval(Quadratic& q,float x); 解:
float Eval(Quadratic& q,float x) {
float value; value= q.a*x*x+q.b*x+q.c; return value; }
⑷ 计算方程ax2+bx+c=0的两个实数根,对于有实根、无实根和不是实根方程 (即a==0)这三种情况要返回不同的整数值,以便于工作调用函数做不同的处理。 int Root(Quadratic& q,float& r1,float& r2); 解:
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; } 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 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 。
L.list[j]=L.list[j+1]; L.size--;
return x; } ⑶ 向线性表中第i个元素位置插入一个元素。 解:void Insert1(List& L,int i,ElemType x) //向线性表中第i个元素位置插入一个元素 { if(i<1||i>L.size+1){ cerr<<"Index is out range!"<<end1; exit(1);
三、应用题 1.设计二次多项式ax2+bx+c的一种抽象数据类型,假定起名为QUAdratic, 该类型的数据部分分为三个系数项a、b和c,操作部分为:(请写出下面每一个 操作的具体实现)。
⑴ 初始化数据成员a,b和c(假定用记录类型Quadratie定义成员),每个数据成 员的缺省值为0。
Quadratic InitQuadratic(float aa=0,float bb=0,float cc=0); 解: Quadratic InitQuadratic(float aa,float bb,float cc)
⑺ void cmatrix(int a[M][N],int d) //M和N为全局整型常量
{ for(int i=0;i<M;i++) for(int j=0;j<N;j++) a[i][j]*=d; } 解: 使数组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<M;i++) for(j=0;j<L;j++) c[i][j]=0; for(i=0;i<M;i++) for(j=0;j<L;j++) for(k=0;k<N;k++) c[i][j]+=a[i][k]*b[k][j]; }
2.数据的存储结构被分为 顺序结构 、 链接结构 、 索引结构 和 散列结构 四种。
3.在线性结构、树型结构和图形结构中,前驱和后继结点之间分别存在着 1对1 、 1对N 和 M对N 的关系。
4.一种抽象数据类型包括 数据 和 操作 两个部分。
5.当一个形参类型的长度较大时,应最好说明为 引用 ,以节省参数值的传输时间和存储 参数的空间。
数据结构(专科)作业1
第一章 绪论
一、单选题 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 值
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;
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.数据的逻辑结构被除数分为 集合结构 、 线性结构 、 树型结构 和 图形结构 四种。
12.函数重载要求 参数类型 、 参数个数 或 排列顺序 有所不同。
13.对于双目操作符,其重载函数带有 2 个参数,其中至少有一个为 用户自定义 的类型。
14.若对象ra和rb中至少有一个属于用户定义的类型,则执行ra==rb时,需要调用 等于号 (==) 重载函数,该函数第一个参数应与 ra ,的类型相同,第二个参数应与 rb 的类型相同。
⑵ 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; }
} 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)
解: 利用数组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<<i<<"*"<<j<<"="
<<setw(2)<<i*j<<""; cout<<end1; } } 解: 打印出一个具有n行的乘法表,第i行(1≤i≤n)中有n-i+1个乘法项,每个乘法项为i与 j(i≤j≤n)的乘积,时间复杂度为O(n2)。
9.在包含有 stdlib.h 头文件的程序文件中,使用 rand()%21 能够产生0-20之间的一个 随机数。
10.一个记录r理论上占有的存储空间的大小等于所有域的 长度之和 ,实际上占有的存储 空间的大小即记录长度为 sizeof(r) 。
11.一个数组a所占有的存储空间的大小即数组长度为 sizeof(a) ,下标为i的元数a[i]的 存储地址为 a+i ,或者为 (char*)a+i*sizeof(a[i]) 。
解: 计算∑i!的值,时间复杂度为O(n2)
⑷ int fun(int n) { int i=1,s=1; while(s<n) s+=++i; return i; }
解: 求出满足不等式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%10; c[i]++; } }
解: 矩阵相乘,即a[M][N]×b[N][L]→c[M][L],时间复杂度为O(M×N×L)。
第二章 线性表 一、(答案) ⑴解:(79,62,34,57,26,48) ⑵解:(26,34,48,57,62,79) ⑶解:(48,56,57,62,79,34) ⑷解:(57,62,79,34) ⑸解:(26,34,39,48,57,62)
{ if(ListEmpty(L)){ cerr<<"List is Empty!"<<end1; exit(1);} ElemType x; x=L.list[0]; int k=0; for(int i=1;i<L.size;i++){ ElemType y=L.list[i]; if(y<x){x=y;k=i;} } L.list[k]=L.list[L.size-1]; L.size--; return x; }