感觉不是很完美的代码,虽然AC了,但是几个空的头节点都没删掉(下次一定)
比较重要的一个点是乘法和加法都要判断0,如果系数是0,这项就没了,具体怎么实现的看代码:
#include <iostream>
#include <cstdio>
using namespace std;
struct Node{
int coef;
int expon;
Node *next;
};
typedef Node* pnode;
pnode build(void);
void print(pnode head);
void attach(int c,int e,pnode *rear);
int compare(int e1,int e2);
pnode Polyadd(pnode head1,pnode head2);
pnode Polymult(pnode head1,pnode head2);
int main(){
pnode head1,head2,add,mult;
int n1,n2;
head1=build();
head2=build();
mult=Polymult(head1,head2);
if(mult==NULL || mult->next==NULL) cout<<"0 0"<<endl;
else print(mult);
add=Polyadd(head1,head2);
if(add==NULL || add->next==NULL) cout<<"0 0"<<endl;
else print(add);
}
pnode build(void){
int n,c,e;
cin>>n;
pnode head;
head=new Node;
head->next=NULL;
pnode r,p;
r=head;
while(n--){
p=new Node;
cin>>c>>e;
p->coef=c;
p->expon=e;
r->next=p;
p->next=NULL;
r=p;
}
return head;
}
void print(pnode head){
pnode p=head->next;
if(p==NULL || head==NULL){
return;
}
while(p){
cout<<p->coef<<" "<<p->expon;
if(p->next!=NULL) cout<<" ";
p=p->next;
}
cout<<endl;
}
void attach(int c,int e,pnode *rear){
pnode p=new Node;
p->coef=c;
p->expon=e;
p->next=NULL;
(*rear)->next=p;
*rear=p;
}
int compare(int e1,int e2){
if(e1>e2) return 1;
if(e1<e2) return -1;
if(e1==e2) return 0;
}
pnode Polyadd(pnode head1,pnode head2){
pnode p1,p2,front,rear;
front = new Node;
rear = front;
p1=head1->next;
p2=head2->next;
if(p1==NULL && p2==NULL){
return NULL;
}
while(p1&&p2){
switch(compare(p1->expon,p2->expon)){
case 1:
attach(p1->coef,p1->expon,&rear);
p1=p1->next;
break;
case -1:
attach(p2->coef,p2->expon,&rear);
p2=p2->next;
break;
case 0:
int c=p1->coef+p2->coef;
if(c!=0){
attach(c,p1->expon,&rear);
}
p1=p1->next;
p2=p2->next;
break;
}
}
for(;p1;p1=p1->next) attach(p1->coef,p1->expon,&rear);
for(;p2;p2=p2->next) attach(p2->coef,p2->expon,&rear);
rear->next=NULL;
return front;
}
pnode Polymult(pnode head1,pnode head2){
pnode front,rear,p1,p2,p;
int coef,expon;
p1=head1->next;
p2=head2->next;
if(p1==NULL || p2==NULL){
return NULL;
}
front=new Node;
front->next=NULL;
rear=front;
while(p2){
attach(p1->coef*p2->coef,p1->expon+p2->expon,&rear);
p2=p2->next;
}
p1=p1->next;
while(p1){
p2=head2->next;
rear=front;
while(p2){
expon = p1->expon+p2->expon;
coef = p1->coef*p2->coef;
while(rear->next && rear->next->expon>expon) rear=rear->next;
if(rear->next && rear->next->expon==expon){
if(rear->next->coef+coef==0){//要判断这项是否是0
p = rear->next;
rear->next=p->next;
delete p;
}else{
rear->next->coef+=coef;
}
}else{
p = new Node;
p->coef=coef;
p->expon=expon;
p->next=rear->next;
rear->next=p;
rear=p;
}
p2=p2->next;
}
p1=p1->next;
}
return front;
}