一元多项式的加减求导运算算法(数据结构算法).doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 多项式 加减 求导 运算 算法 数据结构
- 资源描述:
-
实验题目:一元多项式运算 班级:13级数学一班 姓名: 张保昌 学号:2013433037 日期:2014—10—09 一、需求分析 1.问题描述; 设计一个简单的一元稀疏多项式加减及求导运算器。 2. 基本要求的功能要求; (1)输入多项式时可以按任意次序输入各项的数据(输入并建立多项式A与B),不必按指数有序;在算法中实现建立按指数有序的多项式。 (2)计算多项式A与B的和,即建立多项式A+B。 (3)按照指数升序次序,输出多项式A、B、A+B。 (4)计算多项式A与B的差,即建立多项式A-B; (5) 计算多项式A的导函数Aˊ 。 3. 测试数据。 (1)(x+3x6-8.6x11)+(6-3x6+21x9)=6+x+21x9-8.6x11 (2)(3x-3-x+4.1x2-1.2x9)+(―3x―3-5.1x2 +7.8x12)=-x-x2-1.2x9+7.8x12 (3)(x+x3)+(―x―x3)=0 (4)(x+x2+x3)+0=x+x2+x3 (5)(x+x2+x3)—(x+x2+x3)=0 (6) (x+x2+x3)ˊ=1+2x+3x2 二、概要设计 1.本程序所用的抽象数据类型的定义; typedef struct pnode { double coef; /*系数域*/ int exp; /*指数域*/ struct pnode *next; /*指针域,*/ }polynode, *polylink; polylink insert_list(polylink h,char o); //输入多项式。 polylink order_list(polylink h); //按指数升序排列 polylink simply_list(polylink h); //初步整理(合并多项式,并删除系数为零的式子) polylink add(polylink a,polylink b); //加法运算 polylink opposite(polylink b); //将减法统归为加法 polylink derivative(polylink a); //求导函数 void list_display(polylink h,char o); //输出显示 void index(); //菜单函数 2. 模块划分。 1)主函数模块。2)加法运算模块 3)减法运算模块 4)导数模块。 3. 主模块的流程及各子模块的主要功能; 开始 Mark? (2) 减法 运算 (1) 加法 运算 (3) 求导 运算 输入 两个 多项式 A 、B 输入 多项式 A 输入 两个 多项式 A 、B 初步简化整理 加法 运算器 初步简化整理 求导 运算器 初步简化整理 减法转化加法 输出结果 输出结果 三、详细设计 1.采用c++语言定义相关的数据类型; typedef struct pnode { double coef; /*系数域*/ int exp; /*指数域*/ struct pnode *next; /*指针域 }polynode, *polylink; Coef 系数域 Exp 指数域 *next 指针域 2. 写出各模块的伪码算法; void index() //菜单函数。 { cout<<" 一元多项式运算 "<<endl<<endl; cout<<" 1.一元多项式加法"<<endl; cout<<" 2.一元多项式减法"<<endl; cout<<" 3.一元多项式导数"<<endl; cout<<" 0. 结束 "<<endl<<endl<<endl; } polylink insert_list(polylink h,char o) //输入多项式 { h=new polynode; double coef1; int num,expo1; polylink temp; polynode *data; temp=h; h->next =NULL;//头结点 cout<<"多项式"<<o<<"的项数 : "; cin>>num; for(int i=1;i<=num;i++) { cout<<"请输入第"<<i<<"项"<<endl; cout<<"系数 :"; cin>>coef1; cout<<"指数 :"; cin>>expo1; data=new polynode; data->coef=coef1; data->exp =expo1; data->next =NULL; temp->next =data; temp=data; } return h; } polylink simply_list(polylink h) //初步化简,系数无0,无重复指数 { polylink p,q,r,k; p=h->next ; if(!p) return h; //空表 while(p) { k=p; q=k->next ; while(q) { if(q->exp==p->exp ) { r=q; q=q->next ; p->coef +=r->coef ; k->next =r->next ; delete r; } else { q=q->next ; k=k->next; } } p=p->next ; } k=h; q=h->next ; while(q) { if( q ->coef==0) { r=q; q=q->next ; k->next =r->next ; delete r; } else { q=q->next ; k=k->next ; } } return h; } void list_display(polylink h,char o) //显示多项式 { polylink p; double coef1; int expo1,i=0; p=h->next ; if(!p) { cout<<"多项式"<<o<<" : 0 "<<endl; } else cout<<"多项式"<<o<<" : "; while(p) { coef1=p->coef ; expo1=p->exp ; if(i==0) { if(expo1==0) { i=1; cout<<coef1; } else if(expo1==1) { i=1; if(coef1==1) cout<<"X"; else if(coef1==-1) cout<<"-X"; else cout<<coef1<<"X"; } else { i=1; if(coef1==1) cout<<"X^"<<expo1; else if(coef1==-1) cout<<"-X^"<<expo1; else cout<<coef1<<"X^"<<expo1; } } else { if(expo1==1) { if(coef1==1) cout<<"+X"; else if(coef1==-1) cout<<"-X"; else if(coef1>0) cout<<"+"<<coef1<<"X"; else cout<<coef1<<"X"; } else { if(coef1==-1) cout<<"-X^"<<expo1; else if(coef1==1) cout<<"+X^"<<expo1; else if(coef1>0) cout<<"+"<<coef1<<"X^"<<expo1; else cout<<coef1<<"X^"<<expo1; } } p=p->next ; } cout<<endl; } polylink order_list(polylink h) //升序排列 { polynode temp; polylink p,q,r; p=h->next; if(!p)return h; while(p->next) { q=p->next ; r=p; while(q) { if(q->exp <r->exp ) r=q; q=q->next ; } temp.coef =r->coef ; temp.exp =r->exp ; r->coef =p->coef ; r->exp =p->exp ; p->coef =temp.coef ; p->exp =temp.exp ; p=p->next ; } return h; } polylink add(polylink ha,polylink hb)//加法 { polylink a; a=ha; while(a->next ) a=a->next ; a->next =hb->next ; delete hb; ha=simply_list(ha); ha=order_list(ha); return ha; } polylink opposite(polylink b) { polylink hb; hb=b->next; while(hb) { hb->coef =(-1)*hb->coef; hb=hb->next ; } return b; } polylink derivative(polylink a)//求导 { polylink ha; ha=a->next ; while(ha) { ha->coef *=ha->exp ; ha->exp --; ha=ha->next ; } return a; } 四、调试分析 1.调试中遇到的问题及对问题的解决方法; 指针指向的错误。导致程序无法正常运行,经过逐步调试,发现了问题,认真分析指针指向的内存空间。并做了合理的修改。 2.算法的时间复杂度和空间复杂度。 polylink order_list(polylink h); O(n²) polylink simply_list(polylink h); O(n²) polylink add(polylink a,polylink b); O(n²) polylink opposite(polylink b);// O(n) polylink insert_list(polylink h,char o) O(n) polylink derivative(polylink a); //O(n) void list_display(polylink h,char o); O(n) void index(); O(1) 五、 使用说明及测试结果 根据提示语输入相应的信息。 如下为运行结果。 1) 菜单 2)加法 3)减法 4)导数 六、源程序 #include<iostream> using namespace std; typedef struct pnode { double coef; /*系数域*/ int exp; /*指数域*/ struct pnode *next; /*指针域,指向下一个系数不为0的子项*/ }polynode, *polylink; polylink insert_list(polylink h,char o); polylink order_list(polylink h); polylink simply_list(polylink h); polylink add(polylink a,polylink b); polylink opposite(polylink b); polylink derivative(polylink a); void list_display(polylink h,char o); void index(); void main() { index(); int mark=1; polylink A=NULL,B=NULL,C=NULL; char a='A',b='B',c='C',Da='d'; while(mark) { cout<<"请选择 --> mark="<<" "; cin>>mark; cin.get(); system("cls"); switch(mark) { case 1: A=B=C=NULL; cout<<" 一元多项式加法"<<endl<<endl; cout<<"请输入"; A=insert_list(A,a); B=insert_list(B,b); A=simply_list(A); A=order_list(A); B=simply_list(B); B=order_list(B); cin.get(); system("cls"); cout<<" 一元多项式加法"<<endl<<endl; list_display(A,a); list_display(B,b); cout<<endl; cout<<"多项式A与B相加得:"<<endl; C=add(A,B); list_display(C,c); break; case 2: A=B=C=NULL; cout<<" 一元多项式减法"<<endl<<endl; cout<<"请输入被减数"; A=insert_list(A,a); cout<<"请输入要减数"; B=insert_list(B,b); A=simply_list(A); A=order_list(A); B=simply_list(B); B=order_list(B); cin.get(); system("cls"); cout<<" 一元多项式减法 "<<endl<<endl; cout<<"被减数"; list_display(A,a); cout<<"减数"; list_display(B,b); cout<<endl; cout<<"多项式(A-B)得:"<<endl; B=opposite(B); C=add(A,B); list_display(C,c); break; case 3: A=NULL; cout<<" 一元多项式求导运算"<<endl; A=insert_list(A,a); A=simply_list(A); A=order_list(A); list_display(A,a); cout<<"其导数为:"<<endl; A=derivative(A); list_display(A,Da); system(“pause”) break; default: break; } if(mark==0) break; cin.get(); system("cls"); index(); } } void index() { cout<<" 一元多项式运算 "<<endl<<endl; cout<<" 1.一元多项式加法"<<endl; cout<<" 2.一元多项式减法"<<endl; cout<<" 3.一元多项式导数"<<endl; cout<<" 0. 结束 "<<endl<<endl<<endl; } polylink insert_list(polylink h,char o)//输入多项式 { h=new polynode; double coef1; int num,expo1; polylink temp; polynode *data; temp=h; h->next =NULL;//头结点 cout<<"多项式"<<o<<"的项数 : "; cin>>num; for(int i=1;i<=num;i++) { cout<<"请输入第"<<i<<"项"<<endl; cout<<"系数 :"; cin>>coef1; cout<<"指数 :"; cin>>expo1; data=new polynode; data->coef=coef1; data->exp =expo1; data->next =NULL; temp->next =data; temp=data; } return h; } polylink simply_list(polylink h)//初步化简,系数无0,无重复指数 { polylink p,q,r,k; p=h->next ; if(!p) return h;//空表 while(p) { k=p; q=k->next ; while(q) { if(q->exp==p->exp ) { r=q; q=q->next ; p->coef +=r->coef ; k->next =r->next ; delete r; } else { q=q->next ; k=k->next; } } p=p->next ; } k=h; q=h->next ; while(q) { if( q ->coef==0) { r=q; q=q->next ; k->next =r->next ; delete r; } else { q=q->next ; k=k->next ; } } return h; } void list_display(polylink h,char o)//显示 { polylink p; double coef1; int expo1,i=0; p=h->next ; if(!p) { cout<<"多项式"<<o<<" : 0 "<<endl; } else cout<<"多项式"<<o<<" : "; while(p) { coef1=p->coef ; expo1=p->exp ; if(i==0) { if(expo1==0) { i=1; cout<<coef1; } else if(expo1==1) { i=1; if(coef1==1) cout<<"X"; else if(coef1==-1) cout<<"-X"; else cout<<coef1<<"X"; } else { i=1; if(coef1==1) cout<<"X^"<<expo1; else if(coef1==-1) cout<<"-X^"<<expo1; else cout<<coef1<<"X^"<<expo1; } } else { if(expo1==1) { if(coef1==1) cout<<"+X"; else if(coef1==-1) cout<<"-X"; else if(coef1>0) cout<<"+"<<coef1<<"X"; else cout<<coef1<<"X"; } else { if(coef1==-1) cout<<"-X^"<<expo1; else if(coef1==1) cout<<"+X^"<<expo1; else if(coef1>0) cout<<"+"<<coef1<<"X^"<<expo1; else cout<<coef1<<"X^"<<expo1; } } p=p->next ; } cout<<endl; } polylink order_list(polylink h)//升序排列 { polynode temp; polylink p,q,r; p=h->next; if(!p)return h; while(p->next) { q=p->next ; r=p; while(q) { if(q->exp <r->exp ) r=q; q=q->next ; } temp.coef =r->coef ; temp.exp =r->exp ; r->coef =p->coef ; r->exp =p->exp ; p->coef =temp.coef ; p->exp =temp.exp ; p=p->next ; } return h; } polylink add(polylink ha,polylink hb)//加法 { polylink a; a=ha; while(a->next ) a=a->next ; a->next =hb->next ; delete hb; ha=simply_list(ha); ha=order_list(ha); return ha; } polylink opposite(polylink b) { polylink hb; hb=b->next; while(hb) { hb->coef =(-1)*hb->coef; hb=hb->next ; } return b; } polylink derivative(polylink a)//求导 { polylink ha; ha=a->next ; while(ha) { ha->coef *=ha->exp ; ha->exp --; ha=ha->next ; } return a; }展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




一元多项式的加减求导运算算法(数据结构算法).doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/12004564.html