一元稀疏多项式计算器数据结构文档格式.docx
《一元稀疏多项式计算器数据结构文档格式.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式计算器数据结构文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
输入并建立多项式;
(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"
;
|---------1.输入公式-----------|\n"
|---------2.求导-----------|\n"
|---------3.两式求和-----------|\n"
|---------4.退出程序-----------|\n"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\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->
//指数为零返回
else
{
p->
coef*=p->
exp;
//系数乘以指数
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->
B=B->
while(A!
=NULL||B!
if(A==NULL){p->
next=B;
break;
}//如果A空,把B后面的所有接点接到p之后
if(B==NULL){p->
next=A;
}//如果B空,把A后面的所有接点接到p之后
if(A->
exp==B->
exp)//如果两指数数相等,相加
if(A->
coef+B->
coef!
=0)
{p->
next=newPolyNode;
exp=A->
coef=A->
coef;
}
A=A->
B=B->
continue;
//如果两系数互为倒数,不保存,后指,继续循环
if(A->
exp>
B->
exp)//A的指数大于B的指数
//将A的当前接点接到新链表后面,A后指
exp=B->
coef=B->
//将B的当前接点接到新链表后面,B后指
if(A==NULL&
&
B==NULL)//如果AB都为空
p->
returnhead;
//返回头指针
}
(3)其他函数(同组的成员设计)
#include<
iostream>
process.h>
usingnamespacestd;
typedefstructnode
floatcoef;
//系数
intexp;
//指数
structnode*next;
//指针域指向下一个系数不为0的子项
}PolyNode;
PolyNode*Input()//输入函数
floatc;
//系数域
inte;
//指数域
PolyNode*p,*q,*r,*head;
请输入多项式:
形式:
系数1指数1系数2指数2系数3指数3......00:
//建立头接点
p->
for(;
)
cin>
c>
e;
if(c==0&
e==0)break;
//结束输入
if(c==0)continue;
//从新输入,不保存
if(head->
next==NULL)//输入第一个接点
coef=c,p->
exp=e;
continue;
}
p=head;
while(p->
=NULL&
e<
=p->
exp)p=p->
//如果输入的指数小于p的下一个接点,p向后指
if(e==p->
exp){p->
coef+=c;
continue;
}//如果相等,直接加上去,继续循环
q=newPolyNode;
q->
coef=c,q->
if(p->
=NULL&
e>
exp)//如果p的后继接点的指数小于输入的指数,插入到p的当前接点之后
r=p->
next=q;
q->
next=r;
//如果输入的值小于所有接点,接在最后一个接点之后
p=p->
p->
输出函数
voidOutput(PolyNode*head)//输出
PolyNode*p;
p=head->
if(p==NULL){cout<
当前没有公式或计算结果为0,请选1输入!
!
return;
if(p!
cout<
计算结果:
coef<
X~"
p=p->
while(p!
+"
}
endl;
如果想重新输入公式,请选1输入!
\n\n"
4、调试分析与操作说明
(1)当程序运行时,进入主界面。
如图:
此时输入1-4选择操作
(2)输入1后按回车出现:
输入12345600后按回车之后会出现界面:
(3)求导:
输入2求导后按回车会出现结果:
结果正确。
(4)求和:
如果进入图4.3后输入3后按回车会出现界面:
图4.5求和界面
输入22446600后结果会出来:
图4.6求和结果
此系统在得到计算结果后可以直接用计算的结果进行下一步计算,如果不想用当前的结果,也可按“1”重新输入公式进行下一步计算
5、心得体会
经过这学期的学习,我对数据结构了解更深了一点,因为第一次修的时候没有认真的去修,所以没有及格,我很惭愧,所以再一次的修让我觉得我该好好学习这么课程,因为对后面的学习都很有影响。
通过做这次实验,我意识到,自己对C语言的掌握稍微熟练了一些;
在写程序的过程中,遇到一些问题是在所难免的,但我相信只要用心去做,就一定会有收获。