有理数抽象数据类型定义

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ADT Rational { //起名要易懂

数据对象:D={e1,e2|e1,e2∈Z,e2≠0} //分母不为零

数据关系:R={|e1表示分子,e2表示分母} //说明不可丢

基本操作:

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;

}

相关文档
最新文档