1、实现方式:可采用线性表的顺序存储结构,但是当多项式的每个项的指数差别很大时,会浪费很多存储空间。所以采用链式存储方式表示,每一项可以表示成一个结点,结点的结构由存放系数的coef域,存放指数的expn域和指向下一个结点的next指针域组成。
2、链表结构:


3、一元多项式的加法运算:
设La和Lb分别表示两个多项式。Lc表示和多项式。p,q,r分别表示指向单链表的当前项比较指数大小。
(1)若La->expn < Lb->expn,则结点p应是和多项式中的一项,将p复制到r,并使p后移。
(2)若La->expn = Lb->exp ,则将两个结点中的系数相加,当和不为0时,La的系数域加上Lb的系数域作为Lc的系数域;若和为0,则和多项式中没有这一项,p,q后移。
(3)若La->exp > Lb->exp ,则将结点q复制到Lc中,q后移。
//多项式相加,po1 += po2
bool Add(Poly po1,Poly po2)
{
PNode *p = po1->next; //p指向po1的第一个节点
PNode *q = po2->next; //q指向po2的第一个节点
PNode *pre = po1;
PNode *temp;
while(p != NULL && q != NULL) //当两个多项式均未扫描结束时
{
if(p->expn < q->expn) //如果p指向的多项式的指数小于q的指数,将p节点加入到和多项式中
{
pre->next = p; //将p节点加入到pre中
pre = p; //p即为现在的pre节点
p = p->next; //继续判断p的下一个节点
}
else if(p->expn > q->expn) //将节点q插入到节点p之前,指针q指向原节点的下一个节点
{
pre->next = q; //将q节点加入到和多项式中
pre = q; //q即为现在的pre节点
q = q->next; //继续判断q的下一个节点
}
else if(p->expn == q->expn) //若指数相同,则相应的系数相加
{
p->cofe += q->cofe;
if(po1->cofe == 0) //若系数和为0,则删除节点p与q,并将指针指向下一个节点
{
temp = p->next;
free(p); //删除节点p
p = temp; //使指针p指向它原节点的下一个节点
temp = q->next;
free(q); //删除节点q
q = temp; //使指针q指向它原节点的下一个节点
}
else
{
pre->next = p; //由于将两个多项式的和存储到p,所以将p加入到pre中
pre = p;
p = p->next;
temp = q->next;
free(q); //将po2链中相应项释放掉,和放到po1链中
q = temp;
}
}
}
//若多项式中还有剩余,则将剩余的节点加入到和多项式中
pre->next = p ? p : q;
return true;
}
4、一元多项式的减法运算:
算法:将减数多项式的所有系数先变为相反数,然后调用多项式相加的函数进行运算。
//多项式相减,po1 -= po2
bool Sub(Poly po1,Poly po2) //相减就是先将减数中每一项的系数变为负,再将两个多项式相加
{
PNode *p = po1->next; //p指向po1的第一个节点
PNode *q = po2->next; //q指向po2的第一个节点
PNode *pre = po1;
PNode *temp;
while(q->next != NULL) //将q中的每一项的系数变为负
{
q->cofe = 0 - q->cofe;
q = q->next;
}
q = po2->next; //上一个循环将q指向最后一个节点,现在重新使q变成po2->next
while(p != NULL && q != NULL) //当两个多项式均未扫描结束时
{
if(p->expn < q->expn) //如果p指向的多项式的指数小于q的指数,将p节点加入到和多项式中
{
pre->next = p; //将p节点加入到pre中
pre = p; //p即为现在的pre节点
p = p->next; //继续判断p的下一个节点
}
else if(p->expn > q->expn) //将节点q插入到节点p之前,指针q指向原节点的下一个节点
{
pre->next = q; //将q节点加入到和多项式中
pre = q

2746

被折叠的 条评论
为什么被折叠?



