#include<stdio.h>
#include<stdlib.h>
typedef struct polynode* polynomial;
struct polynode
{
int coef;
int expon;
polynomial next;
};
polynomial readpoly();
void attach(int, int, polynomial*);
polynomial multpoly(polynomial ,polynomial );
polynomial addpoly(polynomial, polynomial);
void print(polynomial);
int main(void)
{
polynomial p1, p2, ps, pp;
p1 = readpoly();
p2 = readpoly();
pp = multpoly(p1, p2);
print(pp);
ps = addpoly(p1,p2);
print(ps);
return 0;
}
polynomial readpoly()
{
int n, i, coef, expon;
polynomial p, tail;
p = (polynomial)malloc(sizeof(struct polynode));
p->next = NULL;
tail = p;
scanf("%d", &n);
for (i = 0; i < n; ++i)
{
scanf("%d %d", &coef, &expon);
attach(coef, expon, &tail);
}
tail = p;
p = p->next;//如果链表为空,此时的tail->next为空,则返回空值
free(tail);
return p;
}
void attach(int coef, int expon, polynomial* pp)
{
polynomial p, tail;
p = (polynomial)malloc(sizeof(struct polynode));
p->next = NULL;
p->coef = coef;
p->expon = expon;
(*pp)->next = p;
(*pp) = p;
return;
}
polynomial multpoly(polynomial p1, polynomial p2)
{
if (!p1 || !p2)
return NULL;
polynomial t1 = p1, t2 = p2, p, tail, t;
int coef, expon;
p = (polynomial)malloc(sizeof(struct polynode));
p->next = NULL;
tail = p;
while (t2)
{
coef = t2->coef * t1->coef;
expon = t2->expon + t1->expon;
attach(coef, expon, &tail);
t2 = t2->next;
}
t1 = t1->next;
while (t1)
{
t2 = p2;
tail = p;
while (t2)
{
coef = t2->coef * t1->coef;
expon = t2->expon + t1->expon;
while (tail->next && tail->next->expon > expon)
{
tail = tail->next;
}
if (tail->next == NULL)
{
attach(coef, expon, &tail);
}
else
{
if (tail->next->expon == expon)
{
if(tail->next->coef + coef)
tail->next->coef += coef;
else
{
t = tail->next;
tail->next = t->next;
free(t);
}
}
else if (tail->next->expon < expon)
{
t = (polynomial)malloc(sizeof(struct polynode));
t->coef = coef;
t->expon = expon;
t->next = tail->next;
tail->next = t;
}
}
t2 = t2->next;
}
t1 = t1->next;
}
t = p;
p = p->next;
free(t);
return p;
}
polynomial addpoly(polynomial p1, polynomial p2)
{
polynomial t1 = p1, t2 = p2, tail, t, p;
int coef, expon;
p = (polynomial)malloc(sizeof(struct polynode));
p->next = NULL;
tail = p;
while (t1 && t2)
{
if (t1->expon == t2->expon && t1->coef + t2->coef != 0)
{
coef = t1->coef + t2->coef;
expon = t1->expon;
attach( coef, expon, &tail);
t1 = t1->next;
t2 = t2->next;
}
else if (t1->expon == t2->expon && t1->coef + t2->coef == 0)
{
t1 = t1->next;
t2 = t2->next;
}
else if(t1->expon > t2->expon)
{
coef = t1->coef;
expon = t1->expon;
attach(coef, expon, &tail);
t1 = t1->next;
}
else if (t1->expon < t2->expon)
{
coef = t2->coef;
expon = t2->expon;
attach(coef, expon, &tail);
t2 = t2->next;
}
}
while(t1)
{
attach(t1->coef, t1->expon, &tail);
t1 = t1->next;
}
while (t2)
{
attach(t2->coef, t2->expon, &tail);
t2 = t2->next;
}
t = p;
p = p->next;
free(t);
return p;
}
void print(polynomial p)
{
int flag = 1;
if (!p)
{
printf("0 0\n");
return;
}
else
{
while (p)
{
if (flag)
flag = 0;
else
printf(" ");
printf("%d %d", p->coef, p->expon);
p = p->next;
}
}
printf("\n");
return;
}