#include<stdio.h>
#include<stdlib.h>
struct PolyNode
{
int coef; //系数
int expon; //指数
struct PolyNode* link; //指向下一个结点的指针
};
typedef struct PolyNode* Polynomial;
void Attach(int c,int e,Polynomial *pRear);
//不带头结点的多项式存储
int Compare(int a,int b)
{
if(a > b)
return 1;
if(a==b)
return 0;
if(a < b)
return -1;
}
Polynomial Add(Polynomial P1,Polynomial P2)
{
Polynomial front,rear,temp;
int sum;
rear = (Polynomial)malloc(sizeof(struct PolyNode));
front = rear; //由front记录结果多项式链表头结点
while(P1&&P2) //当两个多项式都有非零项待处理时
switch(Compare(P1->expon,P2->expon))
{
case 1: //P1 >P2
Attach(P1->coef,P1->expon,&rear);
P1 = P1->link;
break;
case -1: //P1 < P2
Attach(P2->coef,P2->expon,&rear);
P2 = P2->link;
break;
case 0: //P1 = P2
sum = P1->coef + P2->coef;
if(sum) //sum为0时不需要插入
Attach(sum,P1->expon,&rear);
P1 = P1->link;
P2 = P2->link;
break;
}
for( ;P1;P1 = P1->link)
Attach(P1->coef,P1->expon,&rear);
for( ;P2;P2 = P2->link)
Attach(P2->coef,P2->expon,&rear);
rear->link = NULL;
temp = front;
front = front->link;
free(temp);
return front;
}
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; //修改pRear值
}
Polynomial ReadPoly()
{
int N,c,e;
Polynomial P,Rear,t;
P = (Polynomial)malloc(sizeof(struct PolyNode)); //链表头空结点
P->link = NULL;
Rear = P;
scanf("%d",&N);
while(N--)
{
scanf("%d%d",&c,&e);
Attach(c,e,&Rear);
}
t = P;
P = P->link;
free(t); //删除临时生成的头结点
return P;
}
void PrintPoly(Polynomial P)
{
int flag = 0;
if(!P)
{
printf("0 0\n");
return;
}
while(P)
{
if(!flag)
flag = 1;
else
printf(" ");
printf("%d %d",P->coef,P->expon);
P = P->link;
}
printf("\n");
}
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) //用P1的第一项乘P2的每一项
{
Attach(t1->coef * t2->coef,t1->expon + t2->expon,&Rear);
t2 = t2->link;
}
t1 = t1->link;
while(t1) //P1从第二项开始每一项和P2相乘
{
t2 = P2;
Rear = P;
while(t2)
{
c = t1->coef * t2->coef; //系数相乘
e = t1->expon + t2->expon; //指数相加
while(Rear->link && Rear->link->expon > e)
Rear = Rear->link;
if(Rear->link && Rear->link->expon == e)
{
if(Rear->link->coef + c) //如果系数相加不为0
Rear->link->coef += c; //该项系数相加
else //相加为0,删除该结点
{
t = Rear->link;
Rear->link = t->link;
free(t);
}
}
else //Rear的下一个比结果指数小,插在Rear后面
{
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;
}
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;
}
#include<stdlib.h>
struct PolyNode
{
int coef; //系数
int expon; //指数
struct PolyNode* link; //指向下一个结点的指针
};
typedef struct PolyNode* Polynomial;
void Attach(int c,int e,Polynomial *pRear);
//不带头结点的多项式存储
int Compare(int a,int b)
{
if(a > b)
return 1;
if(a==b)
return 0;
if(a < b)
return -1;
}
Polynomial Add(Polynomial P1,Polynomial P2)
{
Polynomial front,rear,temp;
int sum;
rear = (Polynomial)malloc(sizeof(struct PolyNode));
front = rear; //由front记录结果多项式链表头结点
while(P1&&P2) //当两个多项式都有非零项待处理时
switch(Compare(P1->expon,P2->expon))
{
case 1: //P1 >P2
Attach(P1->coef,P1->expon,&rear);
P1 = P1->link;
break;
case -1: //P1 < P2
Attach(P2->coef,P2->expon,&rear);
P2 = P2->link;
break;
case 0: //P1 = P2
sum = P1->coef + P2->coef;
if(sum) //sum为0时不需要插入
Attach(sum,P1->expon,&rear);
P1 = P1->link;
P2 = P2->link;
break;
}
for( ;P1;P1 = P1->link)
Attach(P1->coef,P1->expon,&rear);
for( ;P2;P2 = P2->link)
Attach(P2->coef,P2->expon,&rear);
rear->link = NULL;
temp = front;
front = front->link;
free(temp);
return front;
}
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; //修改pRear值
}
Polynomial ReadPoly()
{
int N,c,e;
Polynomial P,Rear,t;
P = (Polynomial)malloc(sizeof(struct PolyNode)); //链表头空结点
P->link = NULL;
Rear = P;
scanf("%d",&N);
while(N--)
{
scanf("%d%d",&c,&e);
Attach(c,e,&Rear);
}
t = P;
P = P->link;
free(t); //删除临时生成的头结点
return P;
}
void PrintPoly(Polynomial P)
{
int flag = 0;
if(!P)
{
printf("0 0\n");
return;
}
while(P)
{
if(!flag)
flag = 1;
else
printf(" ");
printf("%d %d",P->coef,P->expon);
P = P->link;
}
printf("\n");
}
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) //用P1的第一项乘P2的每一项
{
Attach(t1->coef * t2->coef,t1->expon + t2->expon,&Rear);
t2 = t2->link;
}
t1 = t1->link;
while(t1) //P1从第二项开始每一项和P2相乘
{
t2 = P2;
Rear = P;
while(t2)
{
c = t1->coef * t2->coef; //系数相乘
e = t1->expon + t2->expon; //指数相加
while(Rear->link && Rear->link->expon > e)
Rear = Rear->link;
if(Rear->link && Rear->link->expon == e)
{
if(Rear->link->coef + c) //如果系数相加不为0
Rear->link->coef += c; //该项系数相加
else //相加为0,删除该结点
{
t = Rear->link;
Rear->link = t->link;
free(t);
}
}
else //Rear的下一个比结果指数小,插在Rear后面
{
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;
}
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;
}