一元多项式的计算数据结构课程设计报告.docx

上传人:b****9 文档编号:25635385 上传时间:2023-06-10 格式:DOCX 页数:17 大小:42.98KB
下载 相关 举报
一元多项式的计算数据结构课程设计报告.docx_第1页
第1页 / 共17页
一元多项式的计算数据结构课程设计报告.docx_第2页
第2页 / 共17页
一元多项式的计算数据结构课程设计报告.docx_第3页
第3页 / 共17页
一元多项式的计算数据结构课程设计报告.docx_第4页
第4页 / 共17页
一元多项式的计算数据结构课程设计报告.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

一元多项式的计算数据结构课程设计报告.docx

《一元多项式的计算数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《一元多项式的计算数据结构课程设计报告.docx(17页珍藏版)》请在冰豆网上搜索。

一元多项式的计算数据结构课程设计报告.docx

一元多项式的计算数据结构课程设计报告

一元多项式的计算—加,减

 

摘要(题目)一元多项式计算

任务:

能够按照指数降序排列建立并输出多项式;

能够完成两个多项式的相加、相减,并将结果输入;

 

1.引言

2.需求分析

3.概要设计

4.详细设计

5.测试结果

6.调试分析

7.设计体会

8.完毕语

 

一:

引言:

通过C语言使用链式存储构造实现一元多项式加法、减法和乘法的运算。

按指数降序排列。

 

二:

需求分析

建立一元多项式并按照指数降序排列输出多项式,将一元多项式输入并存储在存中,能够完成两个多项式的加减运算并输出结果

 

三:

概要设计

存储构造:

一元多项式的表示在计算机可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。

链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。

创立一元多项式链表,对一元多项式的运算中会出现的各种可能情况进展分析,实现一元多项式的相加、相减操作。

1.单连表的抽象数据类型定义:

ADTList{数据对象:

D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}数据关系:

R1={|ai-1,ai∈D,i=2,…,n}

根本操作:

InitList〔&L〕

//操作结果:

构造一个空的线性表

CreatPolyn(&L)

//操作结果:

构造一个以单连表存储的多项试

DispPolyn(L)

//操作结果:

显示多项试

Polyn(&pa,&pb)

//操作结果:

显示两个多项试相加,相减的结果

}ADTList

2.本程序包含模块:

typedefstructLNode//定义单链表

{

}LNode,*LinkList;

voidInitList(LinkList&L)//定义一个空表

{}

voidCreatPolyn(LinkList&L)//用单链表定义一个多项式

{}

voidDispPolyn(LinkListL)//显示输入的多项式

{}

voidPolyn(LinkList&pa,LinkList&pb)

{}

voidmain()

{

//定义一个单连表;

cout<

***************"<

LNode*L1,*L2;

Polyn(L1,L2);}

2.1加,减操作模块——实现加减操作

各模块之间的调用关系如下:

 

主程序模块

加法操作模块减法操作模块

 

用户菜单

多项式链表

各函数

退出

指针数组

主函数

根本算法:

1、输入输出

〔1〕功能:

将要进展运算的多项式输入输出。

〔2〕数据流入:

要输入的多项式的系数与指数。

〔3〕数据流出:

合并同类项后的多项式。

〔4〕程序流程图:

多项式输入流程图如图1所示。

〔5〕测试要点:

输入的多项式是否正确,假设输入错误那么重新输入

 

图表1

开场

申请结点空间

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

num

输入多项式的项数

 

指针数组temp[i]中〔i=1~num〕

输入多项式各项的系数x,指数y

输出已输入的多项式

合并同类项

完毕

是否输入正确

 

2、多项式的加法

〔1〕功能:

将两多项式相加。

〔2〕数据流入:

输入函数。

〔3〕数据流出:

多项式相加后的结果。

〔4〕程序流程图:

多项式的加法流程图如图2所示。

〔5〕测试要点:

两多项式是否为空,为空那么提示重新输入,否那么,进展运算。

 

图表2

开场

定义存储结果的空链r

输出存储多项式的和的链r

完毕

同指数项系数相加后存入r中

直接把p中各项存入r中

直接把q中各项存入r

存储多项式2的空链Q是否为空

存储多项式1的空链P是否为空

合并同类项

 

3、多项式的减法

〔1〕功能:

将两多项式相减。

〔2〕数据流入:

调用输入函数。

〔3〕数据流出:

多项式相减后的结果。

〔4〕程序流程图:

多项式的减法流程图如图3所示。

〔5〕测试要点:

两多项式是否为空,为空那么提示重新输入,否那么,进展运算。

图表3

开场

定义存储结果的空链r

输出存储多项式的和的链r

完毕

同指数项系数相加后存入r中

把p中各项系数改变符号后存入r中

直接把q中各项存入r

存储多项式2的空链Q是否为空

存储多项式1的空链P是否为空

合并同类项

 

四.详细设计

1.根据题目要求采用单连表存储构造

typedefstructLNode//定义单链表

{

}LNode,*LinkList;

voidInitList(LinkList&L)//定义一个空表

{}

voidCreatPolyn(LinkList&L)//用单链表定义一个多项式

{}

voidDispPolyn(LinkListL)//显示输入的多项式

{}

voidPolyn(LinkList&pa,LinkList&pb)

{}

2.主函数main

voidmain()

{

LNode*L1,*L2;

Polyn(L1,L2);

}

2.函数的调用关系层次构造

多项式Polyn用单链表定义多项式CreatPolyn定义一个空表InitList显示输入的多项式DispPolyn

}

五.调试分析

采用单连表形式按照指数降序排列建立并输出多项式;在相加,相减的过程中如果指数一样就执行系数相加,相减,否那么就把大的项直接写入。

完成两个多项式的相加、相减;将从新得到的单连表结果输出;该算法的时间复杂度为两个多项式的项式之和

 

六:

调试结果

1.测试的数据及结果

2.算法的时间复杂度及改良

算法的时间复杂度:

一元多项式的加法运算的时间复杂度为O(m+n〕,减法运算的时间复杂度为O(m-n),其中m,n分别表示二个一元多项式的项数。

问题和改良思想:

在设计该算法时,出现了一些问题,例如在建立链表时头指针的设立导致了之后运用到相关的指针时没能很好的移动指针出现了数据重复输出或是输出系统缺省值,不能实现算法。

实现加法时该链表并没有向通常那样通过建立第三个链表来存放运算结果,而是再度利用了链表之一来进展节点的比拟插入删除等操作。

为了使输入数据按指数降序排列,可在数据的输入后先做一个节点的排序函数,通过对链表排序后再进展之后加减运算。

七.心得体会:

一元多项式计算是一个的单链表的运用,通过这个程序可以测我们以前的学习情况,看看我们是否对单链表真正的理解。

一元多项式计算器的根本功能定为:

(1)建立多项式

(2)输出多项式

(3)两个多项式相加,建立并输出和多项式

(4)两个多项式相减,建立并输出差多项式能够按照指数降序排列建立并输出多项式;

能够完成两个多项式的相加、相减,并将结果输出;

完毕语:

时间过的很快,在不知不觉中,课程设计也接近了尾声.说起课程设计,我认为最重要的就是做好设计的预习,并且认真的去复习以前的知识和查各种资料同时认真的研究教师给的题目,教师对题目的讲解要一丝不苟的去听去想,因为只有都明白了,做起设计来才会有底,有信心。

课程设计是一门培养学生综合运用所学知识,发现,提出,分析和解决实际问题的学科,它能充分锻炼我们的动手能力,时我们实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。

我想这次不只是一次简单的课程设计,更表达了数据构造算法和生活的严密联系。

生活中也存在许多与数据构造有关联的事情,它让人不得不深思,这一个学期的学习,这两年来的大学学习生涯,自己终究学会了什么,掌握了多少,我也不清楚,我以前也疯狂的玩过,现在才知道自己时多么的缺乏知识,大多数问题自己不能解决,感觉将来自己是否能胜任以后作编译人员的职位。

我想大家都心里都有很多的感触。

对于自己,我想我已经认识到了自己的缺乏,在今后的学习过程中,我一定以最好的心态去对待,以最好的面貌来迎接大三的软件专业课程,并且经常上机调试,坚持理论与实践相结合。

相信自己将会有很大的进步。

附录详细设计

#include

#include

typedefstructPolynomial{

floatcoef;

intexpn;

structPolynomial*next;

}*Polyn,Polynomial;//Polyn为结点指针类型

voidInsert(Polynp,Polynh){

if(p->coef==0)free(p);//系数为0的话释放结点

else{

Polynq1,q2;

q1=h;q2=h->next;

while(q2&&p->expnexpn){//查找插入位置

q1=q2;

q2=q2->next;

}

if(q2&&p->expn==q2->expn){//将指数一样相合并

q2->coef+=p->coef;

free(p);

if(!

q2->coef){//系数为0的话释放结点

q1->next=q2->next;

free(q2);

}

}

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

p->next=q2;

q1->next=p;

}

}

}//Insert

PolynCreatePolyn(Polynhead,intm){//建立一个头指针为head、项数为m的一元多项式

inti;

Polynp;

p=head=(Polyn)malloc(sizeof(structPolynomial));

head->next=NULL;

for(i=0;i

p=(Polyn)malloc(sizeof(structPolynomial));//建立新结点以接收数据

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

",i+1);

scanf("%f%d",&p->coef,&p->expn);

Insert(p,head);//调用Insert函数插入结点

}

returnhead;

}//CreatePolyn

voidDestroyPolyn(Polynp){//销毁多项式p

Polynq1,q2;

q1=p->next;

q2=q1->next;

while(q1->next){

free(q1);

q1=q2;//指针后移

q2=q2->next;

}

}

voidPrintPolyn(PolynP){

Polynq=P->next;

intflag=1;//项数计数器

if(!

q){//假设多项式为空,输出0

putchar('0');

printf("\n");

return;

}

while(q){

if(q->coef>0&&flag!

=1)putchar('+');//系数大于0且不是第一项

if(q->coef!

=1&&q->coef!

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

printf("%g",q->coef);

if(q->expn==1)putchar('X');

elseif(q->expn)printf("X^%d",q->expn);

}

else{

if(q->coef==1){

if(!

q->expn)putchar('1');

elseif(q->expn==1)putchar('X');

elseprintf("X^%d",q->expn);

}

if(q->coef==-1){

if(!

q->expn)printf("-1");

elseif(q->expn==1)printf("-X");

elseprintf("-X^%d",q->expn);

}

}

q=q->next;

flag++;

}//while

printf("\n");

}//PrintPolyn

intpare(Polyna,Polynb){

if(a&&b){

if(!

b||a->expn>b->expn)return1;

elseif(!

a||a->expnexpn)return-1;

elsereturn0;

}

elseif(!

a&&b)return-1;//a多项式已空,但b多项式非空

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

}//pare

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

Polynqa=pa->next;

Polynqb=pb->next;

Polynheadc,hc,qc;

hc=(Polyn)malloc(sizeof(structPolynomial));//建立头结点

hc->next=NULL;

headc=hc;

while(qa||qb){

qc=(Polyn)malloc(sizeof(structPolynomial));

switch(pare(qa,qb)){

case1:

{

qc->coef=qa->coef;

qc->expn=qa->expn;

qa=qa->next;

break;

}

case0:

{

qc->coef=qa->coef+qb->coef;

qc->expn=qa->expn;

qa=qa->next;

qb=qb->next;

break;

}

case-1:

{

qc->coef=qb->coef;

qc->expn=qb->expn;

qb=qb->next;

break;

}

}//switch

if(qc->coef!

=0){

qc->next=hc->next;

hc->next=qc;

hc=qc;

}

elsefree(qc);//当相加系数为0时,释放该结点

}//while

returnheadc;

}//AddPolyn

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

Polynh=pb;

Polynp=pb->next;

Polynpd;

while(p){//将pb的系数取反

p->coef*=-1;

p=p->next;

}

pd=AddPolyn(pa,h);

for(p=h->next;p;p=p->next)//恢复pb的系数

p->coef*=-1;

returnpd;

}//SubtractPolyn

intmain(){

intm,n,flag=0;

floatx;

Polynpa=0,pb=0,pc,pd,pe,pf;//定义各式的头指针,pa与pb在使用前付初值NULL

printf("请输入a的项数:

");

scanf("%d",&m);

pa=CreatePolyn(pa,m);//建立多项式a

printf("请输入b的项数:

");

scanf("%d",&n);

pb=CreatePolyn(pb,n);//建立多项式a

//输出菜单

printf("**********************************************\n");

printf("操作提示:

\n\t1.输出多项式a和b\n\t2.建立多项式a+b\n\t3.建立多项式a-b\n");

printf("\t4.退出\n**********************************************\n");

for(;;flag=0){

printf("执行操作:

");

scanf("%d",&flag);

if(flag==1){

printf("多项式a:

");PrintPolyn(pa);

printf("多项式b:

");PrintPolyn(pb);continue;

}

if(flag==2){

pc=AddPolyn(pa,pb);

printf("多项式a+b:

");PrintPolyn(pc);

DestroyPolyn(pc);continue;

}

if(flag==3){

pd=SubtractPolyn(pa,pb);

printf("多项式a-b:

");PrintPolyn(pd);

DestroyPolyn(pd);continue;

}

if(flag==4)break;

if(flag<1||flag>4)printf("Error!

!

!

\n");continue;

}//for

DestroyPolyn(pa);

DestroyPolyn(pb);

return0;

}

 

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

当前位置:首页 > 自然科学 > 物理

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

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