# 02-线性结构1 一元多项式的乘法与加法运算

02-线性结构1 一元多项式的乘法与加法运算   (20分)

### 输入样例:

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 <stdio.h>
#include <stdlib.h>

typedef struct node{
int coefficient;
int exponent;
struct node * next;
} PolyNode, *Polynomial;

void Attach(int c, int e, Polynomial * Rear);
Polynomial MultPoly(Polynomial P1, Polynomial P2);
void PrintPoly(Polynomial P);

int main(int argc, char const *argv[])
{
Polynomial Poly1, Poly2, PolySum, PolyMul;

PolyMul = MultPoly(Poly1, Poly2);
PrintPoly(PolyMul);
PrintPoly(PolySum);

return 0;
}

{
Polynomial P, Rear, temp;
P = (PolyNode*)malloc(sizeof(PolyNode));
P->next = NULL;
Rear = P;
int N, c, e;
scanf("%d", &N);
while(N--){
scanf("%d %d", &c, &e);
Attach(c, e, &Rear);
}
temp = P;
P = P->next;
free(temp);
return P;
}

void Attach(int c, int e, Polynomial * pRear)
{
Polynomial P;
P = (PolyNode*)malloc(sizeof(PolyNode));
P->coefficient = c;
P->exponent = e;
P->next = NULL;
(*pRear)->next = P;
*pRear = P;
}

Polynomial MultPoly(Polynomial P1, Polynomial P2)
{
Polynomial P, temp1, temp2, Rear, temp;
int c, e;
if(!P1 || !P2)
return NULL;
temp1 = P1;
temp2 = P2;
P = (PolyNode*)malloc(sizeof(PolyNode));
P->next = NULL;
Rear = P;
while(temp2){
c = temp1->coefficient * temp2->coefficient;
e = temp1->exponent + temp2->exponent;
if(c != 0){
Attach(c, e, &Rear);
temp2 = temp2->next;
}
}
temp1 = temp1->next;
while(temp1){
temp2 = P2, Rear = P;
while(temp2){
c = temp1->coefficient * temp2->coefficient;
e = temp1->exponent + temp2->exponent;
if(c != 0){
while(Rear->next && Rear->next->exponent > e)
Rear = Rear->next;
if(Rear->next && Rear->next->exponent == e){
if(Rear->next->coefficient + c)
Rear->next->coefficient += c;
else{
temp = Rear->next;
Rear->next = temp->next;
free(temp);
}
}
else{
temp = (PolyNode*)malloc(sizeof(PolyNode));
temp->coefficient = c;
temp->exponent = e;
temp->next = Rear->next;
Rear->next = temp;
Rear = Rear->next;
}
temp2 = temp2->next;
}
}
temp1 = temp1->next;
}
temp = P;
P = P->next;
free(temp);
return P;
}

{
Polynomial P, temp1, temp2, Rear, temp;
if(!P1 && !P2){
if(!P1)
return P2;
else
return P1;
}
P = (PolyNode*)malloc(sizeof(PolyNode));
P->next = NULL;
Rear = P;
temp1 = P1;
temp2 = P2;
while(temp1 && temp2){
if(temp1->exponent > temp2->exponent){
if(temp1->coefficient){
Attach(temp1->coefficient, temp1->exponent, &Rear);
}
temp1 = temp1->next;
}
else if(temp1->exponent == temp2->exponent){
if(temp1->coefficient + temp2->coefficient){
Attach(temp1->coefficient + temp2->coefficient, temp1->exponent, &Rear);
}
temp1 = temp1->next;
temp2 = temp2->next;
}
else{
if(temp2->coefficient){
Attach(temp2->coefficient, temp2->exponent, &Rear);
}
temp2 = temp2->next;
}
}
while(temp1){
Attach(temp1->coefficient, temp1->exponent, &Rear);
temp1 = temp1->next;
}
while(temp2){
Attach(temp2->coefficient, temp2->exponent, &Rear);
temp2 = temp2->next;
}
temp = P;
P = P->next;
free(temp);
return P;
}

void PrintPoly(Polynomial P)
{
int flag = 0;
if(!P){
printf("0 0");
}
while(P){
if (!flag)
flag = 1;
else
printf(" ");
printf("%d %d", P->coefficient, P->exponent);
P = P->next;
}
printf("\n");
}


09-22 990

09-22 5313

09-25 1226

11-10 1084

10-06 1051

10-04 1335

03-12 2773

09-09 4215

10-03 1971

12-31 153