/*
多项式加法运算
使用链表实现
*/
#include <iostream>
using namespace std;
//使用不带头结点的单向链表,按照指数递减的顺序排列
typedef struct PolyNode
{
int coef; //系数
int expon; //指数
PolyNode *link; //指向下一个节点的指针
}*polynomial, npolynomial;
polynomial PolyAdd(polynomial p1, polynomial p2);
int Compare(int p1e, int p2e);
void Attach(int coef, int expon, polynomial &pRear);
polynomial CreatePoly(int size);
int main()
{
polynomial p1, p2, sump;
p1 = CreatePoly(5);
p2 = CreatePoly(8);
sump = PolyAdd(p1, p2);
cout << "p1:" << endl;
while (p1)
{
cout << p1->coef << "x^" << p1->expon << '+';
p1 = p1->link;
}
cout << endl;
cout << "p2:" << endl;
while (p2)
{
cout << p2->coef << "x^" << p2->expon << '+';
p2 = p2->link;
}
cout << endl;
cout << "sump:" << endl;
while ( sump )
{
cout << sump->coef << "x^" << sump->expon << '+';
sump = sump->link;
}
cout << endl;
return 0;
}
polynomial PolyAdd(polynomial p1, polynomial p2)
{
polynomial front, rear, temp;
int sum;
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;
return front;
}
int Compare(int p1e, int p2e)
{
if ( p1e > p2e )
{
return 1;
}
else if (p1e < p2e)
{
return -1;
}
else
{
return 0;
}
}
void Attach(int coef, int expon, polynomial &pRear)
{
//由于本函数需要改变当前结果表达式尾项指针的值;
//因此函数传递进来的是结点指针的地址,p指向尾项
polynomial p;
p = new npolynomial;
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 = new npolynomial;
p->link = NULL;
p->coef = i;
p->expon = i;
if ( head != NULL ) //在链表头部插入
{
p->link = head;
head = p;
}
else
{
head = p;
}
}
return head;
}