一个一元多项式pn(x)可按升幂的形式写成:
pn(x) = p0+p1X+p2X2+p3X3+…+pnXn
可以用线性表存储:(p0,p1,p2,…,pn)
例:2+x5+10x100
可以只存储非0项,用单链表存储多项式的结点结构:
typedef struct Polynode{
int coef;
int exp;
Polynode *next;
}Polynode,*Polylist;
两个多项式相加
A(x) = 7+3x+9x8+5x17
B(x) = 8x+22x7-9x8
定义两个指针p,q分别指向两个多项式的第一个元素,判断p,q指向的指数域是否相同,相同就是同类项,系数加起来,然后释放另一个表里的同类项,没有同类项的直接插入到尾结点的位置。
- 若p->exp < q->exp,则结点p所指的结点应是“和多项式”中的一项,令指针p后移;
- 若p->exp = q->exp,则将两个结点中的系数相加,当和不为零时修改结点p的系数域,释放q结点;若和为零,则和多项式中无此项,从A中删去p结点,同时释放p和q结点;
- 若p->exp > q->exp,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。
算法实现
输入多项式的系数和指数,用尾插法建立一元多项式的链表。
Polylist polycreate(){
Polynode *head,*rear,*s;
int c,e;
rear=head=(Polynode *)maloc(sizeof(Polynode));
scanf("%d,%d",&c,&e);
while(c!=0){
s=(Polynode*)malloc(sizeof(Polynode);
s->coef=c;
s->exp=e;
rear->next=s;
rear=s;
scanf("%d,%d",&c,&e);
}
rear->next=NULL;
return(head);
}
两个多项式相加
void polyadd(Polylist polya,Polylist polyb){
.../*p和q分别指向polya和polyb链表中的当前计算结点*V*/
.../*rear指向和多项式链表中的尾结点*/
while(p!=NULL&&q!=NULL)
{
if(p->exp<q->exp)
{.../*将p结点加入到和多项式中*/)}
else if(p->exp==q->exp)
{.../*若指数相等,则相应的系数相加。
若系数为0则删除p,q节点*/}
else
{.../*将q结点加入到和多项式中*/}
}
/*将多项式polya或polyb中剩余的结点加入到和多项式中*/
}