您的位置:首页 > 理论基础 > 数据结构算法

数据结构——一元多项式的表示及相加

2017-02-27 14:50 453 查看
本文所有代码均为伪码,仅阐述算法基本思想——《数据结构》清华大学出版社

一元多项式的表示采用链式存储结构来实现,基本操作和链表的合并类似。以下为算法部分:

typedef struct{//项的表示,多项式的项作为LinkList的数据元素
float coef;//系数
int expn;//指数
}term,ElemType;//两个类型名:term用于本ADT,ElemType为LinkList的数据对象名

type LinkList polynomial;//用带表头结点的有序链表表示多项式

void CreatPolyn(polynomail &P, int m);
//输入m项的系数和指数,建立表示一元多项式的有序链表P
void DestroyPolyn(polynomail &p);
//销毁一元多项式P
void PrintPolyn(polynomail P);
//打印输出一元多项式P
void PolynLength(polynomail P);
//返回一元多项式P中的项数
void AddPolyn(polynomail &Pa, polynomail &Pb);
//完成多项式相加运算,即:Pa=Pa+Pb,并销毁一元多项式Pb
void SubtractPolyn(polynomail &Pa,polynomail &Pb);
//完成一元多项式的相减运算,即:Pa=Pa-Pb,并销毁一元多项式Pb
void MultiplyPolyn(polynomail &Pa,polynomail &Pb);
//完成一元多项式的相乘运算,即:Pa=Pa*Pb,并销毁一元多项式Pb

int cmp(term a,term b);
//依a的指数值<(或=)(或>)b的指数值,分别返回-1、0、+1

//基本操作的算法描述(部分)
void CreatPolyn(polynmail &P, int m){
InitList(P);//构造一个空的线性链表P
h=GetHead(P);//获取P的头结点
e.coef=0.0;e.expn=-1;SetCurElem(h,e);//设置头结点的数据元素
for(i=1;i<=m;++i){
scanf(e.coef,e.expn);
if(!LocateElem(P,e,q,(*cmp)())){//当前链表中不存在该指数项
if(MakeNode(s,e)) InsFirst(q,s);//生成结点并插入链表
}
}
}

void AddPolyn(polynomail &Pa,Polynomail &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://两者指数值相等
sum=a.coef+b.coef;
if(sum!=0.0){//修改多项式Pa中的当前结点的系数值
SetCurElem(qa,sum); ha=qa;
}else{//删除多项式Pa中的当前结点
DelFirst(ha,qa); FreeNode(qa);
}
DelFirst(hb,qb);FreeNode(qb);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;
}
}
if(!ListEmpty(Pb)) Append(Pa,qb);//链接Pb中的剩余结点
FreeNode(hb);//释放Pb的头结点
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 算法