7-1 一元多项式的乘法与加法运算 (20分)(链表实现)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例:
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
代码(C++)
#include<iostream>
using namespace std;
typedef struct LNode
{
int a;//系数
int b;//指数
struct LNode *next;
} LNode,*Linklist;
void CreatList(Linklist &L);
void CreatList(Linklist &L)
{
L=new LNode;
L->next=NULL;
Linklist p,q;
p=L;
int n;
cin>>n;
for(int i=0; i<n; i++)
{
q=new LNode;
cin>>q->a>>q->b;
q->next=NULL;
p->next=q;
p=p->next;
}
p->next=NULL;
}
void print(Linklist L)
{
Linklist p;
p=L->next;
if(L->next==NULL)
cout<<"0 0"<<endl;
else
{
while(p->next)
{
cout<<p->a<<" "<<p->b<<" ";
p=p->next;
}
cout<<p->a<<" "<<p->b<<endl;
}
}
Linklist Plus(Linklist La,Linklist Lb)//容易出问题的地方就是不能直接让Lc的指针指向La去修改La的数据,下一步多项式乘法还会用到La
{
Linklist pa,pb,pc,Lc;
Linklist q;
Lc=new LNode;
Lc->next=NULL;
pc=Lc;
pa=La->next;
pb=Lb->next;
if(La->next==NULL&&Lb->next==NULL)
return Lc;
else if(La->next==NULL&&Lb->next!=NULL)
Lc->next=Lb->next;
else if(La->next!=NULL&&Lb->next==NULL)
Lc->next=La->next;
else
{
while(pa&&pb)
{
if(pa->b==pb->b)
{
if(pa->a+pb->a==0)
{
pa=pa->next;
pb=pb->next;
}
else
{
q=new LNode;
q->a=pa->a+pb->a;
q->b=pa->b;
pc->next=q;
pc=pc->next;
pa=pa->next;
pb=pb->next;
}
}
else if(pa->b>pb->b)
{
q=new LNode;
q->a=pa->a;
q->b=pa->b;
pc->next=q;
pc=pc->next;
pa=pa->next;
}
else
{
q=new LNode;
q->a=pb->a;
q->b=pb->b;
pc->next=q;
pc=pc->next;
pb=pb->next;
}
}
while(pa)
{
q=new LNode;
q->next=NULL;
q->a=pa->a;
q->b=pa->b;
pc->next=q;
pc=pc->next;
pa=pa->next;
}
while(pb)
{
q=new LNode;
q->next=NULL;
q->a=pb->a;
q->b=pb->b;
pc->next=q;
pc=pc->next;
pa=pb->next;
}
}
return Lc;
}
Linklist mutiply(Linklist La,Linklist Lb)
{
Linklist Ld,pa,pb,t;
Ld=new LNode;
Ld->next=NULL;
pa=La->next;
if(!La||!Lb)
return Ld;
while(pa)
{
pb=Lb->next;
Linklist q,pt,Ltmp;
Ltmp=new LNode;
pt=Ltmp;
while(pb)
{
q=new LNode;
q->next=NULL;
q->a=pa->a*pb->a;
q->b=pa->b+pb->b;
pb=pb->next;
pt->next=q;
pt=pt->next;
}
pa=pa->next;
Ld=Plus(Ltmp,Ld);
delete Ltmp;
}
return Ld;
}
int main()
{
Linklist La,Lb,Lc,Ld;
CreatList(La);
CreatList(Lb);
Ld=mutiply(La,Lb);
Lc=Plus(La,Lb);
print(Ld);
print(Lc);
}