一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和

输入:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0


对于这个题目,加的过程比较简单,乘的话“以指数递降的方式”则需要思考一下,我的办法是:先用第一项乘以第二个多项式,得到一个多项式 ,然后以这个多项式为基础,调加法函数,一次一次的加上第一个多项式第二项乘第二个多项式,第一个多项式第三项乘第二个多项式。。等的结果,这样就可以达到“以指数递降的方式”的目的

///一元多项式的乘法和加法运算/////////////
#include <iostream>
using namespace std;


typedef struct node
{
int coef;
int expon;
struct node * Next;
}PolyNode, *Polynomial;

void Attach(int c,int e,PolyNode** rear_) /如果是*rear 会导致p=rear,p跟着rear跑,所以最好的办法是让一个指针来指向rear,
//从而使得改变rear不影响p,从而达到解耦合的目的
{
PolyNode* P0;
P0=(PolyNode*)malloc(sizeof(node));
P0->coef=c;
P0->expon=e;
P0->Next=0;
(*rear_)->Next=P0; //初始化时 rear=p 不好理解,一旦形成一个链,就很好理解了 rear 是一个链表,p0是另一个链表
(*rear_)=P0;
}


PolyNode* read()
{
PolyNode* P,*rear;
int N,c,e;
P=(PolyNode*)malloc(sizeof(node));
P->Next=0;
rear=P;   //拷贝指针
cin>>N;

while(N)
{
cin>>c>>e;
Attach(c,e,&rear);
N--;
}
PolyNode* temp; //目的是删除开头的那个空结点
temp=P;
P=P->Next;
free(temp);
return P;
// cout<<P->coef<<endl;
}


 PolyNode* add(PolyNode* p1,PolyNode* p2)
{
PolyNode* rear,*front,*temp;
int sum(0);
// p1=read();
// p2=read();
front=(PolyNode*)malloc(sizeof(PolyNode));
rear=front;
front->Next=0;
// while(p)
// {
//  cout<<p->coef<<endl;
//  cout<<p->expon<<endl;
//  p=p->Next;
// }
while(p1 && p2)
{

 if(p1->expon < p2->expon)
{
Attach(p2->coef,p2->expon,&rear);
p2=p2->Next;
// cout<<"<"<<endl;
}
else if(p1->expon > p2->expon)
{
Attach(p1->coef,p1->expon,&rear);
p1=p1->Next;
// cout<<">"<<endl;


}
else if(p1->expon == p2->expon)
{
sum=p1->coef+p2->coef;
if(sum)
{
Attach(sum,p1->expon,&rear);
p1=p1->Next;
p2=p2->Next;
// cout<<sum<<endl;
}
else
{
p1=p1->Next;
p2=p2->Next;
}
}

}
for(;p1;p1=p1->Next) Attach(p1->coef,p1->expon,&rear); //p1不空,P2空
for(;p2;p2=p2->Next) Attach(p2->coef,p2->expon,&rear); //p2不空,P1空
rear->Next=NULL;
temp=front;
front=front->Next;
free(temp);
return front;
}


PolyNode* read2()
{
PolyNode* rear,*p1,*p2,*temp;
int N,c,e;
p1=(PolyNode*)malloc(sizeof(PolyNode));
rear=p1;
p1->Next=0;
cin>>N;
while(N)
{
cin>>c>>e;
PolyNode* P0;
P0=(PolyNode*)malloc(sizeof(PolyNode));
P0->coef=c;
P0->expon=e;
P0->Next=0;
rear->Next=P0;
rear=P0;
N--;
}
// front_=add();
temp=p1;
p1=p1->Next;
free(temp);
return p1;
}
int main()
{
PolyNode* front,*front1,*front2,*front3,*rear,*rear1,*rear2,*rear3,*p1,*p2,*temp1,*temp2,*temp3;
PolyNode* front_;
PolyNode* front__;
front=(PolyNode*)malloc(sizeof(PolyNode));
rear=front;
p1=read2();
p2=read2();
// front1=front;
temp1=p1; //之所以采用临时变量是因为指针只能单向的执行一个轮回,不会反过来再访问
temp2=p2;
while(temp2) //先得到一个初始的链表,好在以后操作
{
PolyNode* multiply;
multiply=(PolyNode*)malloc(sizeof(PolyNode));
multiply->coef=temp1->coef * temp2->coef;
multiply->expon=temp1->expon + temp2->expon;
multiply->Next=0;
rear->Next=multiply;
rear=multiply;
temp2=temp2->Next;


// cout<<"p2"<<endl;

}
temp1=temp1->Next;
// cout<<"p1"<<endl;
PolyNode* temp;
temp=front;
front=front->Next;
free(temp);


while(temp1)

{
front2=(PolyNode*)malloc(sizeof(PolyNode)); //再创建一个链表,用p1的第二项去乘以p2的所有的项,好方便后面的加运算
rear2=front2;
temp3=p2; //再次求解。 此时temp1 指向了下一个
while(temp3)
{
PolyNode* multiply;
multiply=(PolyNode*)malloc(sizeof(PolyNode));
multiply->coef=temp1->coef * temp3->coef;
multiply->expon=temp1->expon + temp3->expon;
multiply->Next=0;
rear2->Next=multiply;
rear2=multiply;
temp3=temp3->Next;


// cout<<"p2"<<endl;

}
temp1=temp1->Next;
// cout<<"p1"<<endl;
// PolyNode* temp;
temp=front2;
front2=front2->Next;
free(temp);


front=add(front,front2);
}
while(front)
{
cout<<front->coef<<" ";
cout<<front->expon<<" ";
front=front->Next;
}
cout<<endl;
// PolyNode* front__;
front__=add(p1,p2);
while(front__)
{
cout<<front__->coef<<" ";
cout<<front__->expon<<" ";
front__=front__->Next;
}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值