多项式算法.docx

上传人:b****7 文档编号:10542017 上传时间:2023-02-21 格式:DOCX 页数:15 大小:16.14KB
下载 相关 举报
多项式算法.docx_第1页
第1页 / 共15页
多项式算法.docx_第2页
第2页 / 共15页
多项式算法.docx_第3页
第3页 / 共15页
多项式算法.docx_第4页
第4页 / 共15页
多项式算法.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

多项式算法.docx

《多项式算法.docx》由会员分享,可在线阅读,更多相关《多项式算法.docx(15页珍藏版)》请在冰豆网上搜索。

多项式算法.docx

多项式算法

#include

#include

typedefstruct

{floatcoef;//系数

intexpn;//指数

}term;

typedefstructLNode

{termdata;//term多项式值

structLNode*next;

}LNode,*LinkList;

typedefLinkListpolynomail;

/*比较指数*/

intcmp(terma,termb)

{if(a.expn>b.expn)return1;

if(a.expn==b.expn)return0;

if(a.expn

elseexit(-2);

}

/*由小到大排列*/

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指向参与比较的最后一个,不断向前移动

}}

/*由大到小排序*/

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指向参与比较的最后一个,不断向前移动

}}

/*打印多项式,求项数*/

intprintpolyn(polynomailP)

{inti;

polynomailq;

if(P==NULL)printf("无项!

\n");

elseif(P->next==NULL)printf("Y=0\n");

else

{printf("该多项式为Y=");q=P->next;i=1;

if(q->data.coef!

=0&&q->data.expn!

=0)

{printf("%.2fX^%d",q->data.coef,q->data.expn);i++;}

if(q->data.expn==0&&q->data.coef!

=0)

printf("%.2f",q->data.coef);//打印第一项

q=q->next;

if(q==NULL)

{printf("\n");return1;}

while

(1)//while中,打印剩下项中系数非零的项,

{if(q->data.coef!

=0&&q->data.expn!

=0)

{if(q->data.coef>0)printf("+");

printf("%.2fX^%d",q->data.coef,q->data.expn);i++;

}

if(q->data.expn==0&&q->data.coef!

=0)

{if(q->data.coef>0)printf("+");

printf("%f",q->data.coef);

}

q=q->next;

if(q==NULL)

{printf("\n");break;}

}

}

return1;

}

/*1、创建并初始化多项式链表*/

polynomailcreatpolyn(polynomailP,intm)

{polynomailr,q,p,s,Q;

inti;

P=(LNode*)malloc(sizeof(LNode));

r=P;

for(i=0;i

{s=(LNode*)malloc(sizeof(LNode));

printf("请输入第%d项的系数和指数:

",i+1);

scanf("%f%d",&s->data.coef,&s->data.expn);

r->next=s;r=s;

}

r->next=NULL;

if(P->next->next!

=NULL)

{for(q=P->next;q!

=NULL/*&&q->next!

=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;

}

}

returnP;

}

/*2、两多项式相加*/

polynomailaddpolyn(polynomailpa,polynomailpb)

{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

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;

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);

}

printf("升序1,降序2\n");

printf("选择:

");

scanf("%d",&j);

if(j==1)arrange1(newp);

elsearrange2(newp);

returnnewp;

}

/*3、两多项式相减*/

polynomailsubpolyn(polynomailpa,polynomailpb)

{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;

break;

}//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);

elsearrange2(newp);

returnnewp;}

/*4两多项式相乘*/

polynomailmulpolyn(polynomailpa,polynomailpb)

{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);

elsearrange2(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;

}

/*5、销毁已建立的两个多项式*/

voiddelpolyn(polynomailpa,polynomailpb)

{polynomailp,q;

p=pa;

while(p!

=NULL)

{q=p;

p=p->next;

free(q);

}

p=pb;

while(p!

=NULL)

{q=p;

p=p->next;

free(q);

}

printf("两个多项式已经销毁\n");

}

voidmain()

{polynomailpa=NULL,pb=NULL;

polynomailp,q;

polynomailaddp=NULL,subp=NULL,mulp=NULL;

intn,m;

intsign='y';

printf("1、创建两个一元多项式\n");

printf("2、两多项式相加得一新多项式\n");

printf("3、两多项式相减得一新多项式\n");

printf("4、两多项式相乘得一新多项式\n");

printf("5、销毁已建立的两个多项式\n");

printf("6、退出\n");

printf("\n");

while(sign!

='n')

{printf("请选择:

");

scanf("%d",&n);

switch(n)

{case1:

if(pa!

=NULL)

{printf("已建立两个一元多项式,请选择其他操作!

");

break;

}

printf("请输入第一个多项式:

\n");

printf("要输入几项:

");

scanf("%d",&m);

while(m==0)

{printf("m不能为0,请重新输入m:

");

scanf("%d",&m);

}

pa=creatpolyn(pa,m);

printpolyn(pa);

printf("请输入第二个多项式:

\n");

printf("要输入几项:

");

scanf("%d",&m);

pb=creatpolyn(pb,m);

printpolyn(pb);

break;

case2:

if(pa==NULL)

{printf("请先创建两个一元多项式!

\n");

break;

}

addp=addpolyn(pa,pb);

printpolyn(addp);

break;

case3:

if(pa==NULL)

{printf("请先创建两个一元多项式!

\n");

break;

}

subp=subpolyn(pa,pb);

printpolyn(subp);

break;

case4:

if(pa==NULL)

{printf("请先创建两个一元多项式!

\n");

break;

}

mulp=mulpolyn(pa,pb);

printpolyn(mulp);

break;

case5:

if(pa==NULL)

{printf("请先创建两个一元多项式!

\n");

break;

}

delpolyn(pa,pb);

pa=pb=NULL;

break;

case6:

if(addp!

=NULL)

{p=addp;

while(p!

=NULL)

{q=p;

p=p->next;

free(q);

}

}

if(subp!

=NULL)

{p=subp;

while(p!

=NULL)

{q=p;

p=p->next;

free(q);

}

}

exit(-2);

}//switch

}//while

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1