A->a[i]=0;
scanf("%d%d",&coef,&ex);
while(ex>=0)
{
if(ex>maxe)
maxe=ex;
if(A->a[ex]!
=0)
{
printf("你输入的项已经存在,是否更新原数据?
(Y/N)");
cin>>ch;
if(ch=='Y'||ch=='y')
{
A->a[ex]=coef;
printf("更新成功,请继续输入!
\n");
}
else
printf("请继续输入!
\n");;
}
else
A->a[ex]=coef;
scanf("%d%d",&coef,&ex);
}
A->len=maxe;
return;
}
6.2一元多项式的加法
6.2.1链式存储两多项式相加
程序源代码:
polynomailaddpolyn(polynomailpa,polynomailpb)
{
//完成多项式相加运算,即:
Pa=Pa+Pb
polynomails,newp,q,p,r;
intj;
p=pa->next;
q=pb->next;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&&q)
{
s=(LNode*)malloc(sizeof(LNode));
switch(cmp(p->data,q->data))
{
case-1:
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s;
r=s;
p=p->next;
break;
case0:
s->data.coef=p->data.coef+q->data.coef;
if(s->data.coef!
=0.0)
{
s->data.expn=p->data.expn;
r->next=s;r=s;
}
p=p->next;
q=q->next;
break;
case1:
s->data.coef=q->data.coef;
s->data.expn=q->data.expn;
r->next=s;
r=s;
q=q->next;
break;
}//switch
}//while
6.2.2顺序存储的多项式相加
程序源代码:
voidADD(PloyA,PloyB,Ploy*M)
/*多项式A与多项式B相加,得到多项式M*/
{
intla=A.len,lb=B.len,i;
M->len=la>lb?
la:
lb;
for(i=0;i<=la&&i<=lb;i++)
{
M->a[i]=A.a[i]+B.a[i];
}
while(i<=la)
{
M->a[i]=A.a[i];
i++;
}
while(i<=lb)
{
M->a[i]=B.a[i];
i++;
}
return;
}
6.3一元多项式相减
6.3.1链式存储的多项式相减
程序源代码:
/*3、两多项式相减*/
polynomailsubpolyn(polynomailpa,polynomailpb)
{
//完成多项式相减运算,即:
Pa=Pa-Pb
polynomails,newp,q,p,r,Q;intj;
p=pa->next;
q=pb->next;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&&q)
{
s=(LNode*)malloc(sizeof(LNode));
switch(cmp(p->data,q->data))
{
case-1:
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s;
r=s;
p=p->next;
break;
case0:
s->data.coef=p->data.coef-q->data.coef;
if(s->data.coef!
=0.0)
{
s->data.expn=p->data.expn;
r->next=s;
r=s;
}
p=p->next;
q=q->next;
break;
case1:
s->data.coef=-q->data.coef;
s->data.expn=q->data.expn;
r->next=s;
r=s;
q=q->next;
}//switch
}//while
while(p)
{
s=(LNode*)malloc(sizeof(LNode));
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s;
r=s;
p=p->next;
}
while(q)
{
s=(LNode*)malloc(sizeof(LNode));
s->data.coef=-q->data.coef;
s->data.expn=q->data.expn;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL;
if(newp->next!
=NULL&&newp->next->next!
=NULL)//合并同类项
{
for(q=newp->next;q!
=NULL;q=q->next)
for(p=q->next,r=q;p!
=NULL;)
if(q->data.expn==p->data.expn)
{
q->data.coef=q->data.coef+p->data.coef;
r->next=p->next;
Q=p;
p=p->next;
free(Q);
}
else
{r=r->next;p=p->next;}
}
printf("升序1,降序2\n");
printf("选择:
");
scanf("%d",&j);
if(j==1)
arrange1(newp);
else
arrange2(newp);
returnnewp;}
6.3.2顺序存储的多项式相减
程序源代码:
voidSUB(PloyA,PloyB,Ploy*M)
/*多项式A与多项式B相减(A-B),得到多项式M*/
{
intla=A.len,lb=B.len,i;
M->len=la>lb?
la:
lb;
for(i=0;i<=la&&i<=lb;i++)
{
M->a[i]=A.a[i]-B.a[i];
}
while(i<=la){M->a[i]=A.a[i];i++;}
while(i<=lb){M->a[i]=0-B.a[i];i++;}
return;
}
6.4一元多项式相乘
6.4.1链式存储的多项式相乘
程序源代码:
polynomailmulpolyn(polynomailpa,polynomailpb)
{
//完成多项式相乘运算,即:
Pa=Pa*Pb
polynomails,newp,q,p,r;
inti=20,j;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
for(p=pa->next;p!
=NULL;p=p->next)
for(q=pb->next;q!
=NULL;q=q->next)
{
s=(LNode*)malloc(sizeof(LNode));
s->data.coef=p->data.coef*q->data.coef;
s->data.expn=p->data.expn+q->data.expn;
r->next=s;
r=s;
}
r->next=NULL;
printf("升序1,降序2\n");
printf("选择:
");
scanf("%d",&j);
if(j==1)
arrange1(newp);
else
arrange2(newp);
for(;i!
=0;i--)
{
for(q=newp->next;q->next!
=NULL;q=q->next)//合并同类项
for(p=q;p!
=NULL&&p->next!
=NULL;p=p->next)
if(q->data.expn==p->next->data.expn)
{
q->data.coef=q->data.coef+p->next->data.coef;
r=p->next;
p->next=p->next->next;
free(r);
}
}
returnnewp;}
6.4.2顺序存储多项式相乘
程序源代码:
voidMUL(PloyA,PloyB,Ploy*M)
/*多项式A与多项式B相乘,得到多项式M*/
{
inti,j;
for(i=0;i<=A.len+B.len+1;i++)M->a[i]=0;
for(i=0;i<=A.len;i++)
for(j=0;j<=B.len;j++)
{
M->a[i+j]+=A.a[i]*B.a[j];
}
M->len=A.len+B.len;
return;
}
6.5一元多项式输出结果按项的指数排序
6.5.1链式由小到大排序
图6.6.1链式升序流程图
voidarrange1(polynomailpa)
{polynomailh=pa,p,q,r;
if(pa==NULL)exit(-2);
for(p=pa;p->next!
=NULL;p=p->next);r=p;
for(h=pa;h->next!
=r;)//大的沉底
{for(p=h;p->next!
=r&&p!
=r;p=p->next)
if(cmp(p->next->data,p->next->next->data)==1)
{q=p->next->next;
p->next->next=q->next;
q->next=p->next;
p->next=q;
}
r=p;//r指向参与比较的最后一个,不断向前移动
}}
6.5.2链式由大到小排序
图6.6.2链式降序流程图
程序源代码:
voidarrange2(polynomailpa)
{polynomailh=pa,p,q,r;
if(pa==NULL)exit(-2);
for(p=pa;p->next!
=NULL;p=p->next);r=p;
for(h=pa;h->next!
=r;)//小的沉底
{for(p=h;p->next!
=r&&p!
=r;p=p->next)
if(cmp(p->next->next->data,p->next->data)==1)
{q=p->next->next;
p->next->next=q->next;
q->next=p->next;
p->next=q;
}
r=p;//r指向参与比较的最后一个,不断向前移动
6.5.3顺序由大到小排序
程序源代码:
voidPrintPloy1(PloyA)//降序输出顺序一元多项式
{
inti;
printf("%dx^%d",A.a[A.len],A.len);
for(i=A.len-1;i>=1;i--)
{
if(A.a[i]==0);
elseif(A.a[i]==1)printf("+x^%d",i);
elseif(A.a[i]==-1)printf("-x^%d",i);
else
{
if(A.a[i]>0)
printf("+%dx^%d",A.a[i],i);
else
printf("-%dx^%d",-A.a[i],i);
}
}
if(A.a[0]==0);
elseif(A.a[0]>0)
printf("+%d",A.a[0]);//打印x的0次项
else
printf("-%d",-A.a[0]);
printf("\n");
return;
}
6.5.4顺序由小到大排序
程序源代码:
voidPrintPloy2(PloyA)//升序输出顺序一元多项式
{
inti=0;
while(A.a[i]==0)
++i;
if(i==0)
printf("%d",A.a[i]);
else
{
if(A.a[i]==1)
printf("x^%d",i);
elseif(A.a[i]==-1)
printf("-x^%d",i);
else
printf("%dx^%d",A.a[i],i);
}
for(++i;i<=A.len;i++)
{
if(A.a[i]==0);
elseif(A.a[i]==1)
printf("+x^%d",i);
elseif(A.a[i]==-1)
printf("-x^%d",i);
elseif(A.a[i]>1)
printf("+%dx^%d",A.a[i],i);
elseif(A.a[i]<-1)
printf("-%dx^%d",-A.a[i],i);
}
}
6.6一元多项式运算系统实现
6.6.1主菜单系统
程序源代码:
voidMenu()
{
printf("\n");
printf("************一元多项式的基本运算系统************\n");
printf("1、一元多项式顺序存储的子系统请按1\n");
printf("2、一元多项式链式存储的基本运算请按2\n");
printf("3、退出系统请按3\n");
printf("************************************************\n");
printf("\n");
printf("请输入你想进行的操作号:
\n");
intn;
scanf("%d",&n);
while(n!
=1&&n!
=2&&n!
=3)
{
printf("对不起,你的输入不正确,请重新输入!
\n");
scanf("%d",&n);
}
switch