ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:141.99KB ,
资源ID:16203897      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16203897.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验一参考Word下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验一参考Word下载.docx

1、(1) 链接存储结构:此方法中用到的抽象数据类型为结构体:struct node float coef; int expo; struct node *next;link;主程序中给提示建立第一个多项式,并依次调用create函数、order函数和hebing函数,通过调用print函数输出原多项式和整理过后的新多项式。同理建立并输出第二个多项式,最后通过调用add函数,将两多项式相加,并调用order函数进行整理,最后调用print函数输出结果多项式。(2) 顺序存储结构struct polyfloat coef;int expo;dxs15,dxs115,dxs230;主函数中也会给出提示

2、建立第一个多项式,并依次调用create函数和order函数,通过两次调用print函数输出原多项式和整理过后的新多项式。之后,将多项式保存,然后同理建立第二个多项式,最后调用add函数,将两多项式相加。调用print函数输出结果多项式。因为此方法中我将合并函数加到order函数里,所以没有单一的hebing函数模块。3 详细设计(1) 链接存储结构此方法中定义了一个结构体类型: /定义系数为float类型数据 /定义指数为int类型数据struct node *next;struct node *create() /定义建立多项式函数,并返回链表头指针 struct node *h=NULL

3、,*q,*p; /定义结构体头指针h,标记指针p和q int i=1,N; /定义多项式的项数N及标记数i for(;icoef);%dexpo); if(i=1) h=p;q=p; else q-next=p; q=p; next=NULL; p- return h;struct node *order(struct node *h) /定义排序函数,并返回整理后的链表的头指针 struct node *p,*q,*t,*h1,*h2; /定义三个结构体标记指针和两个头指针 h1=h; /建立一个新的链表,头指针为h,指向原链表的第一个节点,之后将原链表中的节点一个一个的插入此链表,进行排序

4、 h2=h1-next; /将原来的链表建立成待排序链表 h1- /截断第一个原链表中的节点 while(h2!=NULL) q=h1; p=q- t=h2; /从待排序链表中选出一个节点准备插入到新链表中 h2=h2- /移动待排序链表的头指针,便于进行下一次挑选 t- if(t-expoq-expo) /应插入头指针之前的情况next=q; h1=t; continue; if(p=NULL&t-expoexpo) q-next=t; /应插入表尾的情况 while(p!expo) break; q=q- p=p- if(p=NULL) q- return h1; /新链表即为按降幂顺序排

5、好的链表,返回其头指针struct node *hebing(struct node *h) /定义合并函数,并返回合并后的链表的头指针 struct node *p,*q,*r; /定义三个结构体标记指针 p=h; q=p- while(q! if(p-expo=q-coef=p-coef+q-coef; r=q- free(q);next=r; if(r! q=r- p=r;void print(struct node *h) /定义输出链表函数 struct node *p; /定义标记指针,输出链表coef=0) p=p- /系数为零时跳过coef else printf( (%.2f

6、)*X%d +coef,p- %.2f + %.2f*X%d + printf(bb n);struct node *add(struct node *h1,struct node *h2) /定义加法函数,并返回结果的链表的头指针 struct node *p,*q,*head,*r; /定义结构体头指针head和标记指针p,q,r p=h1; q=h2; head=(struct node *)malloc(sizeof(link);expo) head=h1;p=p-expo) head=h2;q=q- else p-head=p; r=head;=NULL&q!expo) r-r- r

7、=r-q=NULL) r- if(p=NULL) r- if(q=NULL) r- return head;main() struct node *h1,*h2,*h3; /定义三个结构体头指针标记多项式 h1=create(); h1=order(h1); h1=hebing(h1); print(h1); h2=create(); h2=order(h2); h2=hebing(h2); print(h2); h3=add(h1,h2); h3=hebing(h3); print(h3);此方法中也定义一个结构体类型:void create(int n) /定义建立结构体数组函数 int

8、i; /定义数组中的循环标记数据i for(i=0;n;dxsi.coef);dxsi.expo);void print(int n) /定义结构体数组输出函数 if(dxsi.coefvoid order(int n) /定义排序函数 int i,temp1,j; /定义数组中的循环标记数据i与j,和整型标记temp1 float temp2; /定义单精度型标记temp2n-1; for(j=i+1;jdxsi.expo) temp1=dxsj.expo; dxsj.expo=dxsi.expo; dxsi.expo=temp1; temp2=dxsj.coef; dxsj.coef=dx

9、si.coef; dxsi.coef=temp2; if(dxsi.expo=dxsi+1.expo) dxsi+1.coef=dxsi.coef+dxsi+1.coef; if(i=n-2) dxsi.coef=dxsi+1.coef; dxsi+1.coef=0; for(j=i; dxsj.coef=dxsj+1.coef; dxsj.expo=dxsj+1.expo; dxsj.coef=0; i-;void add(int n1,int n2) /定义加法函数 int i=0,j=0,p,m; /定义数组中的循环标记数据i,j,p,m for(p=0;p+) if(dxsi.expo

10、=dxs1j.expo) dxs2p.coef=dxsi.coef+dxs1j.coef; dxs2p.expo=dxsi.expo; i+; j+; if(dxsi.expodxs1j.expo) dxs2p.coef=dxsi.coef; dxs2p.coef=dxs1j.coef; dxs2p.expo=dxs1j.expo; if(i=n1|j=n2) p+; if(i=n1)n2;n1; for(m=0;mp;m+) if(dxs2m.coef int n1,n2,i; /定义多项式的项数n1与n2,和循环标记数据in1); create(n1); order(n1); print(

11、n1);i+) dxs1i.coef=dxsi.coef; dxs1i.expo=dxsi.expo;n2); create(n2); order(n2); print(n2); add(n1,n2);4 调试分析在此方法的实现过程中,没有比较大的麻烦,因为最近一直在用链表进行编程,已经比较熟悉了链表的基本操作,只是在一些实现方便与否、接近真实情况与否进行了一番思考。首先,我因为做题的习惯,所以没有考虑到假如输入多项式时可以打乱顺序输入,即不按照降幂或升幂的形式进行输入。意识到可能有此情况后,我就添加了一个order函数,对输入的原多项式进行排序,解决掉因打乱顺序输入而导致程序出错的可能性。之

12、后,又有人提出,假如多项式中有指数相同的项,那如果没有合并一类作用的函数做整理的话,也会出错。因此,我又着手编一个合并函数。合并函数其实不难,只要把原多项式进行排序后就变得很简单了。只需要将指数相同的项的系数进行加法运算,之后删去后一个节点即可。最后,还有一个输出形式的问题。因为假如系数是负数的时候,需要将其用括号括起来,这也是数学运算中的规定。因此,我又对输出函数:print函数进行了一些修改,并且在修改过程中又发现,假如指数为零时,输出的应该是只有系数,所以我又顺便将这方面的漏洞加以补充。当然,我这个程序毕竟还是有不足之处的。一、没有利用到链表的一项基本操作:删除节点。在输出过程中,我对系

13、数为零的节点的处理方式是跳过,而不是删除,虽然不会影响到最终的输出结果,但对内存其实是有一些浪费,毕竟程序需要的不仅是结果正确,而且还要做到时间和空间上的节约。二、当一项的指数为1时,应当输出的是X,而不是X1,所以此方面仍需要改进。虽然此项改进不是很难,但由于时间紧迫,没有来得及修改,但我会在以后的空闲时间内将其完善。在算法的时空复杂度上,我没有进行过多的考虑,因为现在自己的水平还没有那么高,我只知道,在排序函数中,我用的冒泡排序方法是一种效率很低的方法,时间复杂度为O(n2)。而同学向我推荐过的一种插入排序方法,一种部分有序的排序方法,算下来时间复杂度为O(n2-n),因此自己还需要将此程

14、序加以改进。在此方法的实现过程中,我确实费了很大的时间。因为数组很长时间没有用到过了,很多基本操作又比链表复杂,因此,我花了相当长的时间才将此程序完成。定义结构体数组方面虽然很简单,但用起来就会变的相当复杂,并且由于自己的数组方面的知识不是很牢靠,因此,语法错误很多,调试费了很长的时间,并且很多次无法通过编译。最终在同学的帮助下,自己又花了大量的时间,终于将程序编出。因为程序需要的作用函数已在链表方法中掌握,所以此项内容里我没有进行更多的考虑,只是感觉用结构体数组实现的时候,将排序函数和合并函数写在一起会更加方便,所以此方法中我只设置了一个排序函数,并且在做加法的函数中附带了输出作用,因此不再

15、调用print函数输出数组。但此相加的函数似乎有点问题,在多项式比较复杂的时候,输出总是有点问题。自己研究了很长时间之后还是找不出问题,希望老师能发现并指出,完善此程序。通过编此程序,我感觉到自己在数组的知识点上掌握的不够扎实,以后还需多加练习,熟练掌握数组的基本操作方法。5 用户使用说明运行程序后,会出现提示:请输入第一个多项式请输入多项式的项数:(这时应输入其项数(整型数据),后按回车键;比如输入:2)请输入第1项的系数:请输入第1项的指数:(比如依次输入2,2)请输入第2项的系数:请输入第2项的指数:(比如依次输入3,3)输入的第一个多项式为:2.00*X2 + 3.00*X3按降幂排列后多项式为:3.00*X3 + 2.00*X2请输入第二个多项式;(比如输入:(比如依次输入1,1)1.00*X1 + 2.00*X22.00*X2 + 1.00*X1相加后的多项式为:3.00*X3 + 4.00*X2 + 1.00*X1请输入第一个多项式的项数:您输入的第一个多项式为:降幂排序后该多项式变为:请输入第二个多项式的项数:两个多项式相加后的结果为:6 测试结果7 附录#includestdio.hstdlib.hN);请输入第%d项的系数:,i); fflush(stdin);请输入第%d项的指数: /建立头节点

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1