《2022年数据结构多项式运算器实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年数据结构多项式运算器实验报告 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、多项式运算器实验问题本实验主要实现对多项式的创建存储、显示、复制、求和、求差、求积、n 次方、 n 阶导、不定积分、定积分、求值、项数、销毁。储存结构typedef struct float coef; int expn; term,ElemType; typedef struct LNode ElemType data; struct LNode *next; *Link; typedef struct Link head,tail; int len; LinkList; 主要使用链表存储多项式。算法思想使用链表的处理方法。程序结构#include #include #include #in
2、clude typedef struct float coef; int expn; term,ElemType; typedef struct LNode ElemType data; struct LNode *next; *Link; typedef struct Link head,tail; int len; LinkList; /*=链表 -ADT=*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - void M
3、akeNode(Link &p,ElemType e) p=(Link)malloc(sizeof(struct LNode); if(!p) exit(1); p-data=e; p-next=NULL; /MakeNode void InitList(LinkList &L) L.head=L.tail=(Link)malloc(sizeof(LNode); if(!L.head) exit(1); L.head-next=NULL; L.len=0; /InitList void DestroyList(LinkList &L) Link p,q; p=L.head-next; whil
4、e(p) q=p-next; free(p); p=q; L.head-next=NULL; L.tail=L.head; L.len=0; /DestroyList void InsLast(LinkList &L,Link s) L.tail-next=s; L.tail=s; L.len+; L.tail-next=NULL; /InsLast /*=多项式 -ADT=*/ void CreatPolyn(LinkList &L) term e; Link s; scanf(%f,%d,&e.coef,&e.expn); while(e.coef) MakeNode(s,e); InsL
5、ast(L,s); scanf(%f,%d,&e.coef,&e.expn); /CreatPolyn 创建比较简单,主要调用了MakeNode() 、InsLast()两个函数。int Judge(int n) if(n19|nnext; if(!p) printf(NULLn); else printf(y=); if(p-data.coef0) if(p-data.expn=0) printf(%f,p-data.coef); else printf(%fx%d,p-data.coef,p-data.expn); p=p-next; else if(p-data.expn=0) prin
6、tf(%f,p-data.coef); else printf(%fx%d,p-data.coef,p-data.expn); p=p-next; while(p) if(p-data.coef0) if(p-data.expn=0) printf(+%f,p-data.coef); else printf(+%fx%d,p-data.coef,p-data.expn); p=p-next; else if(p-data.expn=0) printf(%f,p-data.coef); else printf(%fx%d,p-data.coef,p-data.expn); if(p-next)
7、p=p-next; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - printf(n); /PrintPolyn PrintPolyn()这个函数费了点事。主要是要考虑的情况有点多,所以函数就变长了。先考虑是否非空,还要考虑系数的正负,是否打印加号,而且第一项如果是正的不用打印加号,还要考虑是否越界。总之就是很复杂了。void PrintAll(LinkList S) int i; for(i=0;inext; while(p
8、) e.coef=p-data.coef; e.expn=p-data.expn; MakeNode(s,e); InsLast(S,s); p=p-next; S.tail-next=NULL; /CopyPolyn 比较简单,还是调用了MakeNode() 、InsLast()两个函数,与创建差不多。int AddPolyn(LinkList &L,LinkList P,LinkList Q) Link a,b,c; term e; a=P .head-next; b=Q.head-next; while(a!=NULL)&(b!=NULL) if(a-data.expndata.expn
9、) e.coef=a-data.coef; e.expn=a-data.expn; MakeNode(c,e); InsLast(L,c); a=a-next; else if(a-data.expnb-data.expn) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - e.coef=b-data.coef; e.expn=b-data.expn; MakeNode(c,e); InsLast(L,c); b=b-next;
10、 else if(a-data.coef+b-data.coef)!=0) e.coef=a-data.coef+b-data.coef; e.expn=a-data.expn; MakeNode(c,e); InsLast(L,c); a=a-next; b=b-next; else if(a-data.coef+b-data.coef)=0) a=a-next; b=b-next; if(!a&!b) L.tail-next=NULL; return 0; if(!b) while(a) e.coef=a-data.coef; e.expn=a-data.expn; MakeNode(c,
11、e); InsLast(L,c); a=a-next; if(!a) while(b) e.coef=b-data.coef; e.expn=b-data.expn; MakeNode(c,e); InsLast(L,c); b=b-next; return 0; /AddPolyn 主要是分情况讨论,a、b 都非空、都空,一空。还要考虑系数相加为零时的情况。这个开名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - 始时没有成功,
12、当一空一非空时运行不下去,但也检查不出错误来,放到最后,我把while里面的并列的if 改成 if、else if, else if,else if 就成功了,有点想不通。void SubtractPolyn(LinkList &L,LinkList P,LinkList Q) Link p; p=Q.head-next; while(p) p-data.coef=0-p-data.coef; p=p-next; AddPolyn(L,P,Q); p=Q.head-next; while(p) p-data.coef=0-p-data.coef; p=p-next; /SubtractPoly
13、n有求和了求差就简单了。先讲一个的系数变成原来的相反数,再相加, 再把它变回来。 开始时忘记了p=Q.head-next,出了点错误。double ResultPolyn(LinkList L,float x) Link p; double y=0; p=L.head-next; while(p) y+=(pow(x,p-data.expn)*p-data.coef); p=p-next; return y; /ResultPolyn 这个比较简单,不多说了。void MultiplyPolyn(LinkList &L,LinkList P ,LinkList Q) Link l,p,q; L
14、inkList E,F; InitList(E); InitList(F); int i,j; term e; p=P .head-next; q=Q.head-next; for(i=0;iQ.len;i+) for(j=0;jdata.coef*q-data.coef; e.expn=p-data.expn+q-data.expn; MakeNode(l,e); InsLast(E,l); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - -
15、- - - - p=p-next; AddPolyn(L,E,F); DestroyList(E); DestroyList(F); CopyPolyn(L,F); if(i!=Q.len-1) DestroyList(L); q=q-next; p=P .head-next; /MultiplyPolyn 这个我想的方法是创建两个临时的多项式,拿求积的一个多项式的项一次去乘另一个的项。结果存在一个临时多项式E,将初始的 L 复制给 F, 然后 E与 F相加复制给L, L 再赋值给F,销毁 E、 L。不断销毁赋值最后完成。注意最后一次不要销毁L。void Polyn_NFang(LinkLis
16、t &L,LinkList P ,int n) int i; LinkList E; InitList(E); CopyPolyn(P ,E); for(i=0;in;i+) MultiplyPolyn(L,E,P); DestroyList(E); CopyPolyn(L,E); if(i!=n-1) DestroyList(L); /Polyn_Nfang 这个也需要一个临时的多项式,还是不段销毁赋值。有了求积的基础,这个就简单了。void Polyn_NDao(LinkList &L,LinkList P,int n) Link p,q; int i,j; CopyPolyn(P ,L)
17、; for(i=0;inext; q=L.head; for(j=0;jdata.expn=0) q-next=p-next; free(p); p=q-next; L.len-; p-data.coef=p-data.coef*p-data.expn; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - p-data.expn=p-data.expn-1; p=p-next; q=q-next; /Polyn_Ndao 这个比较
18、简单,就是对系数和指数的更改。int Polyn_Ji(LinkList &L,LinkList P) Link p; int i; CopyPolyn(P ,L); p=L.head-next; for(i=0;idata.expn=-1) printf( 对不起,本程序不能实现对-1 次方的积分 .请重新选择 .n); DestroyList(L); return 0; else p=p-next; for(i=0;idata.coef=p-data.coef/(p-data.expn+1); +p-data.expn; p=p-next; return 0; /Polyn_Ji 这个还是
19、对系数和指数的更改,主要如果是-1 次方积分出现ln() ,这就麻烦了。故此,对含-1 次方的多项式不进行积分。double Polyn_Ding(LinkList L,float a,float b) double m,n; double e=0; LinkList P; InitList(P); Polyn_Ji(P ,L); m=ResultPolyn(P ,a); n=ResultPolyn(P ,b); e=n-m; return e; /Polyn_Ding 这个很简单,主要调用Polyn_Ji()和 ResultPolyn() 。/*=main=*/ void main() 名师
20、资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - int n,m,i,a,b,c; float x,e,f; double d; LinkList S20; for(i=0;i16|nnext) printf( 已占用 !请重新选择存储位置:); scanf(%d,&m); CreatPolyn(Sm); break; case 2: printf(2. 请选择位置 :); scanf(%d,&m); PrintPolyn(Sm);
21、 break; case 3: printf(3. 请选择要复制的多项式的位置和复制到的位置:); scanf(%d,%d,&a,&b); while(Sb.head-next) printf( 已占用 !请重新选择存储位置:); scanf(%d,&b); CopyPolyn(Sa,Sb); break; case 4: printf(4. 请输入需要求和的两个多项式位置及和放置的位置:); scanf(%d,%d,%d,&a,&b,&c); while(Sc.head-next) printf( 已占用 !请重新选择存储位置:); 名师资料总结 - - -精品资料欢迎下载 - - - -
22、- - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - scanf(%d,&c); AddPolyn(Sc,Sa,Sb); break; case 5: printf(5. 请输入需要求差的两个多项式位置及差放置的位置:); scanf(%d,%d,%d,&a,&b,&c); while(Sc.head-next) printf( 已占用 !请重新选择存储位置:n); scanf(%d,&c); SubtractPolyn(Sc,Sa,Sb); break; case 6: printf(6
23、. 请输入需要相乘的两个多项式及存储位置:); scanf(%d,%d,%d,&a,&b,&c); if(!Sa.head-next|!Sb.head-next) printf( 多项式位置选择错误!请重新选择 .n); break; while(Sc.head-next) printf( 已占用 !请重新选择存储位置:); scanf(%d,&c); MultiplyPolyn(Sc,Sa,Sb); break; case 7: printf(7. 请输入多项式的位置,n 次方及存储位置:); scanf(%d,%d,%d,&a,&b,&c); if(!Sa.head-next) print
24、f( 多项式位置选择错误!请重新选择 .n); break; while(Sc.head-next) printf( 已占用 !请重新选择存储位置:); scanf(%d,&c); Polyn_NFang(Sc,Sa,b); break; case 8: printf(8. 请输入多项式的位置,n 阶导及存储位置:); scanf(%d,%d,%d,&a,&b,&c); if(!Sa.head-next) printf( 多项式位置选择错误!请重新选择 .n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -
25、- - - - - - 第 10 页,共 12 页 - - - - - - - - - break; while(Sc.head-next) printf( 已占用 !请重新选择存储位置:); scanf(%d,&c); Polyn_NDao(Sc,Sa,b); break; case 9: printf( 请输入需要做不定积分的多项式及存储位置:); scanf(%d,%d,&m,&n); if(!Sm.head-next) printf( 多项式位置选择错误!请重新选择 .n); break; while(Sn.head-next) printf( 已占用 !请重新选择存储位置:); sc
26、anf(%d,&n); Polyn_Ji(Sn,Sm); break; case 10: printf( 请输入需要做定积分的位置及从m 积到 n 的值 :); scanf(%d,%f,%f,&a,&e,&f); if(!Sa.head-next) printf( 多项式位置选择错误!请重新选择 .n); break; d=Polyn_Ding(Sa,e,f); printf(y=%lfn,d); break; case 11: printf(11. 请输入需要求值的多项式的位置及x 值:); scanf(%d,%f,&m,&x); if(!Sm.head-next) printf( 多项式位
27、置选择错误!请重新选择 .n); break; d=ResultPolyn(Sm,x); printf(y=%lfn,d); break; case 12: printf(12. 请输入多项式的位置:); scanf(%d,&m); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - printf(%d 号项数为 %dn,m,Sm.len); break; case 13: printf(13. 请输入需要销毁的多项式的位置:)
28、; scanf(%d,&m); DestroyList(Sm); break; case 14: PrintAll(S); break; printf(n); printf( 说明:共有二十个多项式备用位置:019。n 菜单: n0t退出 n1t创建多项式 n2t显示多项式 n3t复制多项式 n4t多项式求和 n5t多项式求差 n6t多项式求积n7t 多项式 n次方 n8t 多项式 n 阶导 n9t 多项式不定积分n10t 多项式定积分 n11t 多项式求值 n12t 多项式项数 n13t 销毁多项式 n14t 查看存储状态n); printf( 请输入命令 :); scanf(%d,&n); printf( 谢谢使用O( _ )On); 在 main()函数中加人了不少纠错提醒功能,所以main()就变得很长了。主要是针对选择已占用的位置或者空位置进行提醒,使程序更加健壮,运行更加流畅。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -