数据结构课程设计一元多项式Word文件下载.docx
- 文档编号:21973960
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:24
- 大小:111.67KB
数据结构课程设计一元多项式Word文件下载.docx
《数据结构课程设计一元多项式Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元多项式Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
p的指数大于q的指数的话,就应该复制p节点到多形式中。
当第二个多项式为空时,第一个多项式不为空时,将第一个多项式用心节点产生。
当第一个多项式为空,第二个多项式不为空时,将第二个多项式用新节点产生
(6)一元多项式的减法计算
它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果数相等的话,系数就应该相减;
并且建立的节点的系数为原来的相反数;
当第一个多项式为空,第二个多项式不为空时,将第二个多项式用新节点产生,并且建立的节点系数为原来的相反数。
(7)一元多项式乘法运算
它从两个多项式的头部开始,两个多项式的某一项都不为空时,如果指数相等的话,系数就应该相乘;
相加的和不为0的话,用有插法建立一个新的节点p的指数小于q的指数的话,就应该复制q节点到多形式中。
p的指数大于q的指数的话,就应该复制p节点到多项式中,当第二个多项式为空,第一个多项式不为空时,将第一个多项式用新节点产生。
当第二个多项式为空,将第二个多项式用新节点产生。
输入模块
加法模块
减法模块
乘法模块
输出模块
输入系数和项数,生成多项式
对生成的多项式进行加法运算
对生成的多项式进行减法运算
对生成的多项式进行乘法运算
输出多项式,并释放结点
图1基本模块表
图2总体功能模块图
2.1.2数学模型
在数学上,一个一元多项式Pn(x)可按升幂写成:
Pn(x)=p0+p1x+p2x2+……+pnxn
它由n+1个系数唯一确定,因此,在计算机中它可用一个线性表P来表示:
P=(p0,p1,p2,……,pn)
每一项的指数i隐含在其系数Pi的序号里,每一项的值顺序为各个多项式的系数值。
加法模型
假设Qm(X)是一元m次多项式,同样可用线性表Q来表示:
Q=(q0,q1,q2,……qm)
不失一般性,设m<
n,则两个多项式相加的结果Rn(x)=P(x)+Q(x)也可用线性表R来表示,为了更具一般性,设n>
m,相加的结果也可以用单链表来表示,规则是相同指数的项的系数相加,所以P(x)+Q(x)=(p0+q0,p1+q1……pm+qm,pm+1……pn),例如:
P(x)=2x4+5x2+3x+1,Q(x)=3x2+1,相加后R(x)=2x4+8x2+3x+2,用一维向量表表示分别为(1,3,5,0,2)+(1,0,3,)=(2,3,8,0,2),写成数学形式即为2x4+8x2+3x+2,结论正确。
减法模型
假设Qm(X)是一元m次多项式,若以线性表Q表示,同上所述:
Q=(q0,q1,q2,……qn)
则两个多项式相减的结果可表示为Rn(x)=P(x)-Q(x),和加法的数学模型相似,可以描述为Rn(x)=P(x)+(-Q(x)),其相减的原理和加法一样,以数学表达式为P(x)-Q(x)=(p0-q0,p1-q1……pm-qm,pm+1……pn)举例说明:
设两个一元多项式分别为P(x)=2x4+5x2+3x+1和Q(x)=3x2+1,Rn(x)=P(x)-Q(x)=2x4+2x2+3x;
写成一维向量形式计算为(1,3,5,0,2)-(1,0,3)=(0,3,2,0,2),即证明该算法是可行的。
乘法模型
设两个一元多项式的线性表表示分别为Q=(q0,q1,q2,……qm)和P=(p0,p1,p2,……,pn),则两个多项式相乘的结果可以表示为R=P*Q,为了根据更具一般性,设n>
m(以下同),(p0,p1,p2,……,pn)*(q0,q1,q2,……qm)=(p0,p1,p2,……,pn)*q0+(0,p0,p1,p2,……,pn)*q1+……+(0,0,0,0……p0,p1,p2,……,pn)*qm,上述表达式中,每次相乘均要使第一个线性表表示的多项式右移一位,显然,乘最后一项pm时将右移m位0,两个多项式相乘的结果可以表示为m+1个一元n次多项式乘以一个单项式,而单项式乘以一元n次多项式还是一个一元n次多项式,最终将这m+1个一元多项式在相加,所以乘法的数学实现可以依靠一元n次多项式的加法模型。
为了能够清晰的表示上述过程,现简单举例如下:
设P(x)=2x2+3和Q(x)=3x2+2x,用数学表达式相乘的结果R(x)=6x4+4x3+9x2+6x,但在计算机中可以表示为(3,0,2)*(0,2,3)=(3,0,2)*0+(0,3,0,2)*2+(0,0,3,0,2)*3=(0,6,0,4)+(0,0,9,0,6)=(0,6,9,4,6);
显然,按照数学模型的定义,可以将最终的结果是(0,6,9,4,6)写成数学式6x4+4x3+9x2+6x,结果与笔算结果一致,该算法是可行的。
2.2.1定义函数及说明
struct-----定义结构体
createPoly-----创建一个多项式链表
outp_poly------输出一个多项式链表。
Addpoly--------多项式和的计算;
Decpoly--------多项式差的计算;
Mulpoly--------多项式积的计算;
DelPoly---------删除多项式;
2.2.2输入一个一元多项式的项数
#include<
stdlib.h>
stdio.h>
ctype.h>
typedefstructterm{//项的表示,多项式的项作为LinkList的数据元素
floatcoef;
//系数
intexpn;
//指数
structterm*next;
}term
2.2.3输入n个非零项
term*CreatPolyn(term*P,intm){//算法2.22
//输入m项的系数和指数,建立表示一元多项式的有序链表P
if(m<
=0)returnNULL;
term*h=P=(term*)malloc(sizeof(term)),*q;
P->
coef=0.0;
inti;
printf("
依次输入%d个非零项\n"
m);
for(i=1;
i<
=m;
++i){//依次输入m个非零项
scanf("
%f%d"
&
coef,&
expn);
if(P->
coef)
q=P;
P=P->
next=(term*)malloc(sizeof(term));
}
q->
next=NULL;
free(P);
returnh;
}//CreatPolyn
term*selsort(term*h){
term*g,*p,*q;
if(!
h)returnNULL;
floatf;
inti,fini=1;
for(g=h;
g->
next&
&
fini;
g=g->
next){
fini=0;
for(p=h,q=h->
next;
q;
p=p->
next,q=q->
next)
if(p->
expn<
q->
expn){
f=p->
coef;
i=p->
expn;
p->
coef=q->
expn=q->
coef=f;
expn=i;
fini=1;
for(g=h,p=g->
p;
)
if(g->
expn==p->
coef+=p->
next=p->
q=p;
free(q);
elseif(g->
}
2.2.4排序
表示多项式,最好按照习惯,以次数的降序来排列各项。
通过Xiang*Paixu(Xiang*h)函数,使一元多项式按照次数从大到小排列输出。
其算法如下:
Xiang*Paixu(Xiang*h)
{
flag=1;
for(g=h;
flag;
{
flag=0;
for(p=h,q=h->
if(p->
Zhishu<
Zhishu)
{
p<
==>
flag=1;
}
}
for(g=h,p=g->
if(g->
Zhishu==p->
{
g=g+p;
}
else
{
g=g->
p=p->
returnh;
然后调用Xiang*Jiafa(Xiang*Pa,Xiang*Pb)函数,再通过调用其子函数Xiang*APolyn(Xiang*Pa,Xiang*Pb),实现多项式加法,即Pa=Pa+Pb,利用两个多项式的结点构成"
多项式的和"
。
通过对Xiang*Jianfa(Xiang*Pa,Xiang*Pb)函数和Xiang*BPolyn(Xiang*Pa,Xiang*Pb)函数的调用,实现了多项式的减法,即Pa=Pa-Pb,利用两个多项式的结点构成"
多项式的差"
.通过调用Xiang*Chengfa(Xiang*Pa,Xiang*Pb)函数和Xiang*CPolyn(Xiang*Pa,Xiang*Pb)函数,实现了多项式的乘法运算,即Pa=Pa*Pb,利用两个多项式的结点构成"
多项式的积"
通过对输出函数voidShuchu(Xiang*P)的调用,把各一元多项式和一元多项式的计算结果输出来
2.2.5单连表的抽象数据类型定义:
ADTList{
数据对象:
D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,…,n}
基本操作:
InitList(﹠L)
//操作结果:
构造一个空的线性表
CreatPolyn(&
L)
构造一个以单连表存储的多项试
DispPolyn(L)
显示多项试
Polyn(&
pa,&
pb)
显示两个多项试相加,相减的结果
}ADTList
2.2.6加法,减法,乘法模块
函数功能:
实现两个多项式想加,并将计算结果存储于pa中
原理:
将指数相同的项的系数加
pa,与pb的幂次序都要求是升序,否则可能得到错误的结果
/加法模块函数如下:
voidaddPoly(Linkpa,Linkpb)
{
Linkpc,pre,u;
floatsum;
pc=pa;
pre=pa;
pa=pa->
u=pb;
pb=pb->
free(u);
while(pa&
pb){
if(pa->
exp<
pb->
exp){//如果当前pa的幂小于pb则指向pa中的下一个节点
}elseif(pa->
exp>
exp){
u=pb->
next=pa;
pre->
next=pb;
pre=pb;
pb=u;
}else{
sum=pa->
coef+pb->
//指数相加
if(sum!
=0.0){
pa->
coef=sum;
next=pa->
free(pa);
pa=pre->
if(pb)pre->
next=pb;
}//EndaddPoly
理论分析:
加法模块的实现比较简单,在这里需要说明的是,对同指数的项进行运算,所以所加法实际上是四则运算的基础
减法模块:
实现两个多项式相减
与加法类似,将指数相同的指数相减
乘法模块:
理论分析:
多项式乘法可以由两个一元多项式相加的算法来实现,因为乘法运算可以分解为一系列的加法运算。
假设A(x)和B(x)为如下的多项式,则
M(x)=A(x)*B(x)
=A(x)*[b1xe1+b2xe2+……+bnxen]
则会分解成很多个单项式乘以多项式的问题,即每一项都是一个一元多项式,最后又是一元单项式相加的问题。
2.3设计方法
1.输入一元多项式的个数
2.输入该多项式的非零项并显示出多项式
3.进行多项式的加减乘运算
2.4源程序
}term;
voidPrintfPoly(term*P){
term*q=P;
q){
putchar('
0'
);
return;
if(q->
coef!
=1){
%g"
q->
coef);
expn==1)putchar('
X'
elseif(q->
expn)printf("
X^%d"
elseif(!
expn)putchar('
1'
elseprintf("
q=q->
while(q){
coef>
0)putchar('
+'
Compare(term*a,term*b){
if(a->
b->
expn)return-1;
expn>
expn)return1;
return0;
term*APolyn(term*Pa,term*Pb){//算法2.23
//多项式加法:
Pa=Pa+Pb,利用两个多项式的结点构成"
和多项式"
term*h,*qa=Pa,*qb=Pb,*p,*q;
floatsum;
h=p=(term*)malloc(sizeof(term));
while(qa&
qb){//Pa和Pb均非空
switch(Compare(qa,qb)){
case-1:
//多项式PA中当前结点的指数值小
next=qb;
p=qb;
qb=qb->
break;
case0:
//两者的指数值相等
sum=qa->
coef+qb->
if(sum!
=0.0){//修改多项式PA中当前结点的系数值
next=qa;
qa->
p=qa;
qa=qa->
else{//删除多项式PA中当前结点
q=qa;
q=qb;
case1:
//多项式PB中当前结点的指数值小
}//switch
}//while
if(Pa)p->
//链接Pa中剩余结点
if(Pb)p->
//链接Pb中剩余结点
q=h;
h=h->
}//APolyn
term*A(term*Pa,term*Pb){
intn;
puts("
再输入一一元多项式的项数"
%d"
n);
Pb=CreatPolyn(Pb,n);
Pb=selsort(Pb);
PrintfPoly(Pa);
if(Pb&
Pb->
coef>
0)printf("
+"
PrintfPoly(Pb);
Pa=APolyn(Pa,Pb);
="
Pa=selsort(Pa);
returnPa;
term*BPolyn(term*Pa,term*Pb){//算法2.23
//多项式减法:
Pa=Pa-Pb,利用两个多项式的结点构成"
差多项式"
term*p=Pb;
while(p){
coef*=-1;
returnAPolyn(Pa,P
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 一元 多项式