1、7) 多项式相乘:编写一个函数,求两个多项式的乘积多项式。3. 算法说明:1) 多项式的建立、显示和相加算法见讲义。可修改显示函数,使输出的多项式更符合表达规范。2) 多项式减法:同次项的系数相减(缺项的系数是0)。例如a(x)=-5x2+2x+3,b(x)= -4x3+3x,则a(x)-b(x) =4x3-5x2-x+3。提示:a(x)-b(x) = a(x)+(-b(x)。3) 多项式乘法:两个多项式的相乘是“系数相乘,指数相加”。算法思想是用一个多项式中的各项分别与另一个多项式相乘,形成多个多项式,再将它们累加在一起。例如,a(x)=-5x2+2x+3,b(x)=-4x3+3x,则a(x
2、)*b(x) = (-4x3)*(-5x2+2x+3)+(3x)*(-5x2+2x+3) = (20x5-8x4-12x3) + (-15x3+6x2+9x) = 20x5-8x4-27x3+6x2+9x。4. 实验步骤:根据实验报告的要求,我对文件夹里的C文件进行了丰富和修改,步骤如下:链表结构建立多项式:typedef struct polynode float coef; /系数 int exp; /指数 struct polynode *next; /下一结点指针 PNode; 编写函数,实现多项式的加法运算;PNode * PolyAdd (PNode *f1, PNode *f2)
3、 /实现加法功能。 /实现两多项式(头指针分别为f1和f2)相加,返回和多项式f3=f1+f2。 PNode *pa=f1-next,*pb=f2-next,*pc,*f3,*q; float coef; f3=(PNode *)malloc(sizeof(PNode); /建立头指针 f3-exp=-1; /对头指针初始化next=f3; pc=f3; /将pc指向头指针 while (pa-exp!=-1 | pb-=-1) / 返回头指针时,跳出循环 if (pa-exppb-exp) exp=pa-exp; coef=pa-coef; pa=pa-next; else if (pa-e
4、xp coef=pb- pb=pb- else coef+pb- if (coef!=0) q=(PNode *)malloc(sizeof(PNode); /建立新的q指针存放负指数的指针 q-exp=exp;coef=coef; /将q插入链表中next=pc- pc-next=q; pc=q; return f3; /返回实现多项式的显示;void ShowPloy(PNode *h) /用if语句判断,当指数为0是,只输出系数;当指数为1时,输出系数和X;当系数为1时,输出X和指数。 h=paixu(h); /整理函数,使之降幂排列 PNode *p=h- if(p=h) printf
5、(表达式为空n); return; if(p-coef=1) x%d,p-exp); /用if语句判断,若输出xo和x1值为0和1 直接输出数据。 else if(p-exp=1) %gx, p-coef);exp=0) %g else %gx%dcoef, p- p=p- while (p!=h) if(p-coef0) printf(+ /系数为负,不用输出加号 else if(p- else p=p- printf(n主函数void main() PNode *F1,*F2,*F3; float x; F1=CreatPoly(); F2=CreatPoly();nf1(x)=ShowP
6、loy(F1);nf2(x)=ShowPloy(F2); F3=PolyAdd(F1,F2); F3=paixu(F3);nf1+f2=: ShowPloy(F3); F3=PolySub(F1,F2);nf1-f2=: F3=PolyMult(F1,F2);nf1*f2=:nx的值为: scanf(%f, &x);nf1(x=%.3f)=%.3fn,x,PolyValue(F1,x);多项式求值double PolyValue(PNode *h, float x) /编写算法,求以h为头指针的多项式在x点的值并返回该值。 double f=0.0; /求出f=f(x); PNode *pa;
7、 pa=h- while(pa-=-1) /使用f+=coef*pow,返回f f+=(pa-coef)*pow(x,pa- pa=pa- return f;多项式相减PNode * PolySub(PNode *f1,PNode *f2)/编写此算法,实现两多项式(头指针分别为f1和f2)相减,返回差多项式f3=f1-f2。next,*pc,*f3,*q,*head; /头指针的初始化 /pc指向头指针,便于操作。 while(pb-=-1) /返回头指针时,跳出循环。 q=(PNode *)malloc(sizeof(PNode); q-coef=pb-coef*(-1);exp=pb-
8、pc- pc=q; pb=pb- head=PolyAdd(f1,f3); /调用加法函数做减法 return head; /返回头指针多项式相乘PNode * PolyMult(PNode *f1,PNode *f2)/实现两多项式(头指针分别为f1和f2)相乘,返回乘积多项式f3=f1*f2。next,*pc,*u,*head; head=(PNode *)malloc(sizeof(PNode); head-next=head; pc=head;=-1) /多项式相乘,录入u指针,查到头指针。 while(pb-=-1) coef=pa-coef*pb- exp=pa-exp+pb- u
9、=(PNode *)malloc(sizeof(PNode); u-next=u; pc=u;程序运行截图测试成功!程序完整源代码如下:#include stdlib.hmath.hPNode * paixu(PNode *f) /将多项式降幂排列 PNode *p,*q,*r,*p0,*q0; p=f- q=p- p0=f; q0=p; while(p-=-1) /p为q的前驱,q与p指数指数值进行比较, while(q-=-1) /q为头指针推出循环,q移动一圈 if(p-q-exp) /比较,若p大于q则q后移 q0=q; q=q- else if(p-exp) /若p小于q则q插入p之
10、前 r=q- q-next=p0- q0-next=r; p0- p=q; q=r;exp=q-exp) /若相等,p的coef 与q的相加,然后删除q节点,释放q的空间 p-coef+=q-next=q- p0=p; q=p- q0=p;PNode * CreatPoly() /建立多项式链表,返回头指针 PNode * head, *p, *s; int i,n; p=head;多项式的项数为:%d,&n); for(i=1;icoef,& p-next=s; p=s; p-void FreePoly(PNode *h) /编写此算法,将以h为头指针的多项式的链表结点逐个释放。 PNode *p,*q; p=h-exp)!+-1; free(p); p=q; free(h); return; /Free函数用于销毁链表,最后指向头指针,跳出循环并释放头指针。double PolyValue(PNode *h, float x) /实现多项式求值功能。利用指针求出每一项的值,再用加法加起来。实验总结:这次试验提高了我的编程能力,让我认识到了我C语言的不足之处。也使我了解了线性链表是具有链接存储结构的线性表,它用节点存放线性表中的数据元素,逻辑上相邻的节点不能随机存取,因为这个原因我前期的程序一直出错,以后编程序的时候要牢记。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1