当前位置:文档之家› 有理数抽象数据类型定义

有理数抽象数据类型定义

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;
}

相关主题