建立一元多项式的链式存储
用单链表存储多项式的结点结构如下:
struct Polynode
{
int coef;
int exp;
Polynode *next;
}
多项式相加的过程
1.两个多项式中所有指数相同的项的对应系数相加,
若和不为零,则构成“和多项式”中的一项;
2.所有指数不相同的项
均复抄到“和多项式”中。
一元多项式相加中的三种情况
1.若pa->exp<qb->exp,
则结点pa所指的结点应是“和多项式”中的一项,将结点pa插入在结点pc之后,令指针pa、pc后移;
2.若pa->exp>qb->exp,
则结点qb所指的结点应是“和多项式”中的一项,将结点pb插入在结点pc之后,pb 、pc后移;
3.若pa->exp=qb->exp,
则将两个结点中的系数相加, 释放qb结点;
3.1当和不为零时修改结点pa的系数域, pa、pc后移;
3.2若和为零,释放pa,pa后移。
算法分析
1.设置四个工作指针,pa, pb, pc, p,并对其进行初始化
2.当 pa!=NULL 并且pb!=NULL时,重复做以下工作
2.1If(pa.exp<pb.exp),将pa加入到C中,之后移动pa、pc;
2.2If(pa.exp>pb.exp),将pb加入到C中,之后移动pb、pc;
2.3If(pa.exp==pb.exp) ,pa、pb的系数相加,删除pb,pb后移
2.3.1如果和为0,删除pa, pa后移
2.3.2否则,将和写入到pa中,将pa加入到C中,之后,pa、pc后移;
3.如pa!=NULL,将pa链入C中,否则将pb链入C中;
核心代码
void Add(LinkList <T>&A, LinkList <T>B){
Node<T> *pa, *pb, *pc, *p;
T a, b; //存放pa、pb两个指针变量中存储的系数
pc = A.GetHead(); //结果存放指针
p = B.GetHead();
pa = A.GetHead()->next; //pa指向ah
pb = B.GetHead()->next; //pb指向bh
delete p; //删去bh的表头结点
while ( pa != NULL && pb != NULL ) {
a = pa->data;
b = pb->data;
if(a.exp==b.exp){
//pa->exp == pb->exp
a.coef = a.coef + b.coef; //系数相加
p = pb; pb = pb->next;
delete p; //删去原pb所指结点
if (a.coef == 0) {
p = pa;
pa = pa->next;
delete p;
} //相加为零, 该项不要
else { //相加不为零, 加入ch链
pa->data = a;
pc->next = pa;
pc = pa;
pa = pa->next;
}
}
else if(a.exp>b.exp) { //pa->exp > pb->exp
pc->next = pb;
pc = pb;
pb = pb->next;
}
else{ //pa->exp < pb->exp
pc->next=pa;
pc = pa;
pa = pa->next;
}
}
if (pa)
pc->next=pa;
else
pc->next=pb;
对结果表达式的构造:
从空表开始,依次将A或B中结点加入到C中,完成C表的构造(尾插法构造了新的单链表)