一元多项式加减.docx
- 文档编号:12782861
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:14
- 大小:104.06KB
一元多项式加减.docx
《一元多项式加减.docx》由会员分享,可在线阅读,更多相关《一元多项式加减.docx(14页珍藏版)》请在冰豆网上搜索。
一元多项式加减
荆楚理工学院
课程设计成果
学院:
_计算机工程学院_班级:
09级计算机科学与技术
(一)班
学生姓名:
…学号:
2009404010…
设计地点(单位)_观涧3栋104宿舍___
设计题目:
_一元多项式的计算_________
完成日期:
2011年01月03日
指导教师评语:
_______________________________________
___________________________________________________________________________________________________________________________________________________________________________________________________________________
成绩(五级记分制):
________________
教师签名:
_________________________
数据结构课程设计目录
第1节课程设计的问题描述
第2节本次设计的基本要求
第3节存储结构及基本算法
第4节源程序
第5节测试数据及结果
第6节算法的时间复杂度及改进
第7节参考资料
第1节课程设计的问题描述
能够按照指数降序排列建立并输出多项式;
能够完成两个多项式的相加、相减,并将结果输入;
第2节本次设计的基本要求
在上交资料中请写明:
存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
第3节存储结构及基本算法
存储结构:
一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。
基本算法:
1、输入输出
(1)功能:
将要进行运算的多项式输入输出。
(2)数据流入:
要输入的多项式的系数与指数。
(3)数据流出:
合并同类项后的多项式。
(4)程序流程图:
多项式输入流程图如图1所示。
(5)测试要点:
输入的多项式是否正确,若输入错误则重新输入。
图表1
2、多项式的加法
(1)功能:
将两多项式相加。
(2)数据流入:
输入函数。
(3)数据流出:
多项式相加后的结果。
(4)程序流程图:
多项式的加法流程图如图2所示。
(5)测试要点:
两多项式是否为空,为空则提示重新输入,否则,进行运算。
图表2
3、多项式的减法
(1)功能:
将两多项式相减。
(2)数据流入:
调用输入函数。
(3)数据流出:
多项式相减后的结果。
(4)程序流程图:
多项式的减法流程图如图3所示。
(5)测试要点:
两多项式是否为空,为空则提示重新输入,否则,进行运算。
图表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->expn
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->expn 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; } 第5节测试数据及结果 第6节算法的时间复杂及改进 算法的时间复杂度: 一元多项式的加法运算的时间复杂度为O(m+n),减法运算的时间复杂度为O(m-n),其中m,n分别表示二个一元多项式的项数。 问题和改进思想: 在设计该算法时,出现了一些问题,例如在建立链表时头指针的设立导致了之后运用到相关的指针时没能很好的移动指针出现了数据重复输出或是输出系统缺省值,不能实现算法。 实现加法时该链表并没有向通常那样通过建立第三个链表来存放运算结果,而是再度利用了链表之一来进行节点的比较插入删除等操作。 为了使输入数据按指数降序排列,可在数据的输入后先做一个节点的排序函数,通过对链表排序后再进行之后加减运算。 第7节参考资料 1.《数据结构C语言描述》李素若 2.荆楚理工学院《实验实践教学管理制度》文件 3.参考网站(http;//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 多项式 加减