#include<stdio.h>
#include<stdlib.h>
typedef struct PolyNode* Polynomial;
typedef struct PolyNode
{
int coef;
int expon;
Polynomial next;
}PolyNode;
void insertNewNode(int c,int e, PolyNode* & pRear)
{
PolyNode* p;
p = (PolyNode *)malloc(sizeof(PolyNode));
p->coef = c;
p->expon = e;
p->next = NULL;
pRear->next = p;
pRear = p;
}
void insertMidNode(int c, int e, PolyNode*& pRear)
{
PolyNode* p;
p = (PolyNode*)malloc(sizeof(PolyNode));
p->coef = c;
p->expon = e;
p->next = pRear->next;
pRear->next = p;
}
Polynomial readPoly()
{
Polynomial poly,rear;
int c, e, N;
printf("共几项?\n");
scanf("%d", &N);
printf("请输入每项\n");
poly = (Polynomial)malloc(sizeof(PolyNode));
poly->next = NULL;
rear = poly;
for (; N > 0; N--)
{
scanf("%d %d", &c, &e);
insertNewNode(c, e, rear);
}
Polynomial t = poly;
poly = poly->next;
free(t);
return poly;
}
Polynomial polyAdd(Polynomial p1,Polynomial p2)
{
Polynomial resPoly, rear;
resPoly = (Polynomial)malloc(sizeof(PolyNode));
resPoly->next = NULL;
rear = resPoly;
while (p1 != NULL && p2 != NULL)
{
if (p1->expon == p2->expon)
{
insertNewNode(p1->coef + p2->coef, p1->expon, rear);
p1 = p1->next;
p2 = p2->next;
}
else if (p1->expon > p2->expon)
{
insertNewNode(p1->coef, p1->expon, rear);
p1 = p1->next;
}
else if(p1->expon < p2->expon)
{
insertNewNode(p2->coef, p2->expon, rear);
p2 = p2->next;
}
}
for (; p1 != NULL; p1 = p1->next)
insertNewNode(p1->coef, p1->expon, rear);
for (; p2 != NULL; p2 = p2->next)
insertNewNode(p2->coef, p2->expon, rear);
Polynomial t = resPoly;
resPoly = resPoly->next;
free(t);
return resPoly;
}
Polynomial polyMult(Polynomial p1,Polynomial p2)
{
Polynomial multp,mRear;
Polynomial p2t = p2;
multp = (Polynomial)malloc(sizeof(PolyNode));
multp->next = NULL;
mRear = multp;
while (p2t != NULL)
{
insertNewNode(p1->coef * p2t->coef, p1->expon + p2t->expon, mRear);
p2t = p2t->next;
}
p1 = p1->next;
while (p1 != NULL)
{
p2t = p2;
mRear = multp;
while (p2t != NULL)
{
int e = p1->expon + p2t->expon;
while (mRear->next != NULL && mRear->next->expon>e)
{
mRear = mRear->next;
}
if (mRear->next != NULL && mRear->next->expon == e)
{
mRear->next->coef += (p1->coef * p2t->coef);
}
else if (mRear->next != NULL && mRear->next->expon < e)
{
insertMidNode(p1->coef * p2t->coef, p1->expon + p2t->expon, mRear);
}
else
{
insertNewNode(p1->coef * p2t->coef, p1->expon + p2t->expon, mRear);
}
p2t = p2t->next;
}
p1 = p1->next;
}
Polynomial t = multp;
multp = multp->next;
free(t);
return multp;
}
void printPoly(Polynomial p)
{
while (p!=NULL)
{
printf("%d ,%d\n", p->coef, p->expon);
p = p->next;
}
}
int main()
{
Polynomial p1,p2,addp;
p1 = readPoly();
p2 = readPoly();
addp = polyAdd(p1, p2);
printf("---加法结果---\n");
printPoly(addp);
Polynomial multp;
multp = polyMult(p1, p2);
printf("---乘法结果---\n");
printPoly(multp);
return 0;
}