1、5 程序类的说明 (1)Ploy结构声明typedef struct /顺序表结构声明 int aN;/记录多项式 int len;/记录多项式的长度Ploy; (2)term结构声明 typedef struct /项的表示 float coef; /系数 int expn; /指数term;(3)LNode结构声明typedef struct LNode term data; /term多项式值 struct LNode *next;LNode,*LinkList; /两个类型名typedef LinkList polynomail; /用带头结点的有序链表表示多项式6 模块分析 整个流程
2、图如图所示:图16.1 创建模块6.1.1、链式存储结构的一元多项式的创建程序源代码:polynomail creatpolyn(polynomail P,int m) /输入m项的系数和指数,建立表示一元多项式的有序链表P polynomail r,q,p,s,Q; int i; P=(LNode*)malloc(sizeof(LNode); r=P; for(i=0;idata.coef,&data.expn); r-next=s; r=s; next=NULL; if(P-next-next!=NULL) for(q=P-next;q!=NULL/*&q-=NULL*/;q=q-next
3、)/合并同类项 for(p=q-next,r=q;p!=NULL;) if(q-data.expn=p-data.expn) q-data.coef=q-data.coef+p-data.coef; r-next=p- Q=p; p=p- free(Q); else r=r- return P; 6.1.2、顺序存储结构一元多项式的创建void GetPloy(Ploy *A) int i,coef,ex,maxe=0; char ch;请输入每个项的系数及对应的指数,指数为负数时标志输入结束!n);N; A-ai=0;%d%dcoef,&ex); while(ex=0) if(exmaxe)
4、 maxe=ex; if(A-aex! printf(你输入的项已经存在,是否更新原数据?(Y/N) cinch; if(ch=Y|ch=y) A-aex=coef; printf(更新成功,请继续输入! else请继续输入!; else A- scanf( A-len=maxe; return ;6.2 一元多项式的加法6.2.1 链式存储两多项式相加polynomail addpolyn(polynomail pa,polynomail pb) /完成多项式相加运算,即:Pa=Pa+Pb polynomail s,newp,q,p,r; int j; p=pa- q=pb- newp=(L
5、Node*)malloc(sizeof(LNode); r=newp; while(p&q) switch(cmp(p-data,q-data) case -1: s-data.coef=p- s-data.expn=p-data.expn; r- r=s; p=p- break; case 0:data.coef+q- if(s-data.coef!=0.0) s- r-r=s; q=q- break; case 1:data.expn=q- /switch /while6.2.2 顺序存储的多项式相加void ADD(Ploy A,Ploy B,Ploy *M)/*多项式A与多项式B相加,
6、得到多项式M*/ int la=A.len,lb=B.len,i; M-len=lalb?la:lb;=la&=lb; M-ai=A.ai+B.ai; while(i case 0:data.coef-q- s- r=s;data.coef=-q- q=q- while(p) while(q) if(newp-=NULL&newp-=NULL)/合并同类项 for(q=newp-next) Q=p; free(Q); else r=r-p=p-升序 1 , 降序 2n选择:%dj); if(j=1) arrange1(newp); else arrange2(newp); return new
7、p;6.3.2顺序存储的多项式相减void SUB(Ploy A,Ploy B,Ploy *M)/*多项式A与多项式B相减(A-B),得到多项式M*/ai=A.ai-B.ai;=la) M-i+;=lb) M-ai=0-B.ai;6.4 一元多项式相乘6.4.1链式存储的多项式相乘polynomail mulpolyn(polynomail pa,polynomail pb) /完成多项式相乘运算,即:Pa=Pa*Pb int i=20,j; for(p=pa- for(q=pb- s=(LNode*)malloc(sizeof(LNode);data.coef*q-data.expn+q-
8、arrange1(newp); arrange2(newp); for(;i!=0;i-) for(q=newp- for(p=q;p- if(q- q- r=p- p- free(r); return newp;6.4.2顺序存储多项式相乘void MUL(Ploy A,Ploy B,Ploy *M)/*多项式A与多项式B相乘,得到多项式M*/ int i,j;=A.len+B.len+1;i+) M-=A.len; for(j=0;jai+j+=A.ai*B.aj;len=A.len+B.len;6.5一元多项式输出结果按项的指数排序6.5.1链式由小到大排序图6.6.1链式升序流程图vo
9、id arrange1(polynomail pa) polynomail h=pa,p,q,r; if(pa=NULL) exit(-2); for(p=pa;next); r=p; for(h=pa;h-=r;)/大的沉底 for(p=h;=r& if(cmp(p-data,p-data)=1) q=p- p-next=q- q-next=q;/r指向参与比较的最后一个,不断向前移动 6.5.2链式由大到小排序图6.6.2链式降序流程图void arrange2(polynomail pa)/小的沉底6.5.3顺序由大到小排序void PrintPloy1(Ploy A) /降序输出顺序一
10、元多项式 %dx%d ,A.aA.len,A.len); for(i=A.len-1;i=1; if(A.ai=0) ; else if(A.ai=1) printf( + x%d ,i); else if(A.ai=-1) printf( - x%d if(A.ai0) + %dx%d ,A.ai,i);- %dx%d ,-A.ai,i); if(A.a0=0) ; else if(A.a0 printf( + %d,A.a0);/打印x的0次项 - %d,-A.a0);6.5.4顺序由小到大排序void PrintPloy2(Ploy A) /升序输出顺序一元多项式 int i=0; while(A.ai=0) +i; if(i=0) ,A.ai); if(A.ai=1) x%d else if(A.ai=-1) -x%d%dx%d for(+i; else if(A.ai=1) + x%d else if(A.ai=-1) - x%d else if(A.ai1) + %dx%d else if(A.ai while(mm)你输入的输出新创一元多项式的
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1