【实验】一元多项式的相加与相乘

来源:互联网 发布: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
原创粉丝点击