多项式代码.docx

上传人:b****9 文档编号:25398222 上传时间:2023-06-08 格式:DOCX 页数:15 大小:17.24KB
下载 相关 举报
多项式代码.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

#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)//若多项式为空,返回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.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);//建立多项式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();

}

}

}

}

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

当前位置:首页 > 求职职场 > 职业规划

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

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