题目
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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<iostream>
#include<malloc.h>
using namespace std;
struct PolyNode{
int coef;//系数
int expon;//指数
struct PolyNode* link;
};
typedef struct PolyNode *Polynomial;
void Attach(int c,int e,Polynomial &Rear){//Rear是一个引用
if(c){
Polynomial P;
P=(Polynomial)malloc(sizeof(PolyNode));
P->coef=c;P->expon=e;P->link=NULL;
Rear->link=P;
Rear=P;
}
}
Polynomial ReadPoly(){
int c,e,N;
Polynomial Rear,Temp;
Polynomial P;//头结点 空节点
P=(Polynomial)malloc(sizeof(PolyNode));
P->link=NULL; Rear=P;
scanf("%d",&N);
while(N--){
scanf("%d %d",&c,&e);
Attach(c,e,Rear);
}
Temp=P;
P=P->link;
free(Temp);
return P;
}
int Compare(int a,int b){
if(a>b) return 1;
else if(a<b) return -1;
else return 0;
}
Polynomial PolyAdd(Polynomial P1,Polynomial P2){
Polynomial Front,Rear,Temp;
Rear=(Polynomial)malloc(sizeof(PolyNode));
Front=Rear;
while(P1&&P2)
switch(Compare(P1->expon,P2->expon)){
case 1:
Attach(P1->coef,P1->expon,Rear);
P1=P1->link;break;
case -1:
Attach(P2->coef,P2->expon,Rear);
P2=P2->link;break;
case 0:
if(P1->coef+P2->coef!=0)
Attach(P1->coef+P2->coef,P1->expon,Rear);
P1=P1->link;P2=P2->link;
break;
}
for(;P1;P1=P1->link) Attach(P1->coef,P1->expon,Rear);
for(;P2;P2=P2->link) Attach(P2->coef,P2->expon,Rear);
Rear->link=NULL;
Temp=Front;
Front = Front->link;
free(Temp);//释放无用的头节点
return Front;
}
Polynomial PolyMuti(Polynomial P1,Polynomial P2){
Polynomial p1,p2,Front,Rear,Temp;
p1=P1;p2=P2;
Rear=(Polynomial)malloc(sizeof(PolyNode));
Rear->expon=2001;//方便第一项插在后面
Front=Rear;
int a=0;
while(p1){
p2=P2;
while(p2){
int c=p1->coef*p2->coef,e=p1->expon+p2->expon;
if(c!=0){
if(e<Rear->expon)
Attach(c,e,Rear);
else{
Polynomial i = Front->link;
while(i->link){
//找到插入的位置
if(e>i->link->expon){
Polynomial tempAdd;
tempAdd=(Polynomial)malloc(sizeof(PolyNode));
tempAdd->coef=c;tempAdd->expon=e;tempAdd->link=i->link;
i->link=tempAdd;
break;
}
else if(e==i->link->expon){
i->link->coef +=c;
if(i->link->coef==0&&i->link->link!=0){
i->link=i->link->link; free(i->link);
}
else if(i->link->coef==0&&i->link->link==0){
Rear=i;free(i->link);
}
break;
}
i=i->link;
}
}
}
p2=p2->link;
}
p1=p1->link;
}
Rear->link=NULL;
Temp=Front;
Front = Front->link;
free(Temp);//释放无用的头节点
return Front;
}
/*void DelZero(Polynomial P){
if(P->coef==0||P->expon==0){
}
while(P->link){
if(P->link->coef==0||P->link->expon==0) P->link=P->link->link;
P=P->link;
}
}*/
void PrintPoly(Polynomial P){
int i=0;
int tag = 0;
Polynomial cell=P;
if(cell==NULL) cout<<"0 0";
while(cell){
if(tag == 1)
cout<<" "<<cell->coef<<" "<<cell->expon;
else {cout<<cell->coef<<" "<<cell->expon;
tag=1;
}
cell=cell->link;
}
cout<<endl;}
int main(){
Polynomial P1,P2,P3,P4;
P1 = ReadPoly();
P2 = ReadPoly();
P3 = PolyMuti(P1,P2);
PrintPoly(P3);
P4 = PolyAdd(P1,P2);
PrintPoly(P4);
return 0;
}
总结与反思
- 结点指针的写法
typedef struct PolyNode *Polynomial;
- 通过写 Attach函数理解了引用是怎么一回事,Rear本身就是一个指针,存储的是一个地址,要改变存储的地址,可以使用引用。
void Attach(int c,int e,Polynomial &Rear)
//Rear是一个引用
- 另一种方法是使用一个指针pRear指向Rear(pRear实际上就是指针的指针),Rear没办法自己改自己的地址,但是需要修改它的地址(那么,*pRear是Rear的地址,只要使得 *pRear = P 就行)
因此使用Attach函数的时候,需要传进来Rear指针自己的地址
Attcch(c,e,&Rear);
- 相乘:
将乘法运算转化为加法运算。
P1多项式的每一项单独拿出来,去跟P2的所有项相乘,乘出来的结果加到结果多项式里面,重复多次。