数据结构实用教程第二版答案徐孝凯
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章绪习题一
1.有下列几种用二元组表示的数据结构,试画出它们分别对应的图形表示(当出现多个关系时,
对每个关系画出相应的结构图),并指出它们分别属于何种结构。
⑴ A=(K,R)其中
K={a1,a2,a3...,an}
R={}
⑵ B=(K,R)其中
K={a,b,c,d,e,f,g,h}
R={r}
r={,,
⑶ C=(K,R)其中
K={a,b,c,d,f,g,h}
R={r}
r={
⑷ 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;
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< if(q.b) if(q.b>0) cout<<"+"< else cout< if(q.c) if(q.c>0) cout<<"+"< else cout< cout< } 3.用c++函数描述下列每一个算法,并分别求出它们的时间复杂度。 ⑴比较同一简单类型的两个数据x1和x2的大小,对于x1>x2,x1=x2和x1 语句定义为任一简单类型。 解: 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 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 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); } return s; } 其时间复杂度为O(n) ⑸假定一维数组a[n]中的每个元素值均在[0,200]区间内,分别统计出落在[0,20) ,[20,50),[50,80),[80,130),[130,200]等各区间的元素个数。