一元多项式顾名思义就是好多个式子相加减,显然想到的就是利用单链表来实现,我在此处只讨论一元多项式相加的情况,相减也是一样的做法。首先,两个一元多项式相加,可以把它转化为两个单链表的合并,这是首要,然后就是将相同指数的项合并,将不同指数的项从小到大的顺序排列,使得相加后的一元多项式更加美观。具体代码及注释如下:
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(poly)
typedef struct term{
float coef;
int expn;
struct term*next;
}poly,*link;
void creatpoly(link*p,int m);
void printpoly(link p);
int cmp(link p1,link p2);
link addpoly(link pa,link pb);
link reverse(link p);
int main()
{
link p1,p2;
int L1,L2;
printf("请输入第一个多项式的项数:");
scanf("%d",&L1);
creatpoly(&p1,L1);
printf("第一个多项式为:");
printpoly(p1);
printf("请输入第二个多项式的项数:");
scanf("%d",&L2);
creatpoly(&p2,L2);
printf("第二个多项式为:");
printpoly(p2);
printf("两个一元多项式相加的结果为:");
printpoly(addpoly(p1,p2));
}
void creatpoly(link*p,int m)
{
link r,s;
int i;
*p=(link)malloc(LEN);
r=*p;
for(i=0;i<m;i++)
{
s=(link)malloc(LEN);
printf("输入系数和指数:");
scanf("%f %d",&s->coef,&s->expn);
r->next=s;
r=s;
}
r->next=NULL;
}
void printpoly(link p)
{
link s;
s=p->next;
while(s)
{
printf("%.2f X^%d",s->coef,s->expn);
s=s->next;
if(s!=NULL)
if(s->coef>=0)
printf("+");
}
printf("\n");
}
int cmp(link a,link b)
{
if(a->expn<b->expn)
return -1;
else if(a->expn==b->expn)
return 0;
else return 1;
}
link addpoly(link pa,link pb)
{
link newp,p,q,s,pc;
float sum;
p=pa->next;
q=pb->next;
newp=(link)malloc(LEN);
pc=newp;
while(p&&q)
{
switch(cmp(p,q))
{
case -1:
s=(link)malloc(LEN);
s->coef=p->coef;
s->expn=p->expn;
pc->next=s;
pc=s;
p=p->next;
break;
case 0://若两项的指数相等,则将两项系数相加后得到的项放入头结点中
sum=p->coef+q->coef;
if(sum!=0.0)
{
s=(link)malloc(LEN);
s->coef=sum;
s->expn=p->expn;
pc->next=s;
pc=s;
}
p=p->next;
q=q->next;
break;
case 1:
s=(link)malloc(LEN);
s->coef=q->coef;
s->expn=q->expn;
pc->next=s;
pc=s;
q=q->next;
break;
}
}
pc->next=p?p:q;
return newp;
}
link reverse(link p)
{
link head=p;
link q1,q2;
q2=head->next;
head->next=NULL;
while(q2)
{
q1=q2;
q2=q2->next;
q1->next=head->next;
head->next=q1;
}
return head;
}