版权声明:转载请注明出处!不注明也无所谓,嘿嘿。 https://blog.csdn.net/qq_15020543/article/details/82895612
链表多项式还算比较简单的。
步骤分为 1.创建链表
2.链表排序
3.链表的自我化简
4.进行运算
5.进行自我化简(仅乘法需要多这一步)
首先是尾插法创建两个链表,做加法运算。X前为系数,X后为指数。
然后是尾插法创建两个链表,做加法运算。
附上代码
#include <iostream>
using namespace std;
struct Node {
int coef;
int exp;
Node*next;
};
class Poly {
private:
Node*Head;
public:
Poly();
void T_Create(int n);
int TestEmpty();
int Compare(int a,int b);
void Port();
void Simplify();
void Add(Poly &_poly);
void Multiply(Poly &_poly);
void ShowResult();
};
Poly::Poly() {
Head = new Node;
Head->next = NULL;
}
void Poly::T_Create(int n) {
Node *p = Head;
while(n--) {
Node*s = new Node;
cin>>s->coef>>s->exp;
s->next = p->next;
p->next = s;
p = s;
}
//先排序,后化简
Port();
Simplify();
ShowResult();
}
void Poly::Port() { //排序(TODO:的同时进行自我化简 )
Node *p=Head->next,*s=p->next;
while(p) {
s=p->next;
while(s) {
if(p->exp > s->exp) {
int x,y;
x=p->coef;
p->coef=s->coef;
s->coef=x;
y=p->exp;
p->exp=s->exp;
s->exp=y;
}
s=s->next;
}
p=p->next;
}
}
void Poly::Simplify() {
Node *p=Head->next;
while(p&&p->next) {
if(p->exp==p->next->exp) {
p->coef+=p->next->coef;
Node *ps=new Node;
ps=p->next;
p->next=ps->next;
delete ps;
} else {
p=p->next;
}
}
}
int Poly:: Compare(int a,int b) {
if(a==b)
return 1;
else
return-1;
}
void Poly::Add(Poly &_poly) {
if(TestEmpty()==0) {
cout<<"请先创建链表"<<endl;
return ;
}
float sum=0;
Node *pa = Head,
*pb = _poly.Head,
*qa=Head->next,
*qb=_poly.Head->next;
while(qa!=NULL&&qb!=NULL) {
if(qa->exp<qb->exp) {
pa=qa;
qa=qa->next;
} else if(qa->exp>qb->exp) {
pb->next=qb->next;
qb->next=qa;
pa->next=qb;
pa=qb;
qb=pb->next;
} else {
sum=qa->coef+qb->coef;
if(sum==0) {
pa->next=qa->next;
delete qa;
qa=pa->next;
pb->next=qb->next;
delete qb;
qb=pb->next;
} else {
qa->coef=sum;
pa=qa;
qa=qa->next;
pb->next=qb->next;
delete qb;
qb=pb->next;
}
}
}
if(qb!=NULL) {
pa->next=qb;
}
}
void Poly::Multiply(Poly &_poly) {
if(TestEmpty()==0) {
cout<<"请先创建链表"<<endl;
return ;
}
Poly tempPoly1;
Node *pa = Head->next,
*pb = _poly.Head->next,
*t1=tempPoly1.Head;
while(pa) {
pb=_poly.Head->next;
while(pb) {
Node *temp=new Node;
temp->coef=(pa->coef)*(pb->coef);
temp->exp = pa->exp+pb->exp;
temp->next = t1->next;
t1->next=temp;
pb = pb->next;
t1=t1->next;
}
pa=pa->next;
}
tempPoly1.Port();
tempPoly1.Simplify();
pa = Head;
t1 = tempPoly1.Head->next;
while(t1) {
//当还没超过原链表长度时
if(pa->next) {
pa->next->coef=t1->coef;
pa->next->exp=t1->exp;
}
//当超过原链表长度的时候
else {
Node *temp=new Node;
temp->coef=t1->coef;
temp->exp=t1->exp;
temp->next=pa->next;
pa->next=temp;
}
pa=pa->next;
t1=t1->next;
}
}
void Poly::ShowResult() {
Node*p;
p = Head->next;
while(p) {
if(p->coef>0)
cout<<"+";
cout<<p->coef<<"X"<<p->exp;
p = p->next;
}
cout<<endl;
}
int Poly:: TestEmpty() {
Node *p;
p=Head->next;
int count=0;
while(p) {
count++;
p=p->next;
}
return count;
}
int main() {
Poly poly,_poly;
poly.T_Create(2);
_poly.T_Create(3);
poly.Add(_poly);
poly.ShowResult();
return 0;
}