一元稀疏多项式计算器数据结构.docx
- 文档编号:28625599
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:14
- 大小:145.75KB
一元稀疏多项式计算器数据结构.docx
《一元稀疏多项式计算器数据结构.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式计算器数据结构.docx(14页珍藏版)》请在冰豆网上搜索。
一元稀疏多项式计算器数据结构
中南民族大学
学生实验报告
院系:
计算机科学学院
专业:
软件工程
年级:
2013级
课程名称:
数据结构
姓名:
韦宜
(2)
指导教师:
宋中山
2015年12月15日
题目:
设计一个一元稀疏多项式简单计算器
班级:
软件工程1301姓名:
韦宜学号:
2完成日期:
12月15日
1、需求分析
问题描述:
设计一个一元多项式加法器
基本要求:
输入并建立多项式;
(2)两个多项式相加;
(3)输出多项式:
n,c1,e1,c2,e2,…cn,en,其中,n是多项式项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列。
(4)计算多项式在x处的值;
(5)求多项式的导函数。
软件环境:
Windows,UNIX,Linux等不同平台下的VisualC++6.0
硬件环境:
512MB内存,80Gb硬盘,Pentium4CPU,CRT显示器。
2、
概要分析
本程序有五个函数:
PolyNode*Input()(输入函数);
PolyNode*Deri(PolyNode*head)(求导函数);
PolyNode*Plus(PolyNode*A,PolyNode*B)(求和函数);
voidOutput(PolyNode*head)(输出函数);
intmain()(主函数)
本程序可使用带有附加头结点的单链表来实现多项式的链表表示,每个链表结点表示多项式的一项,命名为node,它包括两个数据成员:
系数coef和指数exp,他们都是公共数据成员,*next为指针域,用链表来表示多项式。
适用于不定的多项式,特别是对于项数再运算过程中动态增长的多项式,不存在存储溢出的问题。
其次,对于某些零系数项,在执行加法运算后不再是零系数项,这就需要在结果多项式中增添新的项;对于某些非零系数项,在执行加法运算后可能是零系数项,这就需要在结果多项式中删去这些项,利用链表操作,可以简单的修改结点的指针以完成这种插入和删除运算(不像在顺序方式中那样,可能移动大量数据项)运行效率高。
3、
详细设计
(1)主函数:
intmain()
{
PolyNode*head_a,*head_b;
intchoice;
head_a=newPolyNode;head_a->next=NULL;
do
{
system("cls");//清屏函数
Output(head_a);
cout<<"______________________________\n";
cout<<"|---------1.输入公式-----------|\n";
cout<<"|---------2.求导-----------|\n";
cout<<"|---------3.两式求和-----------|\n";
cout<<"|---------4.退出程序-----------|\n";
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
cin>>choice;
if(choice==1)head_a=Input();
elseif(choice==2)head_a=Deri(head_a);//求导
elseif(choice==3){head_b=Input();head_a=Plus(head_a,head_b);}//求和
elseif(choice==4)break;
elsecout<<"输入错误,重新输入:
\n";
}
while(choice!
=5);
return0;
(2)由于此程序是二人合作完成,我在此程序中主要是完成求和和求导函数的
设计。
所以下面着重介绍下求和函数和求导函数。
PolyNode*Deri(PolyNode*head)(求导函数):
流程图如下:
求导函数部分代码:
PolyNode*Deri(PolyNode*head)//求导
{
PolyNode*p=head;
while(p->next!
=NULL)
{
if(p->next->exp==0)p->next=NULL;//指数为零返回
else
{
p->next->coef*=p->next->exp;//系数乘以指数
p->next->exp--;//指数减一
p=p->next;
}
}
returnhead;
用于对输入的多项式进行求导,求导在链表内进行计算,即运算完成链表的值改变,返回头指针。
PolyNode*Plus(PolyNode*A,PolyNode*B)(求和函数):
流程图如下:
本函数用于对多项式进行加法计算,需要运用存有两个多项式的头指针,前一头指针可是前一计算的计算结果,也可是调用输入函数,后一头指针是调用输入函数输入的多项式的头接点。
经过计算得到一个新的链表,函数返回链表的头指针。
求和函数部分代码
PolyNode*Plus(PolyNode*A,PolyNode*B)//相加
{
PolyNode*head,*p;
head=newPolyNode;
p=head;
A=A->next;
B=B->next;
while(A!
=NULL||B!
=NULL)
{
if(A==NULL){p->next=B;break;}//如果A空,把B后面的所有接点接到p之后
if(B==NULL){p->next=A;break;}//如果B空,把A后面的所有接点接到p之后
if(A->exp==B->exp)//如果两指数数相等,相加
{
if(A->coef+B->coef!
=0)
{p->next=newPolyNode;
p=p->next;
p->exp=A->exp;
p->coef=A->coef+B->coef;
}
A=A->next;
B=B->next;continue;//如果两系数互为倒数,不保存,后指,继续循环
}
if(A->exp>B->exp)//A的指数大于B的指数
{
p->next=newPolyNode;
p=p->next;
p->exp=A->exp;
p->coef=A->coef;
A=A->next;continue;//将A的当前接点接到新链表后面,A后指
}
p->next=newPolyNode;
p=p->next;
p->exp=B->exp;
p->coef=B->coef;
B=B->next;//将B的当前接点接到新链表后面,B后指
}
if(A==NULL&&B==NULL)//如果AB都为空
p->next=NULL;
returnhead;//返回头指针
}
(3)其他函数(同组的成员设计)
#include
#include
usingnamespacestd;
typedefstructnode
{
floatcoef;//系数
intexp;//指数
structnode*next;//指针域指向下一个系数不为0的子项
}PolyNode;
PolyNode*Input()//输入函数
{
floatc;//系数域
inte;//指数域
PolyNode*p,*q,*r,*head;
cout<<"请输入多项式:
\n";
cout<<"形式:
系数1指数1系数2指数2系数3指数3......00:
\n";
head=newPolyNode;//建立头接点
p=head;p->next=NULL;
for(;;)
{
cin>>c>>e;
if(c==0&&e==0)break;//结束输入
if(c==0)continue;//从新输入,不保存
if(head->next==NULL)//输入第一个接点
{
p->next=newPolyNode;
p=p->next;
p->coef=c,p->exp=e;
p->next=NULL;
continue;
}
p=head;
while(p->next!
=NULL&&e<=p->next->exp)p=p->next;//如果输入的指数小于p的下一个接点,p向后指
if(e==p->exp){p->coef+=c;continue;}//如果相等,直接加上去,继续循环
q=newPolyNode;
q->coef=c,q->exp=e;
if(p->next!
=NULL&&e>p->next->exp)//如果p的后继接点的指数小于输入的指数,插入到p的当前接点之后
{
r=p->next;
p->next=q;
q->next=r;
continue;
}
p->next=q;//如果输入的值小于所有接点,接在最后一个接点之后
p=p->next;p->next=NULL;
}
returnhead;
}
输出函数
voidOutput(PolyNode*head)//输出
{
PolyNode*p;
p=head->next;
if(p==NULL){cout<<"当前没有公式或计算结果为0,请选1输入!
!
!
\n";return;}
if(p!
=NULL)
{
cout<<"计算结果:
\n";
cout<
}
while(p!
=NULL)
{
cout<<"+"<
p=p->next;
}
cout< cout<<"如果想重新输入公式,请选1输入! ! ! \n\n"; } 4、调试分析与操作说明 (1)当程序运行时,进入主界面。 如图: 此时输入1-4选择操作 (2)输入1后按回车出现: 输入12345600后按回车之后会出现界面: (3)求导: 输入2求导后按回车会出现结果: 结果正确。 (4)求和: 如果进入图4.3后输入3后按回车会出现界面: 图4.5求和界面 输入22446600后结果会出来: 图4.6求和结果 结果正确。 此系统在得到计算结果后可以直接用计算的结果进行下一步计算,如果不想用当前的结果,也可按“1”重新输入公式进行下一步计算 5、心得体会 经过这学期的学习,我对数据结构了解更深了一点,因为第一次修的时候没有认真的去修,所以没有及格,我很惭愧,所以再一次的修让我觉得我该好好学习这么课程,因为对后面的学习都很有影响。 通过做这次实验,我意识到,自己对C语言的掌握稍微熟练了一些;在写程序的过程中,遇到一些问题是在所难免的,但我相信只要用心去做,就一定会有收获。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 稀疏 多项式 计算器 数据结构