有理数抽象数据类型定义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ADT Rational { //起名要易懂
数据对象:D={e1,e2|e1,e2∈Z,e2≠0} //分母不为零
数据关系:R={
基本操作:
InitRational (&Q,v1,v2)
初始条件:v2 ≠0
操作结果:构造有理数Q,其分子和分母分别为v1与v2。
DestroyRational(&Q)
初始条件:有理数Q存在
操作结果:有理数Q被撤销。
RationalPrint(Q)
初始条件:Q存在
操作结果:以分数形式输出有理数
RationalAdd (Q1,Q2,&sum)//Substract,Multiply等操作略
初始条件:有理数Q1与Q2存在
操作结果:用sum返回Q1与Q2的和
} ADT Rational
//--采用动态分配的“顺序”存储结构--
typedef int ElemType;
typedef ElemType * Rational;
Status InitRational(Rational &Q,ElemType v1, ElemType v2){
//构造有理数Q,分子分母分别为v1,v2,若v2=0则Q赋空,返回Error if(v2==0){Q=NULL;return ERROR;} /*return后括号可有可无*/
Q=(ElemType *)malloc(2*sizeof(ElemType)); //莫忘malloc.h
if(!Q)exit(OVERFLOW);//分配存储空间失败, stdlib.h,注意!及适用场合用法Q[0]=v1;Q[1]=v2; /*之前的else可省略,若不省略最好加花括号*/ return(OK);
}
Status DestroyRational(Rational &Q)
//销毁有理数Q
{
if(Q) {
free(Q); Q=NULL; return OK;
}
}
void OutputRational(Rational Q){
//以分数形式输出有理数Q
if(!Q)printf(“the rational does not exist! \n‘);
printf(“ %d/%d ”,Q[0],Q[1]);
}
Status RationalAdd (Rational Q1, Rational Q2,Rational &Q){
//用Q返回有理数Q1和Q2的和
int temp;
if(Q1!=NULL&&Q2!=NULL){
if(!Q){
Q=(ElemType *)malloc(2*sizeof(ElemType));
if(!Q)exit(OVERFLOW);
}
Q[1]=Q1[1]*Q2[1]; Q[0]=Q1[0]*Q2[1]+Q2[0]*Q1[1];
temp=gcd(Q[0],Q[1]);
Q[0]=Q[0]/temp;Q[1]=Q[1]/temp;
return OK;
}
else return (ERROR); }
int gcd(int m,int n){ //求整数m与n的最大公约数,其中n不为0 int r;
if(m<0)m=-m; if(n<0)n=-n; //取绝对值
r=m%n; //辗转相除法:除数变被除数,余数变除数,商为0停while(r!=0){m=n; n=r; r=m%n;}
return n;
}