02-线性结构2 一元多项式的乘法与加法运算 (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
//单链表实现,刚开始借鉴了一个博主的程序,后修改。
#include<bits/stdc++.h>
using namespace std;
typedef struct Node* polynode;
struct Node{
int c;
int e;
polynode next;
};
//polynode polyread(){
// polynode p,rear,tmp;
// p=(polynode)malloc(sizeof(struct Node));
// p->c=p->e=0;
// p->next=NULL;
// rear=p;
// int n,c1,e1;
// cin>>n;
// while(n--){
// cin>>c1>>e1;
// tmp=(polynode)malloc(sizeof(struct Node));
// tmp->c=c1;
// tmp->e=e1;
// rear->next=tmp;
// tmp->next=NULL;
// rear=tmp;
// }
// return p;
//}
polynode polyread()
{
polynode p,tmp,rear;
int n,c,e;
scanf("%d",&n);
p = (polynode)malloc(sizeof(struct Node));
p->c=p->e=0;
p->next=NULL;
rear = p;
if(n==0){
return p;
}
while(n--){
scanf("%d %d",&c,&e);
tmp = (polynode)malloc(sizeof(struct Node));
tmp->c=c;
tmp->e=e;
rear->next=tmp;
tmp->next=NULL;
rear=tmp;
}
return p;
}
int printpoly(polynode p)
{
int flag=0;
if(!(p->next)){
printf("0 0\n");
return 0;
}else{
p=p->next;
}
while(p){
if(!flag){
flag+=1;
}else{
printf(" ");
}
printf("%d %d",p->c,p->e);
p=p->next;
}
printf("\n");
return 0;
}
//int printpoly(polynode p){
// int flag;
// if(!(p->next)){
// cout<<"0 0"<<endl;
// return 0;
// }else{
// p=p->next;
// }
// while(p){
// if(!flag){
// flag=1;
// }else{
// cout<<" ";
// }
// cout<<p->c<<" "<<p->e;
// p=p->next;
// }
// cout<<endl;
// return 0;
//}
//之所以使用*prear指针是因为其需要使用自传递,使得rear的值在attach中发生改变
void attach(int c,int e,polynode *prear){
polynode tmp;
tmp=(polynode)malloc(sizeof(struct Node));
tmp->c=c;
tmp->e=e;
tmp->next=NULL;
(*prear)->next=tmp;
*prear=tmp;
}
polynode mult(polynode p1,polynode p2){
polynode p,rear,t1,t2,t;
int c,e;
t1=p1->next;
t2=p2->next;
p=(polynode)malloc(sizeof(struct Node));
p->c=p->e=0;
p->next=NULL;
rear=p;
if(!t1||!t2) return p;
while(t2){
c = t1->c*t2->c;
e = t1->e+t2->e;
attach(c,e,&rear);
t2 = t2->next;
}
t1=t1->next;
while(t1){
t2=p2->next;rear=p;
while(t2){
c = t1->c*t2->c;
e = t1->e+t2->e;
while(rear->next&&(rear->next->e>e)){
rear=rear->next;
}
if(rear->next&&rear->next->e==e){
if(rear->next->c+c){
rear->next->c+=c;
}else{
t=rear->next;
rear->next=t->next;
free(t);
}
}else{
t=(polynode)malloc(sizeof(struct Node));
t->c=c;
t->e=e;
// rear->next=t;
// rear=t;
t->next=rear->next;
rear->next=t;
rear=rear->next;
}
t2=t2->next;
}
t1=t1->next;
}
return p;
}
//polynode add(polynode p1,polynode p2){
// polynode p,rear,t1,t2,tmp;
// p=(polynode)malloc(sizeof(struct Node));
// p->next=NULL;
// p->c=p->e=0;
// rear = p;
// t1=p1->next;
// t2=p2->next;
// while(t1 || t2){
// if(t1->e>t2->e){
// rear->next=t2;
// rear=t2;
// t2=t2->next;
// }else if(t1->e==t2->e){
// if(t1->c+t2->c==0){
// t1=t1->next;
// t2=t2->next;
// }else{
// tmp=(polynode)malloc(sizeof(struct Node));
// tmp->c=t1->c+t2->c;
// tmp->e=t1->e+t2->e;
// t1=t1->next;
// t2=t2->next;
// rear->next=tmp;
// rear=tmp;
// }
// }else{
// rear->next=t1;
// rear=t1;
// t1=t1->next;
// }
// }
// for(;t1;t1=t1->next) attach(t1->c,t1->e,&rear);
// for(;t2;t2=t2->next) attach(t2->c,t2->e,&rear);
// rear->next=NULL;
// return p;
//}
int compare(int a,int b)
{
if(a>b)return 1;
if(a==b)return 0;
return -1;
}
polynode add(polynode p1, polynode p2)
{
polynode p,rear,tmp;
int sum;
p = (polynode)malloc(sizeof(struct Node));
p->next=NULL;
rear=p;
p1=p1->next;
p2=p2->next;
while(p1&&p2)
switch(compare(p1->e,p2->e)){
case 1:
attach(p1->c,p1->e,&rear);
p1=p1->next;
break;
case -1:
attach(p2->c,p2->e,&rear);
p2=p2->next;
break;
case 0:
sum = p1->c+p2->c;
if(sum)attach(sum,p1->e,&rear);
p1=p1->next;
p2=p2->next;
break;
}
for(;p1;p1=p1->next)attach(p1->c,p1->e,&rear);
for(;p2;p2=p2->next)attach(p2->c,p2->e,&rear);
rear->next=NULL;
return p;
}
int main(){
freopen("1.txt","r",stdin);
polynode mul,ad,p1,p2;
p1=polyread();
p2=polyread();
mul= mult(p1,p2);
ad=add(p1,p2);
printpoly(mul);
printpoly(ad);
return 0;
}