#include <stdio.h>
#include <stdio.h>
#define MAX 100
typedef struct node
{
double coef;
int exp;
}dxs[MAX];
typedef struct dnode
{
double coef;
int exp;
struct dnode *next;
}dnode;
void creat(dnode **L,dxs a,int n)
{
dnode *s,*r;
int i;
*L=(dnode *)malloc(sizeof(dnode));
(*L)->next=NULL;
r=*L;
for(i=0;i<n;i++)
{
s=(dnode *)malloc(sizeof(dnode));
s->coef=a[i].coef;
s->exp=a[i].exp;
r->next=s;
r=s;
}
r->next=NULL;
}
void show(dnode *L)
{
int first=1;
dnode *p=L->next;
while(p!=NULL)
{
if(first)
first=0;
else if(p->coef>0)
printf("+");
if(p->exp==0)
printf("%g",p->coef);
else if(p->next==1)
printf("%gx",p->coef);
else
printf("%g^%d",p->coef,p->exp);
p=p->next;
}
printf("\n");
}
void sort(dnode *L)
{
dnode *p=L->next,*r,*q;
if(p!=NULL)
{
r=p->next;
p->next=NULL;
p=r;
while(p!=NULL)
{
r=p->next;
q=L;
while(q->next!=NULL&&q->next->exp>p->exp)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
}
}
void add(dnode*ha,dnode*hb,dnode**hc)
{
double c;
dnode *pa=ha->next,*pb=hb->next,*s,*t;
*hc=(dnode *)malloc(sizeof(dnode));
t=*hc;
while(pa!=NULL&pb!=NULL)
{
if(pa->exp>pb->exp)
{
s=(dnode *)malloc(sizeof(dnode));
s->exp=pa->exp;s->coef=pa->coef;
t->next=s;t=s;
pa=pa->next;
}
else if(pa->exp<pb->exp)
{
s=(dnode *)malloc(sizeof(dnode));
s->exp=pb->exp;s->coef=pb->coef;
t->next=s;t=s;
pb=pb->next;
}
else
{
c=pa->coef+pb->coef;
if(c!=0)
{
s=(dnode *)malloc(sizeof(dnode));
s->exp=pa->exp;s->coef=c;
t->next=s;t=s;
}
pa=pa->next;
pb=pb->next;
}
}
if(pb!=NULL)
pa=pb;
while(pa!=NULL)
{
s=(dnode *)malloc(sizeof(dnode));
s->exp=pa->exp;s->coef=pa->coef;
t->next=s;t=s;
pa=pa->next;
}
t->next=NULL;
}
int main()
{
dnode *ha,*hb,*hc;
dxs a={{1,0},{5,1},{7,3},{-9,7},{5,16}};
dxs b={{4,1},{7,4},{4,7},{-3,15},{1,16}};
create(&ha,a,5);
create(&hb,b,5);
printf("原多项式A: ");show(ha);
printf("原多项式B: ");show(hb);
sort(ha);
sort(hb);
printf("有序多项式A: ");show(ha);
printf("有序多项式B: ");show(hb);
add(ha,hb,&hc);
printf("多项式相加: ");show(hc);
return 0;
}