#include <stdio.h>
#include <stdlib.h>
//稀疏多项式合并
typedef struct Pnode{
float coef; //系数
int expn; //指数
struct Pnode *next;//指针域
}PNODE,*Polynomial;
//多项式创建
void CreatePolyn(Polynomial *P,int n)
{
Polynomial s,q;
(*P) = (Polynomial)malloc(sizeof(PNODE));
(*P)->next = NULL;
q = *P;
int i;
for(i=1;i<=n;i++)
{
s = (Polynomial)malloc(sizeof(PNODE));
s->next = NULL;
scanf("%f%d",&(s->coef),&(s->expn));
q->next = s;
q = s;
}
}
void print(Polynomial *P)
{
Polynomial p = (*P)->next;
while(p)
{
printf("%f %d\n",p->coef,p->expn);
p = p->next;
}
}
void MergePoly(Polynomial *Pa,Polynomial *Pb)
{
Polynomial p1,p2,p3,p,q;
p1 = (*Pa)->next;
p2 = (*Pb)->next;
p3 = (*Pa);
while(p1&&p2)
{
if(p1->expn == p2->expn)
{
if(p1->coef+p2->coef <0.00001)
{
p = p1;
q = p2;
p1 = p1->next;
p2 = p2->next;
free(q);
free(p);
}
else
{
p1->coef = p1->coef + p2->coef;
p3->next = p1;
p3 = p1;
p = p2;
p1 = p1->next;
p2 = p2->next;
free(p);
}
}
else if(p1->expn < p2->expn)
{
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else
{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
while(p1)
{
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
while(p2)
{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
free(*Pb);
}
int main()
{
Polynomial m1,m2,p;
CreatePolyn(&m1,4);
print(&m1);
CreatePolyn(&m2,3);
print(&m2);
printf("\n");
p = m1;
MergePoly(&m1,&m2);
print(&p);
return 0;
}