数据结构链式表实现一元多项式加减乘运算课程方案实验报告Word文档下载推荐.docx

上传人:b****5 文档编号:19448635 上传时间:2023-01-06 格式:DOCX 页数:18 大小:130.28KB
下载 相关 举报
数据结构链式表实现一元多项式加减乘运算课程方案实验报告Word文档下载推荐.docx_第1页
第1页 / 共18页
数据结构链式表实现一元多项式加减乘运算课程方案实验报告Word文档下载推荐.docx_第2页
第2页 / 共18页
数据结构链式表实现一元多项式加减乘运算课程方案实验报告Word文档下载推荐.docx_第3页
第3页 / 共18页
数据结构链式表实现一元多项式加减乘运算课程方案实验报告Word文档下载推荐.docx_第4页
第4页 / 共18页
数据结构链式表实现一元多项式加减乘运算课程方案实验报告Word文档下载推荐.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构链式表实现一元多项式加减乘运算课程方案实验报告Word文档下载推荐.docx

《数据结构链式表实现一元多项式加减乘运算课程方案实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构链式表实现一元多项式加减乘运算课程方案实验报告Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。

数据结构链式表实现一元多项式加减乘运算课程方案实验报告Word文档下载推荐.docx

从实际的角度出发,这里设计的程序是基于一元n次多项式的数学模型。

1.2问题的数学模型

在数学上,一个一元多项式Pn(x>

可按升幂写成:

Pn(x>

=a0+a1x+a2x^2+…+anx^n-1.它由n+1个系数惟一确定,因此,在计算机里,它可用一个线性表P来表示:

Pn=(a0,a1,a2,…,an>

每一项的指数i隐含在其系数ai的序号里。

多项式的乘法规则:

多次运用单项式与多项式相乘的法则得到的.计算时(a+b>

(m+n>

,先把(m+n>

看成一个单项式,(a+b>

是一个多项式,运用单项式与多项式相乘的法则,得到(a+b>

=a(m+n>

+b(m+n>

然后再次运用单项式与多项式相乘的法则。

1.3构造数据结构

通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具有系数和指数,当系数为0时,该项就失去了意义,在计算机内要表示一个多项式,至少以下数据信息:

系数信息、指数信息和指向下一个单项式的指针。

通过指针,我们就可以把多个单项式连接起来,形式一个多项式,需要说明的是从广义的角度讲,单项式也是一个多项式。

基于以上的分析,我们定义多项式的数据结构为如下结构体形式:

typedefstructPolynomial{

floatcoef。

//系数

intexpn。

//指数

structPolynomial*next。

//指向下一个结点

}*Polyn,Polynomial。

//Polyn为结点指针类型

2系统分析

2.1可行性研究

该程序主要从技术的角度来分析可行性。

技术上的可行性研究主要分析技术条件能否顺利完成开发工作,硬、软件能否满足开发者的需要等。

该系统采用了WindowsXP操作系统结合VisualC++6.0,TC2.0等软件开发平台已成熟可行。

硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,其硬件平台也比较能满足此系统的需要。

此外,还有经济可行性,用户使用可行性,法律可行性等可行性研究,这里从简省去。

2.2系统结构与主要功能模块

从实现多项式式运算过程的角度来分析,至少需要这样一些子功能模块。

如:

1.多项式创建功能;

2.多项式运算功能;

3.操作界面显示功能;

4.销毁多项式的功能;

5.多项式复制功能等。

系统的整体流程和主要功能模块如图2-1所示

3系统设计

3.1系统设计目的与要求

3.2系统设计内容

多项式运算程序具有以下基本功能:

1.界面输出,提示如何输入数据。

要求先输入多项式的项数。

2.创建多项式。

接收输入的数据,并保存到链表中。

3.显示程序的功能表,允许使用者选择运算类型。

4.显示已经创建好的多项式。

6.实现加法运算。

7.实现减法运算。

8.实现乘法运算。

9.清除内存内容,销毁创建的链表,退出程序。

3.3功能算法描述与数据结构说明

该多项式程序除了main(>

函数外,主要有以下函数:

voidInsert(Polynp,Polynh>

PolynCreatePolyn(Polynhead,intm>

voidDestroyPolyn(Polynp>

voidPrintPolyn(PolynP>

intcompare(Polyna,Polynb>

PolynAddPolyn(Polynpa,Polynpb>

PolynSubtractPolyn(Polynpa,Polynpb>

PolynMultiplyPolyn(Polynpa,Polynpb>

下面对这些函数逐一介绍。

3.3.系统主要功能函数的详细设计

1. main<

)函数

main函数用来实现提示使用者输入、显示功能列表、调用其他运算函数实现运算功能。

在main<

)函数中,定义m、n用来保存两个多项式的项数,pa、pb、pc、pd、pf定义程序所需链表的头指针。

在程序开始要求输入两个多项式的项数,随后根据项数创建两个链表以保存多项式,再显示出功能列表后通过if语句来实现功能的选择,从而对整个程序流程进行控制。

2.PolynCreatePolyn(Polynhead,intm>

该函数功能是创建新的多项式链表。

intm保存的多项式的项数,使用for语句,控制输入多项式的每一项。

当创建的链表长度为m时,将不再提示用户继续输入多项式的系数和指数。

在该函数中要用到分配空间的函数malloc(>

为新建链表分配空间。

3.voidDestroyPolyn(Polynp>

该函数的功能是销毁掉创建的两个链表,释放内存。

以辅助退出程序。

4.voidInsert(Polynp,Polynh>

该函数功能:

将新的节点p插入到现有链表的后面,并确保多项式的指数exp是升序。

将s节点插入到head所指向的链表。

在该函数的操作中,要注意指针是如何移动的。

5.PolynAddPolyn(Polynpa,Polynpb>

实现两个多项式pa、pb相加,并将计算结果存储于新建立的pc中,

它的原理是将指数相同的单项式相加,系数相加后为0,则pa、pb的指针都后移。

在加法计算中要求pa,与pb的幂次序都是升序,否则可能得到错误的结果。

该函数调用了intcompare(Polyna,Polynb>

的结果,用来判断多项式在同一指数下a、b是否有为系数为0。

同样也使用了malloc(>

关键字,为新链表创建空间。

6.intcompare(Polyna,Polynb>

判断两个多项式在同一指数下是否有其中一个为系数为0。

用来辅助加法和乘法运算。

7.PolynSubtractPolyn(Polynpa,Polynpb>

实现两个多项式pa、pb相减,其原理根加法类似,将指数相同的指数相减。

与加法不同的是在送在减法中,创建了新的链表来存放结果,并返回该链表的头指针。

8.voidPrintPolyn(PolynP>

显示多项式链表。

在该函数中较复杂的是如何控制链表的输出,尤其是第一项的输出,同时还有符号的控制。

在输出第一项时要判断是不是常数项,若是,则不要输出字符x。

9.PolynMultiplyPolyn(Polynpa,Polynpb>

函数功能:

实现两个多项式相乘,A(X>

*B(x>

计算时运用单项式与多项式相乘的法则,然后再次运用单项式与多项式相乘的法则。

4系统实现

该程序实现了多项式的创建、多项式的加法、减法、乘法运算以及多项式的清除。

为完成这些功能,还用到了一些辅助函数。

下面讨论重要函数具体实现过程及其参数的意义:

1.PolynCreatePolyn(Polynhead,intm>

该函数的两个参数,head表示为创建的链表的头指针,m表示为链表的长度,即多项式的项数。

定义inti计数,当i<

m时,for语句反复提示用户输入该多项式的每一项的指数和系数,并保存。

当i=m时,输入完毕,该链表也创建完毕。

详细的实现过程如下:

{

inti。

//用来计数

Polynp。

//定义一个p链表

p=head=(Polyn>

malloc(sizeof(structPolynomial>

>

head->

next=NULL。

for(i=0。

i<

m。

i++>

p=(Polyn>

//建立新结点以接收数据

printf("

请输入第%d项的系数与指数:

"

i+1>

scanf("

%f%d"

&

p->

coef,&

expn>

Insert(p,head>

//调用Insert函数插入结点}

returnhead。

}//CreatePolyn

2.voidInsert(Polynp,Polynh>

该函数具有两个参数,用来实现链表的顺序排列和合并相同的项。

以下是实现插入的关键代码:

voidInsert(Polynp,Polynh>

{

if(p->

coef==0>

free(p>

//系数为0的话释放结点

else{//如果系数不为0

Polynq1,q2。

q1=h。

q2=h->

next。

while(q2&

&

expn<

q2->

{//查找插入位置

q1=q2。

q2=q2->

}

if(q2&

expn==q2->

{//将指数相同相合并

q2->

coef+=p->

coef。

if(!

coef>

{//系数为0的话释放结点

q1->

next=q2->

free(q2>

else{//指数为新时将结点插入

p->

next=q2。

next=p。

}

}//Insert

3.PolynAddPolyn(Polynpa,Polynpb>

该函数有两个参数,其类型均为polyn,分别表示要相加的两个不同的多项式。

其计算的结果存放在新建的pc所指向的链表中。

函数中调用了intcompare(Polyna,Polynb>

的结果。

下面是实现加法的关键代码:

{//求解并建立多项式a+b,返回其头指针

Polynqa=pa->

Polynqb=pb->

Polynheadc,hc,qc。

hc=(Polyn>

//建立头结点

hc->

headc=hc。

while(qa||qb>

qc=(Polyn>

switch(compare(qa,qb>

case1:

{

qc->

coef=qa->

expn=qa->

expn。

qa=qa->

break。

case0:

{

coef+qb->

qb=qb->

case-1:

coef=qb->

expn=qb->

}//switch

if(qc->

coef!

=0>

next=hc->

next=qc。

hc=qc。

elsefree(qc>

//当相加系数为0时,释放该结点

}//while

returnheadc。

}//AddPolyn

 intcompare(Polyna,Polynb>

if(a&

b>

b||a->

b->

return1。

elseif(!

a||a->

return-1。

elsereturn0。

a&

//a多项式已空,但b多项式非空

elsereturn1。

//b多项式已空,但a多项式非空

}//compare

4.PolynMultiplyPolyn(Polynpa,Polynpb>

该函数同加法一样,拥有相同的参数并且同样将新建立的链表pf的指针返回,用来实现输出乘法结果。

下面给出关键代码:

Polynhf,pf。

hf=(Polyn>

hf->

for(。

qa。

qa=qa->

next>

for(qb=pb->

qb。

qb=qb->

pf=(Polyn>

pf->

coef*qb->

expn+qb->

Insert(pf,hf>

//调用Insert函数以合并指数相同的项

}

returnhf。

}//MultiplyPolyn

5. 其它函数的介绍请参见附录中详细代码.

5调试及运行结果

该程序在VC6.0中调试通过,没有错误和警告,运行结果经过检验为正确。

以下图5-1即为该程序运行结果效果图。

图中采用的是计算多项式4x^5+2x^2+3x和x^10+7x^2的加减乘三种运算进行演示:

输入两个多项式的每一项值

提示功能选择

进行三则运算的结果

算法调试,运行结果图

6收获和体会

编程是一件枯燥乏味工作,但是只要认真专研,我们会从中学到很多在课本上学不到或者无法在课堂上掌握的知识,同时也能从中感受到编程的乐趣。

兴趣是可以培养的,只要坚持下去,面对困难我们总能够找到解决问题的方法。

计算多项式的加、减、乘法运算-----该程序虽然不是很大,这次还是由几位同学合作才完成这一任务。

在这个小组中我是组长,通过分工与合作,使我充分认识到在工程团队开发过程中合作的重要性,也更加理解了沟通协作能力在软件开发行业中的重要性。

另外也需要提出的是在这次程序设计的过程中,非常感谢老师对我们的耐心指导。

同样也是老师的严格要求才使得小组成员能够顺利的完成任务。

附录

#include<

stdio.h>

malloc.h>

/******************************************************/

/**********************************************************/

free(q2>

/*********************以下函数实现建立一个多项式****************/

{//建立一个头指针为head、项数为m的一元多项式

//在主程序初始时,先输入的多项式中的项数m、n在这里为m。

主程序中的pa、pb在此为head

//调用Insert函数插入结点

/**********************以下函数实现多项式的销毁**********************/

{//销毁多项式p

q1=p->

q2=q1->

while(q1->

free(q1>

//指针后移

/*******************以下函数实现显示输出多项式*******************/

Polynq=P->

intflag=1。

//项数计数器

q>

{//若多项式为空,输出0

putchar('

0'

\n"

return。

while(q>

if(q->

0&

flag!

=1>

+'

//系数大于0且不是第一项

=1&

q->

=-1>

{//系数非1或-1的普通情况

%g"

q->

expn==1>

X'

elseif(q->

X^%d"

else{

coef==1>

1'

elseprintf("

coef==-1>

-1"

-X"

-X^%d"

q=q->

flag++。

}//PrintPolyn

/*********************在下面的辅助乘法和加法运算****************/

/*********************以下函数实现加法*********************/

while(qa||qb>

malloc(sizeof(structPolyn

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1