/*多项式加法运算
使用链表实现*/#include
using namespacestd;//使用不带头结点的单向链表,按照指数递减的顺序排列
typedef structPolyNode
{int coef; //系数
int expon; //指数
PolyNode *link; //指向下一个节点的指针
}*polynomial, npolynomial;
polynomial PolyAdd(polynomial p1, polynomial p2);int Compare(int p1e, intp2e);void Attach(int coef, int expon, polynomial &pRear);
polynomial CreatePoly(intsize);intmain()
{
polynomial p1, p2, sump;
p1= CreatePoly(5);
p2= CreatePoly(8);
sump=PolyAdd(p1, p2);
cout<< "p1:" <
{
cout<< p1->coef << "x^" << p1->expon << '+';
p1= p1->link;
}
cout<
cout<< "p2:" <
{
cout<< p2->coef << "x^" << p2->expon << '+';
p2= p2->link;
}
cout<
cout<< "sump:" <
{
cout<< sump->coef << "x^" << sump->expon << '+';
sump= sump->link;
}
cout<
}
polynomial PolyAdd(polynomial p1, polynomial p2)
{
polynomial front, rear, temp;intsum;
rear= new npolynomial; //为方便表头插入,先产生一个临时空结点作为结果多项式链表头
front = rear; //由front记录结果多项式链表头结点
while ( p1 && p2 ) //当两个多项式都有非零项待处理时
{switch (Compare(p1->expon, p2->expon))
{case 1: //p1中的数据项指数较大
Attach(p1->coef, p1->expon, rear);
p1= p1->link;break;case -1: //p2中的数据项指数较大
Attach(p2->coef, p2->expon, rear);
p2= p2->link;break;case 0: //两数据项指数相等
sum = p1->coef + p2->coef;if (sum) //判断系数和是否为0
{
Attach(sum, p1->expon, rear);
}
p1= p1->link;
p2= p2->link;break;
}
}//将未处理完的另一个多项式的所有节点依次复制到结果多项式去
while( p1 )
{
Attach(p1->coef, p1->expon, rear);
p1= p1->link;
}while(p2)
{
Attach(p2->coef, p2->expon, rear);
p2= p2->link;
}
rear->link =NULL;
temp=front;
front= front->link; //使front指向结果多项式第一个非零项目
delete temp;returnfront;
}int Compare(int p1e, intp2e)
{if ( p1e >p2e )
{return 1;
}else if (p1e
{return -1;
}else{return 0;
}
}void Attach(int coef, int expon, polynomial &pRear)
{//由于本函数需要改变当前结果表达式尾项指针的值;//因此函数传递进来的是结点指针的地址,p指向尾项
polynomial p;
p= newnpolynomial;
p->coef =coef;
p->expon =expon;//将P指向的新结点插入到当前结果表达式尾项的后面
pRear->link =p;
pRear=p;
}
polynomial CreatePoly(int size) //降序建立多项式
{
polynomial head, p;
head=NULL;
p=NULL;for (int i = 0; i < size; i++)
{
p= newnpolynomial;
p->link =NULL;
p->coef =i;
p->expon =i;if ( head != NULL ) //在链表头部插入
{
p->link =head;
head=p;
}else{
head=p;
}
}returnhead;
}