一元稀疏多项式运算器Word格式文档下载.docx
- 文档编号:18135932
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:20
- 大小:267.14KB
一元稀疏多项式运算器Word格式文档下载.docx
《一元稀疏多项式运算器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式运算器Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
(4)输出多项式a,b,c,d。
输出格式:
比如多项式a为:
A(x)=c1xe1+c2xe2+…+cmxem,其中,ci和ei分别为第i项的系数和指数,且各项按指数的升幂排列,即0≤e1<e2<…<em。
【测试数据示例】
(1)(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)
(2)(x+x100)+(x100+x200)=(x+2x100+x200)
(3)(2x+5x8-3x11)+(7-5x8+11x9)=(7+2x+11x9-3x11)
(4)(6x-3-x+4.4x2-1.2x9)-(-6x-3+4.4x2+7.8x15)
=(12x-3-x-1.2x9-7.8x15)
2.设计
【设计思想】
(1)用单链表存储一元多项式,并用尾插入法创建单链表。
其中单链表的每个结点含三个域,多项式的系数,指数和next域。
(2)分别输入多项式a和b的各项系数和指数值,得到一元多项式并输出。
(3)进行多项式的相加减,和多项式存放在c中,根据结点类型定义,若指数不同,则进行链表的合并;
若指数相同,则进行系数相加减。
【概要设计】
(1)用单链表存储多项式的结点结构体定义
系数coef
指数exp
指针域next
(2)构造多项式函数
(3)一元多项式相加函数
(4)一元多项式相减函数
(5)主函数
【详细设计】
>
主要算法框架<
<
结构体定义<
定义单链表的结构体如下:
//定义结点的结构体
typedefstructpolynode/*用单链表存储多项式的结点结构*/
{
floatcoef;
/*多项式的系数*/
floatexp;
/*指数*/
structpolynode*next;
}node;
构造一元多项式<
///////建立一个多项式
node*create(void)
node*h,*r,*s;
floatc,e;
h=(node*)malloc(sizeof(node));
/*申请结点空间*/
r=h;
/*r始终指向链表的表尾*/
printf("
输入系数:
"
);
scanf("
%f"
&
c);
输入指数:
"
e);
while(c!
=0)/*输入系数为0时,表示多项式的输入结束*/
{
s=(node*)malloc(sizeof(node));
s->
coef=c;
exp=e;
r->
next=s;
r=s;
printf("
scanf("
}
r->
next=NULL;
return(h);
}
输出一元多项式<
///////输出函数
voiddisplay(node*p)/*输出函数,打印出一元多项式*/
{
while(p->
next!
=NULL)
{
p=p->
next;
if(p->
=0)
if(p->
next->
coef>
0)
printf("
%f*x^%f+"
p->
coef,p->
exp);
else
%f*x^%f"
else
%f*x^%f"
\n---------------------------------------------------\n"
一元多项式相加<
node*polyadd(node*polya,node*polyb)/*一元多项式相加函数,用于将两个多
项式相加,然后将和多项式存放在多项式polyc*/
node*h,*p,*q,*s,*r;
floatsum;
p=polya->
/*p指针指向a的头结点*/
q=polyb->
/*q指针指向b的头结点*/
/*位置指针,指向和多项式polyc*/
while(p!
=NULL&
&
q!
=NULL)
if(p->
exp<
q->
exp)/*若p指向的多项式指数小于q指的指数,将p此时的结点存入c中,p指针后移*/
s->
coef=p->
coef;
exp=p->
exp;
r=s;
elseif(p->
exp==q->
exp)/*若指数相等,则相应的系数相加*/
sum=p->
coef+q->
if(sum!
=0)/*当sum不为0时进行插入操作*/
{
s=(node*)malloc(sizeof(node));
s->
coef=sum;
r=s;
}
q=q->
p=p->
else/*若p指数大于q指数,将q此时的结点存入c中,q指针后移*/
coef=q->
exp=q->
if(p!
=NULL)/*将p的剩余结点依次复制到新链表中*/
s=(node*)malloc(sizeof(node));
p=p->
else/*否则将q的剩余结点依次复制到新链表中*/
{
r->
return(h);
一元多项式相减<
node*polysub(node*polya,node*polyb)/*一元多项式相减函数,用于将两个多项式相减,然后将和多项式存放在多项式polyd中*/
node*h,*p,*q,*s,*r;
floatsub;
/*位置指针,指向和多项式polyd*/
exp)/*若指数相等,则相应的系数相减*/
sub=p->
coef-q->
if(sub!
=0)/*当sub不为0时进行插入操作*/
coef=sub;
coef=-q->
主函数<
intmain()/*主函数*/
node*polya,*polyb,*polyc,*polyd;
charx;
inti;
i=1;
请按指数大小输入一个一元多项式(当输入的系数为0时结束输入!
):
\n"
polya=create();
/*创建多项式*/
display(polya);
请按指数大小输入另一个一元多项式(当输入的系数为0时结束输入!
polyb=create();
display(polyb);
while(i<
=2)
{printf("
请输入求和类型,相加运算输入1;
相减输入0):
%d"
x);
if(x==1)
{printf("
一元多项式相加的结果为:
polyc=polyadd(polya,polyb);
/*调用一元多项式相加函数*/
display(polyc);
else
一元多项式相减的结果为:
polyd=polysub(polya,polyb);
/*调用一元多项式相减函数*/
display(polyd);
i++;
3.调试分析
(1)、最初定义结构体时,发生如下错误:
intcoef;
intexp;
运行无错误,并且测试前三组数据时结果均正确,当测试到第四组数据:
(6x-3-x+4.4x2-1.2x9)-(-6x-3+4.4x2+7.8x15)=(12x-3-x-1.2x9-7.8x15)时,就发生错误了。
原因是系数不能只定义成int型,当系数为小数时就不能满足要求,因此改为:
(2)、没考虑两个多项式指数相同,系数相加时,和为零的情况,只有和不为零时才进行插入操作。
if(sum!
(3)、这次编程使我更多地理解掌握了线性链表的逻辑机构和物理特性。
对学过的知识有了很好的巩固。
困难还是很多的,但通过认真的调试修改,最终克服种种困难,完成程序。
最后,通过这次编程,不仅仅考察了我对知识的掌握,更重要的是锻炼了我的思维能力和耐心。
4.用户手册
运行程序后的初始画面:
当输入的系数和指数均为0时输出多项式。
多项式a和b均输出后,再输入求和类型,相加运算输入1;
相减运算输入0
4.测试结果
(1)
(2)
(3)
(4)
5.原程序清单
完整程序<
#include<
stdio.h>
malloc.h>
floatcoef;
floatexp;
structpolynode*next;
node*polyadd(node*polya,node*polyb)/*一元多项式相加函数,用于将两个多项式相加,然后将和多项式存放在多项式polyc中*/
/*位置指针,指向和多项式polyc*/
exp)/*若p指向的多项式指数小于q指的指数*/
else/*若p指数大于q指数*/
else
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 稀疏 多项式 运算器