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