多项式的输入输出,多项式加减法以及空间的释放

发布时间 2023-04-04 11:34:16作者: 冉思银

题目:多项式的输出输入,加减法以及空间的释放

 

 

思路:

输入:输入系数,指数,用循环输入,当输入一个负指数的时候结束循环

输出:输出项:当系数为零,不用输出,当系数不为零,考虑指数:指数为0或1,指数为零只输出系数,指数为1的时候(如果系数为1,输出x,系数-1输出-x)

                          指数大于1(如果系数为1,输出x^和指数;系数为-1,输出-x^和指数),除以上情况外输出系数再输出x^再输出指数

          输出多项式:当知道如何输出各项后,用加号把各项连接起来就行

加法:pa,pb分别指向a多项式和b多项式,所指的项的指数相比较,谁的指数小就放入C多项式里面,同时被放入的那个项的指针指向下一项。如果指数相等,就把系数相加放入C里面,pa,pb同时指向下一项。如果有一个多项式为空,只需要把另一个不为空的多项式多余部分复制在C里面就行。C里面我们用一个函数来开辟所需要的空间。

减法:与加法很大程度相同,不同点就是A-B的时候,当b多项式里面的指数要比a的指数要小的时候,我们需要把b的项的系数变成相反数再放入 C里面。

空间的释放:用两个指针相互作用,cur指针和t指针,t用来存放cur的下一项,然后释放cur指向的空间,再cur=t,t再指向下一项,以此循环直到所有空间释放完成(cur==null)

 

 

 

 

具体代码如下:

#include<bits/stdc++.h>
using namespace std;
struct Term{
float coef;
int exp;
Term* link;
Term(float c,int e,Term* next=NULL){
coef=c;
exp=e;
link=next;
}//构造函数
Term* InsertAfter(float c,int e){
link=new Term(c,e,link);
return link;
}
friend ostream& operator<<(ostream&,const Term&);//输出项
};

class polynomial{
public:
polynomial(){
first=new Term(0,-1);
}
//polynomial(polynomial& R);
Term* first;
private:
friend ostream& operator<<(ostream& out,const polynomial& x);//输出多项式
friend istream& operator>>(istream& in,polynomial& x);//输入多项式
friend void Add(polynomial& A,polynomial& B,polynomial& C);//多项式加法
friend void Minus(polynomial& A,polynomial& B,polynomial& C);//多项式减法
friend void destory(polynomial &A);//释放new
};

ostream& operator<<(ostream& out,const Term& x){
if(x.coef==0.0)return out;//系数为0就不输出这个项
switch(x.exp){//分项数为常数,一次,和大于一次的情况
case 0: out<<x.coef;break;//常数直接输出
case 1: if(x.coef==1)out<<"X";else if(x.coef==-1)out<<"-X";else out<<x.coef<<"X";break;//系数为1或-1,特殊处理。不然输出x的系数再输出“X”
default: if(x.coef==1)out<<"X^"<<x.exp;else if(x.coef==-1)out<<"-X^"<<x.exp;else out<<x.coef<<"X^"<<x.exp;break;//系数为1或-1,特殊处理。不然输出x的系数,输出“X^”,输出x的次数
}
return out;
};

istream& operator>>(istream& in,polynomial& x){
Term* rear=x.first;
int c,e;
while(1){
cout<<"Input a term(coef,exp):"<<endl;
in>>c>>e;
if(e<0)break;
rear=rear->InsertAfter(c,e);//插入并指向下一项
}
return in;
};

ostream& operator<<(ostream&out,polynomial& x){
Term* current=x.first->link;//第一个项数
out<<"The polynomial is:"<<endl;
out<<*current;//输出首项
current=current->link;//第一个项数后面的项数
while(current!=NULL){//每个项数后面还有没有项
out<<"+"<<*current;//输出下一项
current=current->link;//指向下一项
}
out<<endl;return out;
};

void Add(polynomial& A,polynomial& B,polynomial& C){//将多项式A和多项式B相加的结果储存在多项式C中
Term* pa,*pb,*pc,*p; float temp;
pc=C.first;
pa=A.first->link;//A的首项
pb=B.first->link;//B的首项
while(pa!=NULL&&pb!=NULL){//A和B的下一个项同时存在
if(pa->exp==pb->exp){//A与B的某项次数相等
temp=pa->coef+pb->coef;//保存相加的系数
if(fabs(temp)>0.001)pc=pc->InsertAfter(temp,pa->exp);//如果系数不为0,就把这个项添加到c中
pa=pa->link;pb=pb->link;//A和B同时找下一项
}
else{
if(pa->exp<pb->exp){//A某项比B某项次数小
pc=pc->InsertAfter(pa->coef,pa->exp);//添加A的项
pa=pa->link;//A找下一项
}
else{//B某项比A某项次数小
pc=pc->InsertAfter(pb->coef,pb->exp);//添加B的项
pb=pb->link;//B找下一项
}
}
}
if(pa!=NULL)p=pa;//A还有项没加
else p=pb;//B还有项没加
while(p!=NULL){//P==NULL 说明加完了
pc=pc->InsertAfter(p->coef,p->exp);
p=p->link;
}
};

void Minus(polynomial& A,polynomial& B,polynomial& C){
Term* pa,*pb,*pc,*p; float temp;
pc=C.first;
pa=A.first->link;
pb=B.first->link;
while(pa!=NULL&&pb!=NULL){
if(pa->exp==pb->exp){
temp=pa->coef-pb->coef;
if(fabs(temp)>0.001)pc=pc->InsertAfter(temp,pa->exp);
pa=pa->link;pb=pb->link;
}
else{
if(pa->exp<pb->exp){
pc=pc->InsertAfter(pa->coef,pa->exp);
pa=pa->link;
}
else{
pc=pc->InsertAfter(-pb->coef,pb->exp);
pb=pb->link;
}
}
}
if(pa!=NULL){
p=pa;
while(p!=NULL){
pc=pc->InsertAfter(p->coef,p->exp);
p=p->link;
}
}
else{
p=pb;
while(p!=NULL){
pc=pc->InsertAfter(-p->coef,p->exp);
p=p->link;
}
}
};

void destory(polynomial &A){
Term* cur;
Term* t;
cur=A.first;
while(cur){//当cur不为空,为空则项数没有了
t=cur->link;//提前储存cur的下一项
free(cur);//释放cur所指向空间的内存
cur=t;//cur指向下一项
}
}

int main()
{
polynomial a,b,c,d;
cin>>a;
cin>>b;
cout<<a<<b;
Add(a,b,c);
cout<<c;
Minus(a,b,d);
cout<<d;
destory(a);
destory(b);
destory(c);
destory(d);
return 0;
}