多项式代码.docx
《多项式代码.docx》由会员分享,可在线阅读,更多相关《多项式代码.docx(15页珍藏版)》请在冰豆网上搜索。
多项式代码
#include
#defineOK1
#defineERROR0
#defineOVERFLOW-1
//定义多项式的项
typedefintStatus;
typedefstruct{
floatcoef;
intexpn;
}PolyTerm,ElemType;//定义结构体各项所需元素
typedefstructPolyNode{
PolyTermdata;//将每一项封装一下
structPolyNode*next;
}PolyNode,*PolyList;
voidmenu()//主菜单
{
printf("\n");
printf("--------主菜单----------\n");
printf("1.输出多项式\n");
printf("2.多项式求导\n");
printf("3.多项式求积分\n");
printf("4.计算函数值\n");
printf("5.多项式相加\n");
printf("6.多项式相减\n");
printf("7.多项式相乘\n");
printf("0.退出\n");
printf("--------------------------------\n");
}
voidInsert(PolyNode*p,PolyListL)//小项p插入到多项式H中,使得该多项式为指数降序
if(p->data.coef==0)free(p);//系数为0,即该小项为空,则删除该结点即释放该结点空间
else
PolyNode*q1,*q2;
q1=L;
q2=L->next;
while(q2&&p->data.expndata.expn)//查找插入位置
q1=q2;
q2=q2->next;
if(q2&&p->data.expn==q2->data.expn)//将指数相同项合并
q2->data.coef=q2->data.coef+p->data.coef;
free(p);//删除p结点
if(!
q2->data.coef)//系数为0,则释放结点
q1->next=q2->next;
free(q2);
else//新指数,将结点插入
p->next=q2;
q1->next=p;
PolyListCreatePolyn(PolyListL,intm)
{//建立多项式,m为项数
inti;
PolyNode*p;
p=L=(PolyList)malloc(sizeof(PolyNode));
L->next=NULL;
for(i=0;i{p=(PolyNode*)malloc(sizeof(PolyNode));//建立新结点以接收数据printf("请输入第%d项的系数与指数:",i+1);scanf("%f%d",&p->data.coef,&p->data.expn);Insert(p,L);//调用Insert函数插入结点p}returnL;//返回该多项式}voidDestroyPolyn(PolyListL)//销毁多项式,从头结点开始逐项删除各个结点{PolyNode*q1,*q2;q1=L->next;q2=q1->next;while(q1->next){free(q1);q1=q2;q2=q2->next;}}intPrintPolyn(PolyListL)//按系数从高到低输出多项式{PolyNode*q=L->next;intflag=1;//项数计数器if(!q)//若多项式为空,返回0returnERROR;while(q){if(q->data.coef>0&&flag!=1)putchar('+');//系数大于0且不是第一项if(q->data.coef!=1&&q->data.coef!=-1)//系数非1或-1的普通情况{printf("%g",q->data.coef);//g????????//系数if(q->data.expn==1)putchar('X');//指数elseif(q->data.expn)printf("X^%d",q->data.expn);}else{if(q->data.coef==1)//系数为1时,可省略系数{if(!q->data.expn)putchar('1');//指数为0elseif(q->data.expn==1)putchar('X');//指数为1elseprintf("X^%d",q->data.expn);}if(q->data.coef==-1)//系数为-1时,直接输入-{if(!q->data.expn)printf("-1");elseif(q->data.expn==1)printf("-X");elseprintf("-X^%d",q->data.expn);}}q=q->next;flag++;}printf("\n");}intcompare(PolyNode*f,PolyNode*g){//两个小项按指数比较大小if(f&&g){if(!g||f->data.expn>g->data.expn)return1;elseif(!f||f->data.expndata.expn)return-1;elsereturn0;}elseif(!f&&g)return-1;//f多项式已空,但g多项式非空elsereturn1;//g多项式已空,但f多项式非空}PolyListAddPolyn(PolyListpf,PolyListpg){//多项式相加PolyListqf=pf->next;PolyListqg=pg->next;PolyListheadc,hc,qc;hc=(PolyList)malloc(sizeof(PolyNode));//建立头结点hc->next=NULL;headc=hc;while(qf||qg)//其一非空{qc=(PolyList)malloc(sizeof(PolyNode));switch(compare(qf,qg)){case1://qf>qg{qc->data.coef=qf->data.coef;qc->data.expn=qf->data.expn;qf=qf->next;break;}case0://qf=qg{qc->data.coef=qf->data.coef+qg->data.coef;qc->data.expn=qf->data.expn;qf=qf->next;qg=qg->next;break;}case-1://qf{qc->data.coef=qg->data.coef;qc->data.expn=qg->data.expn;qg=qg->next;break;}}if(qc->data.coef!=0)//合系数不为0{qc->next=hc->next;hc->next=qc;hc=qc;}elsefree(qc);//合系数为0时,释放该结点}returnheadc;}PolyListSubtractPolyn(PolyListpf,PolyListpg){//多项式相减PolyListh=pg;PolyListp=pg->next;PolyListpd;while(p){//将多项式pg的系数取反p->data.coef*=-1;p=p->next;}pd=AddPolyn(pf,h);for(p=h->next;p;p=p->next)p->data.coef*=-1;//恢复多项式g的系数returnpd;}floatValuePolyn(PolyListhead,floatx)//输入x值,计算{PolyListp;inti;floatsum=0,t;for(p=head->next;p;p=p->next){t=1;for(i=p->data.expn;i!=0;){if(i<0){t=t/x;i++;}//指数小于0,进行除法else{t=t*x;i--;}//指数大于0,进行乘法}sum=sum+p->data.coef*t;}returnsum;}PolyListDerivative(PolyListhead)//多项式求导{PolyListq=head->next,p1,p2,hd;hd=p1=(PolyList)malloc(sizeof(PolyNode));//建立头结点hd->next=NULL;while(q){if(q->data.expn!=0)//该项不是常数项时{p2=(PolyList)malloc(sizeof(PolyNode));p2->data.coef=q->data.coef*q->data.expn;p2->data.expn=q->data.expn-1;p2->next=p1->next;//连接结点p1->next=p2;p1=p2;}q=q->next;}returnhd;}PolyListIntegral(PolyListhead)//多项式求积分{PolyListq=head->next,p1,p2,hd;hd=p1=(PolyList)malloc(sizeof(PolyNode));//建立头结点hd->next=NULL;while(q){p2=(PolyList)malloc(sizeof(PolyNode));if(q->data.expn!=0)//该项不是常数项时{p2->data.expn=q->data.expn+1;p2->data.coef=q->data.coef/p2->data.expn;}else{p2->data.expn=1;p2->data.coef=q->data.coef;}p2->next=p1->next;//连接结点p1->next=p2;p1=p2;q=q->next;//后移结点}returnhd;}PolyListMultiplyPolyn(PolyListpf,PolyListpg)//多项式相乘{PolyListha,pa;PolyListqf=pf->next;PolyListqg=pg->next;ha=(PolyList)malloc(sizeof(PolyNode));//建立头结点ha->next=NULL;for(;qf;qf=qf->next){for(qg=pg->next;qg;qg=qg->next){pa=(PolyList)malloc(sizeof(PolyNode));pa->data.coef=qf->data.coef*qg->data.coef;//系数相乘pa->data.expn=qf->data.expn+qg->data.expn;//指数相加Insert(pa,ha);//调用Insert函数以合并指数相同的项}}returnha;}voidmain(){intm,n,sign=-1;floatx;PolyListpf=0,pg=0,pc;menu();//显示主界面printf("请输入f的项数:");scanf("%d",&m);pf=CreatePolyn(pf,m);//建立多项式fprintf("请输入g的项数:");scanf("%d",&n);pg=CreatePolyn(pg,n);//建立多项式gwhile(sign){printf("\n请选择操作:");scanf("%d",&sign);switch(sign){case1://输出多项式{printf("\n多项式f(x)=");PrintPolyn(pf);printf("\n多项式g(x)=");PrintPolyn(pg);printf("\n\n");sign=-1;menu();break;}case2://求导{pc=Derivative(pf);printf("\n求导后f'(x)=");PrintPolyn(pc);pc=Derivative(pg);printf("\n求导后g'(x)=");PrintPolyn(pc);printf("\n\n");sign=-1;menu();break;}case3://求积分{pc=Integral(pf);printf("\n积分f(x)=");PrintPolyn(pc);pc=Integral(pg);printf("\n积分g(x)=");PrintPolyn(pc);printf("\n\n");sign=-1;menu();break;}case4://求函数值{printf("输入x的值:");scanf("%f",&x);printf("f(%3.2f)=%g\n",x,ValuePolyn(pf,x));printf("\n再输入一个x的值:");scanf("%f",&x);printf("g(%3.2f)=%g\n",x,ValuePolyn(pg,x));printf("\n\n");sign=-1;menu();break;}case5://多项式相加{pc=AddPolyn(pf,pg);printf("\n多项式之和f(x)+g(x)=");PrintPolyn(pc);printf("\n\n");sign=-1;menu();break;}case6://多项式相减{pc=SubtractPolyn(pf,pg);printf("\n多项式之差f(x)-g(x)=");PrintPolyn(pc);printf("\n\n");sign=-1;menu();break;}case7://多项式相乘{pc=MultiplyPolyn(pf,pg);printf("\n多项式之积f(x)*g(x)=");PrintPolyn(pc);printf("\n\n");sign=-1;menu();break;}case0://退出程序,销毁多项式{printf("\n程序已结束!\n");DestroyPolyn(pf);DestroyPolyn(pg);sign=0;break;}default:{printf("\n您的选择错误,请重新选择!\n");sign=-1;menu();}}}}
p=(PolyNode*)malloc(sizeof(PolyNode));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:
",i+1);
scanf("%f%d",&p->data.coef,&p->data.expn);
Insert(p,L);//调用Insert函数插入结点p
returnL;//返回该多项式
voidDestroyPolyn(PolyListL)//销毁多项式,从头结点开始逐项删除各个结点
q1=L->next;
q2=q1->next;
while(q1->next)
free(q1);
intPrintPolyn(PolyListL)//按系数从高到低输出多项式
PolyNode*q=L->next;
intflag=1;//项数计数器
q)//若多项式为空,返回0
returnERROR;
while(q)
if(q->data.coef>0&&flag!
=1)putchar('+');//系数大于0且不是第一项
if(q->data.coef!
=1&&q->data.coef!
=-1)//系数非1或-1的普通情况
printf("%g",q->data.coef);//g?
?
//系数
if(q->data.expn==1)putchar('X');//指数
elseif(q->data.expn)printf("X^%d",q->data.expn);
if(q->data.coef==1)//系数为1时,可省略系数
q->data.expn)putchar('1');//指数为0
elseif(q->data.expn==1)putchar('X');//指数为1
elseprintf("X^%d",q->data.expn);
if(q->data.coef==-1)//系数为-1时,直接输入-
q->data.expn)printf("-1");
elseif(q->data.expn==1)printf("-X");
elseprintf("-X^%d",q->data.expn);
q=q->next;
flag++;
intcompare(PolyNode*f,PolyNode*g)
{//两个小项按指数比较大小
if(f&&g)
g||f->data.expn>g->data.expn)return1;
elseif(!
f||f->data.expndata.expn)return-1;
elsereturn0;
f&&g)return-1;//f多项式已空,但g多项式非空
elsereturn1;//g多项式已空,但f多项式非空
PolyListAddPolyn(PolyListpf,PolyListpg)
{//多项式相加
PolyListqf=pf->next;
PolyListqg=pg->next;
PolyListheadc,hc,qc;
hc=(PolyList)malloc(sizeof(PolyNode));//建立头结点
hc->next=NULL;
headc=hc;
while(qf||qg)//其一非空
qc=(PolyList)malloc(sizeof(PolyNode));
switch(compare(qf,qg))
case1:
//qf>qg
qc->data.coef=qf->data.coef;
qc->data.expn=qf->data.expn;
qf=qf->next;
break;
case0:
//qf=qg
qc->data.coef=qf->data.coef+qg->data.coef;
qg=qg->next;
case-1:
//qf{qc->data.coef=qg->data.coef;qc->data.expn=qg->data.expn;qg=qg->next;break;}}if(qc->data.coef!=0)//合系数不为0{qc->next=hc->next;hc->next=qc;hc=qc;}elsefree(qc);//合系数为0时,释放该结点}returnheadc;}PolyListSubtractPolyn(PolyListpf,PolyListpg){//多项式相减PolyListh=pg;PolyListp=pg->next;PolyListpd;while(p){//将多项式pg的系数取反p->data.coef*=-1;p=p->next;}pd=AddPolyn(pf,h);for(p=h->next;p;p=p->next)p->data.coef*=-1;//恢复多项式g的系数returnpd;}floatValuePolyn(PolyListhead,floatx)//输入x值,计算{PolyListp;inti;floatsum=0,t;for(p=head->next;p;p=p->next){t=1;for(i=p->data.expn;i!=0;){if(i<0){t=t/x;i++;}//指数小于0,进行除法else{t=t*x;i--;}//指数大于0,进行乘法}sum=sum+p->data.coef*t;}returnsum;}PolyListDerivative(PolyListhead)//多项式求导{PolyListq=head->next,p1,p2,hd;hd=p1=(PolyList)malloc(sizeof(PolyNode));//建立头结点hd->next=NULL;while(q){if(q->data.expn!=0)//该项不是常数项时{p2=(PolyList)malloc(sizeof(PolyNode));p2->data.coef=q->data.coef*q->data.expn;p2->data.expn=q->data.expn-1;p2->next=p1->next;//连接结点p1->next=p2;p1=p2;}q=q->next;}returnhd;}PolyListIntegral(PolyListhead)//多项式求积分{PolyListq=head->next,p1,p2,hd;hd=p1=(PolyList)malloc(sizeof(PolyNode));//建立头结点hd->next=NULL;while(q){p2=(PolyList)malloc(sizeof(PolyNode));if(q->data.expn!=0)//该项不是常数项时{p2->data.expn=q->data.expn+1;p2->data.coef=q->data.coef/p2->data.expn;}else{p2->data.expn=1;p2->data.coef=q->data.coef;}p2->next=p1->next;//连接结点p1->next=p2;p1=p2;q=q->next;//后移结点}returnhd;}PolyListMultiplyPolyn(PolyListpf,PolyListpg)//多项式相乘{PolyListha,pa;PolyListqf=pf->next;PolyListqg=pg->next;ha=(PolyList)malloc(sizeof(PolyNode));//建立头结点ha->next=NULL;for(;qf;qf=qf->next){for(qg=pg->next;qg;qg=qg->next){pa=(PolyList)malloc(sizeof(PolyNode));pa->data.coef=qf->data.coef*qg->data.coef;//系数相乘pa->data.expn=qf->data.expn+qg->data.expn;//指数相加Insert(pa,ha);//调用Insert函数以合并指数相同的项}}returnha;}voidmain(){intm,n,sign=-1;floatx;PolyListpf=0,pg=0,pc;menu();//显示主界面printf("请输入f的项数:");scanf("%d",&m);pf=CreatePolyn(pf,m);//建立多项式fprintf("请输入g的项数:");scanf("%d",&n);pg=CreatePolyn(pg,n);//建立多项式gwhile(sign){printf("\n请选择操作:");scanf("%d",&sign);switch(sign){case1://输出多项式{printf("\n多项式f(x)=");PrintPolyn(pf);printf("\n多项式g(x)=");PrintPolyn(pg);printf("\n\n");sign=-1;menu();break;}case2://求导{pc=Derivative(pf);printf("\n求导后f'(x)=");PrintPolyn(pc);pc=Derivative(pg);printf("\n求导后g'(x)=");PrintPolyn(pc);printf("\n\n");sign=-1;menu();break;}case3://求积分{pc=Integral(pf);printf("\n积分f(x)=");PrintPolyn(pc);pc=Integral(pg);printf("\n积分g(x)=");PrintPolyn(pc);printf("\n\n");sign=-1;menu();break;}case4://求函数值{printf("输入x的值:");scanf("%f",&x);printf("f(%3.2f)=%g\n",x,ValuePolyn(pf,x));printf("\n再输入一个x的值:");scanf("%f",&x);printf("g(%3.2f)=%g\n",x,ValuePolyn(pg,x));printf("\n\n");sign=-1;menu();break;}case5://多项式相加{pc=AddPolyn(pf,pg);printf("\n多项式之和f(x)+g(x)=");PrintPolyn(pc);printf("\n\n");sign=-1;menu();break;}case6://多项式相减{pc=SubtractPolyn(pf,pg);printf("\n多项式之差f(x)-g(x)=");PrintPolyn(pc);printf("\n\n");sign=-1;menu();break;}case7://多项式相乘{pc=MultiplyPolyn(pf,pg);printf("\n多项式之积f(x)*g(x)=");PrintPolyn(pc);printf("\n\n");sign=-1;menu();break;}case0://退出程序,销毁多项式{printf("\n程序已结束!\n");DestroyPolyn(pf);DestroyPolyn(pg);sign=0;break;}default:{printf("\n您的选择错误,请重新选择!\n");sign=-1;menu();}}}}
qc->data.coef=qg->data.coef;
qc->data.expn=qg->data.expn;
if(qc->data.coef!
=0)//合系数不为0
qc->next=hc->next;
hc->next=qc;
hc=qc;
elsefree(qc);//合系数为0时,释放该结点
returnheadc;
PolyListSubtractPolyn(PolyListpf,PolyListpg)
{//多项式相减
PolyListh=pg;
PolyListp=pg->next;
PolyListpd;
while(p)
{//将多项式pg的系数取反
p->data.coef*=-1;
p=p->next;
pd=AddPolyn(pf,h);
for(p=h->next;p;p=p->next)p->data.coef*=-1;//恢复多项式g的系数
returnpd;
floatValuePolyn(PolyListhead,floatx)//输入x值,计算
PolyListp;
floatsum=0,t;
for(p=head->next;p;p=p->next)
t=1;
for(i=p->data.expn;i!
=0;)
if(i<0){t=t/x;i++;}//指数小于0,进行除法
else{t=t*x;i--;}//指数大于0,进行乘法
sum=sum+p->data.coef*t;
returnsum;
PolyListDerivative(PolyListhead)//多项式求导
PolyListq=head->next,p1,p2,hd;
hd=p1=(PolyList)malloc(sizeof(PolyNode));//建立头结点
hd->next=NULL;
if(q->data.expn!
=0)//该项不是常数项时
p2=(PolyList)malloc(sizeof(PolyNode));
p2->data.coef=q->data.coef*q->data.expn;
p2->data.expn=q->data.expn-1;
p2->next=p1->next;//连接结点
p1->next=p2;
p1=p2;
returnhd;
PolyListIntegral(PolyListhead)//多项式求积分
p2->data.expn=q->data.expn+1;
p2->data.coef=q->data.coef/p2->data.expn;
p2->data.expn=1;
p2->data.coef=q->data.coef;
q=q->next;//后移结点
PolyListMultiplyPolyn(PolyListpf,PolyListpg)//多项式相乘
PolyListha,pa;
ha=(PolyList)malloc(sizeof(PolyNode));//建立头结点
ha->next=NULL;
for(;qf;qf=qf->next)
for(qg=pg->next;qg;qg=qg->next)
pa=(PolyList)malloc(sizeof(PolyNode));
pa->data.coef=qf->data.coef*qg->data.coef;//系数相乘
pa->data.expn=qf->data.expn+qg->data.expn;//指数相加
Insert(pa,ha);//调用Insert函数以合并指数相同的项
returnha;
voidmain()
intm,n,sign=-1;floatx;
PolyListpf=0,pg=0,pc;
menu();//显示主界面
printf("请输入f的项数:
");
scanf("%d",&m);
pf=CreatePolyn(pf,m);//建立多项式f
printf("请输入g的项数:
scanf("%d",&n);
pg=CreatePolyn(pg,n);//建立多项式g
while(sign)
printf("\n请选择操作:
scanf("%d",&sign);
switch(sign)
//输出多项式
printf("\n多项式f(x)=");
PrintPolyn(pf);
printf("\n多项式g(x)=");
PrintPolyn(pg);printf("\n\n");
sign=-1;menu();
case2:
//求导
pc=Derivative(pf);
printf("\n求导后f'(x)=");
PrintPolyn(pc);
pc=Derivative(pg);
printf("\n求导后g'(x)=");
PrintPolyn(pc);printf("\n\n");
case3:
//求积分
pc=Integral(pf);
printf("\n积分f(x)=");
pc=Integral(pg);
printf("\n积分g(x)=");
case4:
//求函数值
printf("输入x的值:
scanf("%f",&x);
printf("f(%3.2f)=%g\n",x,ValuePolyn(pf,x));
printf("\n再输入一个x的值:
printf("g(%3.2f)=%g\n",x,ValuePolyn(pg,x));
printf("\n\n");sign=-1;menu();
case5:
//多项式相加
pc=AddPolyn(pf,pg);
printf("\n多项式之和f(x)+g(x)=");
case6:
//多项式相减
pc=SubtractPolyn(pf,pg);
printf("\n多项式之差f(x)-g(x)=");
case7:
//多项式相乘
pc=MultiplyPolyn(pf,pg);
printf("\n多项式之积f(x)*g(x)=");
//退出程序,销毁多项式
printf("\n程序已结束!
\n");
DestroyPolyn(pf);DestroyPolyn(pg);
sign=0;
default:
printf("\n您的选择错误,请重新选择!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1