#include<iostream>
using namespace std;
template<class T>
struct Node
{
float coef;//系数
int exp;//指数
Node<T> *next;//指针
};
template<class T>
class Linklist
{
Node<T> *head;
public:
Linklist(); //不含参数构造
Linklist(T a[], T b[], int i);//含参
~Linklist(); // 析构函数
void output();//输出
void sort();//排序
void add(Linklist<T> &b);//多项式+
void sub(Linklist<T> &b);//多项式-
};
template<class T>
void Linklist<T>::sort()
{
Node<T> *p = head->next;
Node<T> *q = p->next;
while (p&&q)
{
if (p->exp < q->exp)
{
q = q->next;
p = p->next;
}
else if (p->exp == q->exp)
{
p->coef = p->coef + q->coef;
p->next = q->next;
delete q;
q = p->next;
}
else
{
T a = p->coef;
T b = p->exp;
p->coef = q->coef;
p->exp = q->exp;
q->coef = a;
q->exp = b;
p = q;
q = q->next;
}
}
}
template<class T>
void Linklist<T>::add(Linklist<T> &b)
{
Node<T> *pre_pa = this->head; Node<T> *pa = pre_pa->next;
Node<T> *pre_pb = b.head; Node<T> *pb = pre_pb->next;
while (pa&&pb)
{
if (pa->exp < pb->exp)//如果指数小于指数b
{
pre_pa = pa;
pa = pa->next;
}
else if (pa->exp == pb->exp)//等于
{
pa->coef = pa->coef + pb->coef;
if (pa->coef == 0)//系数相加为0
{
pre_pa->next = pa->next;
delete pa;
pa = pre_pa->next;
}
else//不为0
{
pre_pa = pa;
pa = pa->next;
}
pre_pb->next = pb->next;//删除pb结点
delete pb;
pb = pre_pb->next;
}
else//pb插入pa前
{
Node<T> *r = pb->next;
pre_pa->next = pb;
pb->next = pa;
pre_pa = pb;
pb = r;
pre_pb->next = pb;
}
}
if (pb)
{
pa->next = pb;
delete b.head;
}
}
template<class T>
void Linklist<T>::sub(Linklist<T> &b)
{
Node<T> *pre_pa = this->head; Node<T> *pa = pre_pa->next;
Node<T> *pb = b.head->next; Node<T> *pre_pb = b.head;
while (pa&&pb)
{
if (pa->exp < pb->exp)//如果指数a小于指数b
{
pre_pa = pa;
pa = pa->next;
}
else if (pa->exp == pb->exp)//等于
{
pa->coef = pa->coef - pb->coef;
if (pa->coef == 0)//系数相减为0
{
pre_pa->next = pa->next;
delete pa;
pa = pre_pa->next;
}
else//不为0
{
pre_pa = pa;
pa = pa->next;
}
pre_pb->next = pb->next;//删除pb结点
delete pb;
pb = pre_pb->next;
}
else//pb插入pa前
{
Node<T> *r = pb->next;
pre_pa->next = pb;
pb->coef = -pb->coef;
pb->next = pa;
pre_pa = pb;
pb = r;
pre_pb->next = pb;
}
}
if (pb)
{
pre_pa->next = pb;
delete b.head;
}
}
template<class T>
Linklist<T>::Linklist()
{
head = new Node<T>;
head->next = NULL;
}
template<class T>
Linklist<T>::Linklist(T a[], T b[], int i)
{
head = new Node<T>;
Node<T> *p = head;
for (int j = 0; j < i; j++)
{
Node<T> *s = new Node<T>;
s->coef = a[j];
s->exp = b[j];
p->next = s;
p = s;
;
}
p->next = NULL;
}
template<class T>
Linklist<T>::~Linklist()
{
Node<T> *p = head;
while (p)
{
Node<T> *q = p;
p = p->next;
delete q;
}
head = NULL;
}
template<class T>
void Linklist<T>::output()
{
Node<T> *p;
p = head->next;
while (p)
{
cout << "(" << p->coef << "," << p->exp << ")";
p = p->next;
if (p)
cout << "+";
}
cout << endl;
}
int main()
{
int a[4] = { 3,7,5,9 };
int b[4] = { 1,0,17,18 };
int c[3] = { -9,8,22 };
int d[3] = { 8,1,7 };
Linklist<int> x1(a, b, 4), x2(c, d, 3), x3(a, b, 4), x4(c, d, 3);
cout << "原多项式x1为";
x1.output();
cout << "原多项式x2为";
x2.output();
x1.sort();
x2.sort();
cout << "多项式相加为";
x1.add(x2);
x1.output();
x3.sort();
x4.sort();
cout << "多项式相减为";
x3.sub(x4);
x3.output();
system("pause");
return 0;
}
测试结果: