多项式的乘法
#include<stdio.h>
#include<stdlib.h>
#define NULL 0
typedef struct PolyNode *Polynomial;
int length = 0;
struct PolyNode {
double coef;
int expon;
Polynomial link;
};
void Attach(double c, int e, Polynomial* pRear){
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->coef = c;
P->expon = e;
P->link = NULL;
(*pRear)->link = P;
*pRear = P;
}
Polynomial ReadPoly (void){
Polynomial P,Rear,t;
int n;
double c;
int e;
scanf("%d", &n);
P=(Polynomial)malloc(sizeof(struct PolyNode));
P->link=NULL;
Rear=P;
while(n--) {
scanf("%d %lf", &e, &c);
Attach(c, e, &Rear);
}
t=P;
P=P->link;
free(t);
return P;
}
Polynomial Mult( Polynomial P1, Polynomial P2 ){
Polynomial P, Rear, t1, t2, t;
double c;
int e;
if (!P1 || !P2) return NULL;
t1 = P1; t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode)); P->link = NULL;
Rear = P;
while (t2) { /* 先用P1的第1项乘以P2,得到P */
Attach(t1->coef*t2->coef, t1->expon+t2->expon, &Rear);
t2 = t2->link;
}
t1 = t1->link;
while (t1) {
t2 = P2; Rear = P;
while (t2) {
e = t1->expon + t2->expon;
c = t1->coef * t2->coef;
while (Rear->link && Rear->link->expon > e)
Rear = Rear->link;
if (Rear->link && Rear->link->expon == e) {
if (Rear->link->coef + c)
Rear->link->coef += c;
else {
t = Rear->link;
Rear->link = t->link;
free(t);
}
}
else {
t = (Polynomial)malloc(sizeof(struct PolyNode));
t->coef = c; t->expon = e;
t->link = Rear->link;
Rear->link = t; Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
t2 = P; P = P->link; free(t2);
return P;
}
void Pint(Polynomial P){
int flag = 0;
if (!P) { printf("0 0\n"); return;}
while(P){
if(!flag) flag = 1;
else{
printf(" ");
}
printf("%d %.1f", P->expon ,P->coef);
P = P->link;
}
printf("\n");
}
int main(){
Polynomial P1,P2,P;
P1 = ReadPoly();
P2 = ReadPoly();
//Pint(P1);
//Pint(P2);
P = Mult(P1,P2);
Pint(P);
return 0;
}