参考资料:《数据结构(C语言版)严蔚敏著》
版权说明:未经作者允许,禁止转载。如引用本文内容,需标明作者及出处。如本文侵犯了您的权益,请联系我删除并致歉。
文章说明:如文章中出现错误,请联系我更改。如您对文章的内容有任何疑问,也欢迎来与我讨论。
本文正在施工中...请稍等...
一元多项式
ADT Polynomial{
数据对象:
数据关系:
基本操作:
CreatPolyn(&P,m)
操作结果:输入m项的系数和指数,建立一元多项式P。
DestroyPolyn(&p)
初始条件:一元多项式P已存在。
操作结果:销毁一元多项式P。
PrintPolyn(P)
初始条件:一元多项式P已存在。
操作结果:打印输出一元多项式P。
PolyLength(P)
初始条件:一元多项式P已存在。
操作结果:返回一元多项式P中的项数。
AddPolyn(&Pa,&Pb)
初始条件:一元多项式Pa和Pb已存在,
操作结果:完成多项式相加运算,即:Pa=Pa+Pb,并销毁一元多项式Pb。
SubstractPolyn(&Pa,&Pb)
操作结果:完成多项式相减运算,即:Pa=Pa-Pb,并销毁一元多项式Pb。
MultiplyPolyn(&Pa,&Pb)
初始条件:一元多项式Pa和Pb已存在。
操作结果:完成多项式相乘运算,即:Pa=Pa*Pb,并销毁一元多项式Pb。
} ADT Polynomial
typedef struct{ //项的表示,多项式的项作为LinkList的数据元素
float coef; //系数
int expn; //指数
}term,ElemType; //两个类型名:term用于本ADT,ElemType为LinkList的数据对象名
typedef LinkList polynomial; //用带表头结点的有序链表表示多项式
void CreatPolyn(polynomial &P,int m);
//输入m项的系数和指数,建立一元多项式的有序链表P
void DestroyPolyn(polynomial &P);
//销毁一元多项式P
void PrintPolyn(polynomail P);
//打印输出一元多项式P
int PolynLength(polynomail P);
//返回一元多项式P中的项数
void AddPolyn(polynomail &Pa,polynomial &Pb);
//完成多项式相加运算,即:Pa=Pa+Pb,并销毁一元多项式Pb
void SubtractPolyn(polynomail &Pa,polynomial &Pb);
//完成多项式相减运算,即:Pa=Pa-Pb,并销毁一元多项式Pb
void MultiplyPolyn(polynomial &Pa,polynomail &Pb);
//完成多项式相乘运算,即:Pa=Pa*Pb,并销毁一元多项式Pb
int cmp(term a,term b);
//依a的指数值<(或=)(或>)b的指数值,分别返回-1、0和+1
void CreatPolyn(polynomail &P,int m){
//输入m项的系数和指数,建立表示一元多项式的有序链表P
InitList(P);
h=GetHead(P);
e.coef=0.0;
e.expn=-1;
SetCurElem(h,e); //设置头结点的数据元素
for(i=1;i<=m;i++){ //依次输入m个非零项
scanf(e.coef,e.expn);
if(!LocateElem(P,e,q,(*cmp)())){ //当前链表中不存在该指数项
if(MakeNode(s,e)) InsFirst(q,s); //生成结点并插入链表
}
}
} //CreatPolyn
void AddPolyn(polynomail &Pa, polynomail &Pb){
//多项式加法:Pa=Pa+Pb,利用两个多项式的结点构成“和多项式”
ha=GetHead(Pa); hb=GetHead(Pb); //ha和hb分别指向Pa和Pb的头结点
qa=NextPos(Pa,ha);
qb=NextPos(Pb,hb); //qa和qb分别指向Pa和Pb中当前结点
while(qa&&qb){ //qa和qb均非空
a=GetCurElem(qa);
b=GetCurElem(qb); //a和b为两表中当前比较元素
switch(*cmp(a,b)){
case -1: //多项式PA中当前结点的指数值小
ha=qa;
qa=NextPos(Pa,qa);
break;
case 0: //两者的指数值相等
sun=a.coef+b.coef;
if(sum!=0.0){ //修改多项式PA中当前结点的系数值
SetCurElem(qa,sum);
ha=qa;
}
else{ //删除多项式PA中当前结点
DelFirst(ha,qa);
FreeNode(qa);
qb=NextPos(Pb,hb);
qa=NextPos(Pa,ha);
break;
}
case 1: //多项式PB中当前结点的指数值小
DelFirst(hb,qb);
InsFirst(ha,qb);
qb=NextPos(Pb,hb);
ha=NextPos(Pa,ha);
break;
} //switch
} //while
if(!ListEmpty(Pb)) Append(Pa,qb); //连接Pb中剩余结点
FreeNode(hb); //释放Pb的头结点
} //AddPolyn