一元多项式相加实验报告_第1页
一元多项式相加实验报告_第2页
一元多项式相加实验报告_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一元多项式相加实验报告一元多项式的相加一实验内容根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关法,应用于求解一个具体的实际问题 两个多项式相加二需求分析掌握线性结构的逻辑特性和物理特性。建立一元多项式。将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。能够完成两个多项式的加减运算,并输出结果。三概要设计本程序所用到的抽象数据类型:typedefOrderedLinkList polynomial;//用带表头结点的有序链表表示多项式结点的数据元素类型定义为:typedefstruct{//项的表示floatcoef;//系数int expn;//指数term,ElemType;VoidAddPolyn(polynomail&Pa,polynomail&Pb)PositionGetHead()PositionNextPos(LinkListL,Linkp)ElemGetCurElem(Linkp)intcmp(terma termb)StatusSetCurElem(Link&p,ElemTypee)StatusDelFirst(Linkh,Link&q)StatusListEmpty(LinkListL)StatusAppend(LinkList&L,LinkFreeNode()存储结构coefcoefexpnext项式的相加相减操作。模块划分a)主程序;2)初始化单链表;3)建立单链表;4)相加多项式a)主程序;2)初始化单链表;3)建立单链表;4)相加多项式主程序流程图开始开始申请结点空间输入多项式各项的系数X,指数Y输出已输出的多项式否是否输入正确合并同类项结束四详细设计根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对PolyAddpapb所指的两个多项式相加,结果为paqaqb分别从多项式的首项开始扫描2-5-1qa和qb可能出现下列三种情况之一:qa->expqb->exp,qa继续向后扫描。qa->expqb->exp,则将其系数相加。若相加结果不为零,将结果qa->coefqbqaqbqa、qb继续向后扫描。qa->expqb->exp,qbqa所指结点之前,然后qa、qb继续向后扫描。qaqbpa指向的链表即为两个多项式之和。五源程序代码#include<stdio.h>#include<malloc.h>#include<stdlib.h>#defineNULL0typedefstructNODE{float coef; //系数int expn; //指数structNODE*next;}NODE;NODE*Creat(intn);voidprint(NODENODE*AddPolyn(NODE*head1,NODE*head2);NODE*Delfirst(NODE*head,NODE*q);voidInsertBefore(NODE*p1,NODEint compare(inta,intb);main(){NODE*head1,*head2,*head3;intn1,n2;printf("请输入你需要的多项数的数目n1 :");scanf("%d",&n1);head1=Creat(n1);printf("第一个多项式的显示:\n");print(head1);printf("\n请输入你需要的多项数的数目n2 :scanf("%d",&n2);head2=Creat(n2);printf("\n第二个多项式的显示:print(head2);head3=AddPolyn(head1,head2);printf("\n合并后的多项式的显示:print(head3);printf("\n");}/*创建链表*/NODE*Creat(intn){NODE*current,*previous,*head;inti;head=(NODE*)malloc(sizeof(NODE));/*创建头结点*/previous=head;for(i=0;i<n;i++){current=(NODE*)malloc(sizeof(NODE));printf("请输入系数和指数:");scanf("%f%d",¤t->coef,¤t->expn);previous->next=current;previous=current;}previous->next=NULL;returnhead;}/*qaqbpb(00),pb里面由InsertBefore和Delfirst两个小模块组成一部分NODE *AddPolyn(NODE*head1,NODE*head2){NODE*ha,*hb,*qa,*qb;inta,b;floatsum;ha=head1; /*hahb指向头结点hb=head2;qa=ha->next; /*qaqb指向头结点的下一个结点qb=hb->next;while(qa&&qb) /*qaqb均非空*/{a=qa->expn;b=qb->expn;switch(compare(a,b)){case-1: /*qa->expn<qb->expn*/ha=qa;qa=qa->next;break;case0:sum=qa->coef+qb->coef; /*系数的和*/if(sum!=0.0){ /*如果不是qa->coef=sum; /*改变系数*/ha=qa;}else{free(Delfirst(ha,qa));}free(Delfirst(hb,qb));qa=ha->next;qb=hb->next; /*qb释放后要重新赋值*/break;case1: /*qa->expn>qb->Delfirst(hb,qb);InsertBefore(ha,qb); /*qbha下一个结点之前qb=hb->next;ha=ha->next;break;}}if(qb)ha->next=qb; /*free(head2);returnhead1;}/*比较*/intcompare(inta,intb){if(a<b)return-1;elseif(a>return1;elsereturn0;}/*删除结点q*/NODE*Delfirst(NODE*p1,NODE*q){p1->next=q->next;return(q);}/*插入结点,引入结点p,可以让p插入到p2和p1之间*/voidInsertBefore(NODE*p1,NODE*p2){NODE*p;p=p1->next;p1->next=p2;p2->next=p;}/*打印,为了美观程序分开打印*/voidprint(NODE*head){NODE*current;current=head->next;while(current->next!=NULL){printf("%0.f*x^%d+",current->coef,current->expn);current=current->next;}printf("%0.f*x^%d",current->coef,current->expn);}六调试分析

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论