#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
float coef;
int exp;
struct Node *next;
}polynode;
polynode * create(int n)
{
polynode *L,*r,*s;
float coef;
int exp,i;
L=(polynode *)malloc(sizeof(polynode)); //申请表头结点空间
r=L; //r为尾指针
for(i=0;i<n;i++)
{
s=(polynode *)malloc(sizeof(polynode)); //建立项的结点,并插在链尾
printf("coef:");
scanf("%f",&coef);
printf("exp: ");
scanf("%d",&exp);
s->coef=coef;
s->exp=exp;
r->next=s;
r=s;
}
r->next=NULL;
return(L);
}
void add(polynode *pa, polynode *pb)
{
polynode *p,*q,*r,*temp; //temp用来存放临时结点
float sum;
p=pa->next;
q=pb->next;
r=pa;
while(p&&q)
{
if(p->exp<q->exp) //p指向的项指数小于q,尾指针指向p,且将p指向链表的下一结点
{
r=p;
p=p->next;
}
else if(p->exp==q->exp) //指数相等时,系数相加
{
sum=p->coef+q->coef;
if(sum!=0)
{
p->coef=sum;
r=p;
}
else //系数相加为0
{
r->next=p->next;
free(p);
}
p=p->next;
q=q->next;
}
else
{
temp=q->next;
q->next=p;
r->next=q;
r=q;
q=temp;//这个临时结点用的好。
}
}
if(q)
r->next=q;
free(pb);
}
void display(polynode * p)
{
int i=0;
while(p->next)
{
p=p->next;
i++;
printf("%lf*x^%d+",p->coef,p->exp);
}
printf("一共有%d项\n",i);
}
void main()
{
polynode * pa,* pb;
int n,m;
printf("\n请输入多项式a(按指数递增顺序输入):\n");
printf("请输入n的值\n");;
scanf("%d",&n);
pa=create(n);
display(pa);
printf("\n请输入多项式b(按指数递增顺序输入):\n");
printf("请输入m的值\n");
scanf("%d",&m);
pb=create(m);
display(pb);
printf("\n多项式相加结果是:\n");
add(pa,pb);
display(pa);
printf("\n");
}