数据结构课程设计报告一元多项式加减乘除文档格式.docx
- 文档编号:17839699
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:38
- 大小:249.69KB
数据结构课程设计报告一元多项式加减乘除文档格式.docx
《数据结构课程设计报告一元多项式加减乘除文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告一元多项式加减乘除文档格式.docx(38页珍藏版)》请在冰豆网上搜索。
1.2国内外研究的现状
顺序存储和链式存储实现简单的计算运算是计算机实现的最简单最低的基本功能,
顺序存储和链式存储是计算各种功能的基础,随着计算机的研究不断发展,现在国内外的研究都达到非常稳定和成熟的程度。
1.3任务与分析
本课题主要的目的是分别采用顺序和动态存储结构实现一元多项式的加法、减法和乘法。
并将操作结果分别按升序和降序输出。
2程序的主要功能
2.1一元多项式创建
建立一元多项式的顺序表和链式表,按程序提示输入每个项数据结束创建。
借助元素在存储器中的相对位置来表示数据元素之间的关系,顺序表中第i个位置表示一元多项式的第i项的系数为第i个位置存放的内容,指数为i-1。
用链表来表示只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个term项结构和指向下一个节点的指针域,term又包括系数和指数两个域分别存放该项的系数、。
2.2一元多项式的加法
对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;
对于两个一元多项式中所有指数不相同的项,则分别复抄到和多项式中去。
2.3一元多项式的减法
对于两个一元多项式中所有指数相同的项,对应系数相减,若其差不为零,则构成“和多项式”中的一项;
对于两个一元多项式中所有指数不相同的项,将其按减法规则复抄到差多项式中去。
2.4一元多项式的乘法
将乘法运算分解为一系列的加法运算利用两个一元多项式相加的算法实现。
2.5一元多项式项的指数比较
比较相邻两项的指数的大小。
按升序排列时,前面项的指数大于后面项的指数就交换其项的位置。
按降序序排列时,后面项的指数大于前面项的指数就交换其项的位置。
2.6一元多项式运算结果升降排序
一元多项式运算结果选择调用降序或升序排序函数。
2.7一元多项式的输出
将选择的运算操作结果输出。
2.8一元多项式的销毁
销毁已建立的两个多项式,释放空间。
3程序运行平台
VC++6.0。
编译,链接,执行。
WindowsXP。
4总体设计
图4.1系统总体框架图
5程序类的说明
(1)Ploy结构声明
typedefstruct//顺序表结构声明
{
inta[N];
//记录多项式
intlen;
//记录多项式的长度
}Ploy;
(2)term结构声明
typedefstruct//项的表示
{floatcoef;
//系数
intexpn;
//指数
}term;
(3)LNode结构声明
typedefstructLNode
{termdata;
//term多项式值
structLNode*next;
}LNode,*LinkList;
//两个类型名
typedefLinkListpolynomail;
//用带头结点的有序链表表示多项式
6模块分析
整个流程图如图所示:
图1
6.1创建模块
6.1.1、链式存储结构的一元多项式的创建
程序源代码:
polynomailcreatpolyn(polynomailP,intm)
{
//输入m项的系数和指数,建立表示一元多项式的有序链表P
polynomailr,q,p,s,Q;
inti;
P=(LNode*)malloc(sizeof(LNode));
r=P;
for(i=0;
i<
m;
i++)
{
s=(LNode*)malloc(sizeof(LNode));
printf("
请输入第%d项的系数和指数:
"
i+1);
scanf("
%f%d"
&
s->
data.coef,&
data.expn);
r->
next=s;
r=s;
}
next=NULL;
if(P->
next->
next!
=NULL)
for(q=P->
next;
q!
=NULL/*&
&
q->
=NULL*/;
q=q->
next)//合并同类项
for(p=q->
next,r=q;
p!
=NULL;
)
if(q->
data.expn==p->
data.expn)
{
q->
data.coef=q->
data.coef+p->
data.coef;
r->
next=p->
Q=p;
p=p->
free(Q);
}
else
{
r=r->
returnP;
}
6.1.2、顺序存储结构一元多项式的创建
voidGetPloy(Ploy*A)
inti,coef,ex,maxe=0;
charch;
请输入每个项的系数及对应的指数,指数为负数时标志输入结束!
\n"
);
N;
A->
a[i]=0;
%d%d"
coef,&
ex);
while(ex>
=0)
{
if(ex>
maxe)
maxe=ex;
if(A->
a[ex]!
{
printf("
你输入的项已经存在,是否更新原数据?
(Y/N)"
cin>
>
ch;
if(ch=='
Y'
||ch=='
y'
)
{
A->
a[ex]=coef;
printf("
更新成功,请继续输入!
}
else
请继续输入!
;
}
else
A->
scanf("
A->
len=maxe;
return;
}
6.2一元多项式的加法
6.2.1链式存储两多项式相加
polynomailaddpolyn(polynomailpa,polynomailpb)
//完成多项式相加运算,即:
Pa=Pa+Pb
polynomails,newp,q,p,r;
intj;
p=pa->
q=pb->
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&
q)
switch(cmp(p->
data,q->
data))
case-1:
s->
data.coef=p->
s->
data.expn=p->
data.expn;
r->
r=s;
p=p->
break;
case0:
data.coef+q->
if(s->
data.coef!
=0.0)
{
s->
r->
r=s;
}
q=q->
break;
case1:
data.expn=q->
}//switch
}//while
6.2.2顺序存储的多项式相加
voidADD(PloyA,PloyB,Ploy*M)
/*多项式A与多项式B相加,得到多项式M*/
intla=A.len,lb=B.len,i;
M->
len=la>
lb?
la:
lb;
=la&
=lb;
M->
a[i]=A.a[i]+B.a[i];
while(i<
=la)
a[i]=A.a[i];
i++;
=lb)
a[i]=B.a[i];
return;
6.3一元多项式相减
6.3.1链式存储的多项式相减
/*3、两多项式相减*/
polynomailsubpolyn(polynomailpa,polynomailpb)
//完成多项式相减运算,即:
Pa=Pa-Pb
polynomails,newp,q,p,r,Q;
p=p->
case0:
data.coef-q->
r=s;
data.coef=-q->
q=q->
while(p)
while(q)
if(newp->
=NULL&
newp->
=NULL)//合并同类项
for(q=newp->
next)
Q=p;
free(Q);
else
{r=r->
p=p->
升序1,降序2\n"
选择:
%d"
j);
if(j==1)
arrange1(newp);
else
arrange2(newp);
returnnewp;
6.3.2顺序存储的多项式相减
voidSUB(PloyA,PloyB,Ploy*M)
/*多项式A与多项式B相减(A-B),得到多项式M*/
a[i]=A.a[i]-B.a[i];
=la){M->
i++;
=lb){M->
a[i]=0-B.a[i];
6.4一元多项式相乘
6.4.1链式存储的多项式相乘
polynomailmulpolyn(polynomailpa,polynomailpb)
//完成多项式相乘运算,即:
Pa=Pa*Pb
inti=20,j;
for(p=pa->
for(q=pb->
{
s=(LNode*)malloc(sizeof(LNode));
data.coef*q->
data.expn+q->
arrange1(newp);
arrange2(newp);
for(;
i!
=0;
i--)
for(q=newp->
for(p=q;
p->
if(q->
{
q->
r=p->
p->
free(r);
}
returnnewp;
6.4.2顺序存储多项式相乘
voidMUL(PloyA,PloyB,Ploy*M)
/*多项式A与多项式B相乘,得到多项式M*/
inti,j;
=A.len+B.len+1;
i++)M->
=A.len;
for(j=0;
j<
=B.len;
j++)
M->
a[i+j]+=A.a[i]*B.a[j];
len=A.len+B.len;
6.5一元多项式输出结果按项的指数排序
6.5.1链式由小到大排序
图6.6.1链式升序流程图
voidarrange1(polynomailpa)
{polynomailh=pa,p,q,r;
if(pa==NULL)exit(-2);
for(p=pa;
next);
r=p;
for(h=pa;
h->
=r;
)//大的沉底
{for(p=h;
=r&
if(cmp(p->
data,p->
data)==1)
{q=p->
p->
next=q->
q->
next=q;
//r指向参与比较的最后一个,不断向前移动
}}
6.5.2链式由大到小排序
图6.6.2链式降序流程图
voidarrange2(polynomailpa)
)//小的沉底
6.5.3顺序由大到小排序
voidPrintPloy1(PloyA)//降序输出顺序一元多项式
%dx^%d"
A.a[A.len],A.len);
for(i=A.len-1;
i>
=1;
if(A.a[i]==0);
elseif(A.a[i]==1)printf("
+x^%d"
i);
elseif(A.a[i]==-1)printf("
-x^%d"
if(A.a[i]>
0)
+%dx^%d"
A.a[i],i);
-%dx^%d"
-A.a[i],i);
if(A.a[0]==0);
elseif(A.a[0]>
printf("
+%d"
A.a[0]);
//打印x的0次项
-%d"
-A.a[0]);
6.5.4顺序由小到大排序
voidPrintPloy2(PloyA)//升序输出顺序一元多项式
inti=0;
while(A.a[i]==0)
++i;
if(i==0)
A.a[i]);
if(A.a[i]==1)
x^%d"
elseif(A.a[i]==-1)
-x^%d"
%dx^%d"
for(++i;
elseif(A.a[i]==1)
+x^%d"
elseif(A.a[i]==-1)
-x^%d"
elseif(A.a[i]>
1)
+%dx^%d"
elseif(A.a[i]<
-1)
-%dx^%d"
6.6一元多项式运算系统实现
6.6.1主菜单系统
voidMenu()
************一元多项式的基本运算系统************\n"
1、一元多项式顺序存储的子系统请按1\n"
2、一元多项式链式存储的基本运算请按2\n"
3、退出系统请按3\n"
************************************************\n"
请输入你想进行的操作号:
intn;
n);
while(n!
=1&
n!
=2&
=3)
对不起,你的输入不正确,请重新输入!
switch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 一元 多项式 加减乘除