【实验】一元多项式的相加与相乘
来源:互联网 发布:php httpclient cookie 编辑:程序博客网 时间:2024/05/17 06:10
数据结构上机实验。
实验要求:
根据所给的一元多项式相加的程序,写出一元多项式相乘的程序并调试通过。
注意:
1、最后得到的一元多项式采用两种输出格式,即数字格式和一般格式。
2、一般格式的多项式输出,按指数非递增顺序。
3、系数为0的项不予以输出(只有0项的多项式只输出0)。
#include <stdio.h>#include <stdlib.h>#include <math.h>#define null 0typedef struct {float coef;int expn;}term;typedef struct Lnode{term data;Lnode *next;}*Link,*Linklist;//比较函数,依a的指数值<(或=、或>)b的指数值,分别返回+1、0、和-1int cmp (term a,term b);//定位int LocateElem(Linklist L,term e,Link &s,Link &q,int(*comp)(term,term)); //删除结点 void Delnext(Linklist &L,Link s);//顺序插入 void Orderinsert(Linklist &L,term e,int (*comp)(term,term));//顺序混合插入 void Orderinsertmerge(Linklist &L,term e,int(*compara)(term,term));//建立链表 void Creatpolyn(Linklist &p,int m);//销毁链表 void DestroyList(Linklist &L);//完成多项式相加运算 void add(Linklist &La,Linklist &Lb);//完成多项式相乘运算 void mul(Linklist &La,Linklist &Lb,Linklist &Lc);//一元多项式输出方式1void printpolyn(Linklist p);//一元多项式输出方式2void printpolyn2(Linklist p);int main(){int x;char s1[2],s2[2];Linklist L1,L2,L3;while(1){printf("\n请输入第一个一元多项式的项数:");scanf("%d",&x);Creatpolyn(L1,x);printpolyn(L1);printf("\n请输入第二个一元多项式的项数:");scanf("%d",&x);Creatpolyn(L2,x);printpolyn(L2);printf("\n(1)加法 (2)乘法,请输入1 or 2:");scanf("%s",s1);if(s1[0]=='1'){add(L1,L2);printf("\n相加以后的一元多项式为:\n");printpolyn(L1);printpolyn2(L1);}else{Creatpolyn(L3,0);mul(L1,L2,L3);printf("\n相乘以后的一元多项式为:\n");printpolyn(L3);printpolyn2(L3);}printf("\n是否继续输入 yes or no:"); scanf("%s",s2);if(s2[0]!='y')break;}return 0;}int cmp (term a,term b){if(a.expn==b.expn) return 0;else return -(a.expn-b.expn)/abs(a.expn-b.expn);}int LocateElem(Linklist L,term e,Link &s,Link &q,int(*comp)(term,term)){Link p;s=L;p=s->next; while(p&&comp(p->data,e)!=0){s=p;p=p->next;}if(!p){s=q=null;return 0;}else{q=p;return 1;}}void Delnext(Linklist &L,Link s){Link q=s->next;s->next=q->next;free(q);}void Orderinsert(Linklist &L,term e,int (*comp)(term,term)){Link o,p,q;q=L;p=q->next;while(p&&comp(p->data,e)<0){q=p;p=p->next;}o=(Link)malloc(sizeof(Lnode));o->data=e;q->next=o;o->next=p;}void Orderinsertmerge(Linklist &L,term e,int(*compara)(term,term)){Link q,s;if(LocateElem(L,e,s,q,compara))//已存在与x指数相等项,则系数相加。 {q->data.coef+=e.coef;if(!q->data.coef)//如果当前data.coef==0,则删除结点,s指向q的前驱 {Delnext(L,s);}}else Orderinsert(L,e,compara);//若不存在,则顺序插入新节点 }void Creatpolyn(Linklist &p,int m){term e;int i;p=(Link)malloc(sizeof(Lnode));//建立头结点 p->next=null;if(!m) return ;//当m==0,不执行下面的语句(为了建立Lc表) printf("\n请输入%d个系数和指数,用空格符隔开:\n",m);for(i=1;i<=m;i++){scanf("%f%d",&e.coef,&e.expn);Orderinsertmerge(p,e,cmp);}}void DestroyList(Linklist &L)//销毁链表 {Link p;while(L->next){p=L->next;L->next=p->next;free(p);}free(L);}void add(Linklist &La,Linklist &Lb)//实现加法运算,用顺序混合插入函数实现 {Link qb;term b;qb=Lb->next;while(qb){b=qb->data;Orderinsertmerge(La,b,cmp);qb=qb->next;}DestroyList(Lb);//销毁Lb链表 }void mul(Linklist &La,Linklist &Lb,Linklist &Lc)//实现乘法运算,完成后销毁La、Lb链表 {Link qa,qb,qc;term e;qa=La->next;qc=Lc;while(qa){qb=Lb->next;while(qb){e.coef = qa->data.coef * qb->data.coef;e.expn = qa->data.expn + qb->data.expn;if(e.coef != 0.0) Orderinsertmerge(qc,e,cmp);qb=qb->next;}qa=qa->next;}DestroyList(La);DestroyList(Lb);}void printpolyn(Linklist p){Link q;q=p->next;printf("系数指数\n");if(q==null){printf("00\n"); return ;}while(q){printf("%8.2f%-d\n",q->data.coef,q->data.expn);q=q->next;}}void printpolyn2(Linklist p){Link q;q=p->next;printf("P(x) = ");if(q==null){printf("0\n"); return ;}printf("%.2f*X^%d ",q->data.coef,q->data.expn);q=q->next;while(q){if(q->data.coef>0)printf("+ %.2f*X^%d ",q->data.coef,q->data.expn);else if(q->data.coef<0)printf("- %.2f*X^%d ",-q->data.coef,q->data.expn);q=q->next;}printf("\n");}
测试数据一(选择1为加法):
3
1 1
2 2
3 3
2
1 2
2 3
1
测试数据二(选择2为乘法):
3
1 1
2 2
3 3
2
1 2
2 3
2
测试数据三(相加后出现系数为0的情况):
3
1 1
2 2
3 3
2
-1 1
-2 2
1
测试数据四(相加后结果只有0项):
1
-1 1
1
1 1
1
2 0
- 【实验】一元多项式的相加与相乘
- 一元多项式的相加、相乘
- 数据结构实验1(一元多项式的相加和相乘)
- 一元多项式相加与相乘(C++)
- 南邮数据结构实验1 一元多项式的相加和相乘
- 南邮数据结构实验1.3 一元多项式的相加和相乘
- 数据结构课程设计一元多项式的相加和相乘
- 数据结构 一元多项式的创建、显示、相加、相减、相乘
- 一元多项式的相乘
- 实验2 一元多项式相加
- 一元多项式的相加
- 多项式相乘与相加演示
- 多项式的相乘和相加
- 一元多项式的相加运算
- 一元多项式的相加减
- 【数据结构 链表的应用】一元多项式相加及相乘 和对问题的分析
- 线性表的应用---一元多项式的表示与相加
- 一元多项式相乘
- 引用传递出现错误
- select联动(C#+.NET MVC+Jquery)
- 互联网创业公司如何规模化研发团队?
- commons-fileupload的详细介绍与使用
- 黑马程序员--C语言之指针<二>
- 【实验】一元多项式的相加与相乘
- Debian安装memcached和php5-memcache模块
- Dateformat
- Python Scapy(2.3.1)文档学习(六):添加新的协议
- 冒泡排序
- 理解JMS规范中消息的传输模式和消息持久化
- enctype=“multipart/form-data”的使用
- 图解Linux命令之--alias命令
- 六、机器学习系统设计笔记之分类II情感分析