#include <stdio.h>
#include <stdlib.h>
typedef struct PolyNode
*Polynomial
;
struct PolyNode
{
int coef
;
int expon
;
Polynomial link
;
};
void Attach(int 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()
{
Polynomial P
,Rear
,t
;
int c
,e
,N
;
scanf("%d",&N
);
P
=(Polynomial
)malloc(sizeof(struct PolyNode
));
P
->link
=NULL;
Rear
=P
;
while(N
--)
{
scanf("%d %d",&c
,&e
);
Attach(c
,e
,&Rear
);
}
t
=P
; P
=P
->link
; free(t
);
return P
;
}
Polynomial
Add(Polynomial P1
,Polynomial P2
)
{
Polynomial P
,temp
,t1
,t2
;
t1
=P1
; t2
=P2
;
P
=(Polynomial
)malloc(sizeof(struct PolyNode
));
P
->link
=NULL;
temp
=P
;
while(t1
&&t2
)
{
if(t1
->expon
==t2
->expon
)
{
if(!(t1
->coef
+t2
->coef
)==0)
{
Attach(t1
->coef
+t2
->coef
,t1
->expon
,&temp
);
t1
=t1
->link
;
t2
=t2
->link
;
}
else
{
t1
=t1
->link
;
t2
=t2
->link
;
}
}
else if(t1
->expon
>t2
->expon
)
{
Attach(t1
->coef
,t1
->expon
,&temp
);
t1
=t1
->link
;
}
else if(t1
->expon
<t2
->expon
)
{
Attach(t2
->coef
,t2
->expon
,&temp
);
t2
=t2
->link
;
}
}
for(;t1
;t1
=t1
->link
)
{
Attach(t1
->coef
,t1
->expon
,&temp
);
}
for(;t2
;t2
=t2
->link
)
{
Attach(t2
->coef
,t2
->expon
,&temp
);
}
temp
=P
;
P
=P
->link
;
free(temp
);
return P
;
}
Polynomial
Mult(Polynomial P1
,Polynomial P2
)
{
Polynomial P
,Rear
,t1
,t2
,t
;
int c
,e
;
if(!P1
||!P2
)
return NULL;
t1
=P1
;t2
=P2
;
P
=(Polynomial
)malloc(sizeof(struct PolyNode
));
P
->link
=NULL;
Rear
=P
;
while(t2
)
{
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
;
}
t
=P
; P
=P
->link
; free(t
);
return P
;
}
void PrintPoly(Polynomial P
)
{
if(!P
)
{
printf("0 0");
}
while(P
)
{
printf("%d %d",P
->coef
,P
->expon
);
P
=P
->link
;
if(!P
==NULL)
{
printf(" ");
}
}
printf("\n");
}
int main()
{
Polynomial P1
,P2
,PP
,PS
;
P1
=ReadPoly();
P2
=ReadPoly();
PP
=Mult(P1
,P2
);
PrintPoly(PP
);
PS
=Add(P1
,P2
);
PrintPoly(PS
);
return 0;
}
转载请注明原文地址:https://blackberry.8miu.com/read-44372.html