多项式代码.docx
- 文档编号:25398222
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:15
- 大小:17.24KB
多项式代码.docx
《多项式代码.docx》由会员分享,可在线阅读,更多相关《多项式代码.docx(15页珍藏版)》请在冰豆网上搜索。
多项式代码
#include
#include
#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.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)//若多项式为空,返回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); } else { if(q->data.coef==1)//系数为1时,可省略系数 { if(! 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时,直接输入- { 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.expn 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);//建立多项式f printf("请输入g的项数: "); scanf("%d",&n); pg=CreatePolyn(pg,n);//建立多项式g while(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(); } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多项式 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)