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

上传人:b****1 文档编号:11002709 上传时间:2023-05-28 格式:DOCX 页数:13 大小:103.34KB
下载 相关 举报
数据结构课程设计报告一元多项式的计算.docx_第1页
第1页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第2页
第2页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第3页
第3页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第4页
第4页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第5页
第5页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第6页
第6页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第7页
第7页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第8页
第8页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第9页
第9页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第10页
第10页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第11页
第11页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第12页
第12页 / 共13页
数据结构课程设计报告一元多项式的计算.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

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

一元多项式的计算

一、需求分析

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

二、概要设计

存储结构:

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

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

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

基本算法:

1、输入输出

(1)功能:

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

(2)数据流入:

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

(3)数据流出:

合并同类项后的多项式。

(4)程序流程图:

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

(5)测试要点:

输入的多项式是否正确,若输入错误则重新输入

 

图表1

2、多项式的加法

(1)功能:

将两多项式相加。

(2)数据流入:

输入函数。

(3)数据流出:

多项式相加后的结果。

(4)程序流程图:

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

(5)测试要点:

两多项式是否为空,为空则提示重新输入,否则,进行运算。

 

图表2

 

 

3、多项式的减法

(1)功能:

将两多项式相减。

(2)数据流入:

调用输入函数。

(3)数据流出:

多项式相减后的结果。

(4)程序流程图:

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

(5)测试要点:

两多项式是否为空,为空则提示重新输入,否则,进行运算。

图表3

 

 

三、详细设计

#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

intcompare(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多项式非空

}//compare

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(compare(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;

}

四、调试结果

1.测试的数据及结果

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

算法的时间复杂度:

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

问题和改进思想:

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

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

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

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2