设计函数分别求两个一元多项式的乘积与和(含排序)
C++代码(全指针,无引用):
#include<iostream> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string.h> using namespace std; //多项式相乘与相加 const int maxn=110010; typedef struct Node{ int expon; double coef; struct Node *next; }node,*pNode; pNode ReadPoly(pNode p){ int K; pNode q,r; scanf("%d",&K); p=new node; p->next=NULL; r=p; while(K--){ q=new node; scanf("%d %lf",&q->expon,&q->coef); r->next=q; r=r->next; } r->next=NULL; return p; } void printPoly(pNode p){ pNode q,r; int k=0; r=p->next; while(r) { if(r->coef!=0) { k++; } r=r->next; } printf("%d ",k); q=p->next; while(q){ if(q->coef==0){//系数为0,则不必输出 q=q->next; continue; } if(q->next!=NULL) { printf("%d %.1f ",q->expon,q->coef); } else{ printf("%d %.1f",q->expon,q->coef); } q=q->next; } printf(" "); } pNode Mult(pNode p1,pNode p2){ pNode ps,psn,ppp; ps=new node;//新链表头部 ps->expon=0; ps->coef=0; ps->next=NULL; // psn=pp;//新链表尾部 pNode p11,p22; p11=p1->next; int flog=0; // p22=p2->next; while(p11){ p22=p2->next;//返回链表第一个结点 while(p22){ ppp=new node; ppp->expon=p11->expon+p22->expon; ppp->coef=p11->coef*p22->coef; psn=ps;//返回链表头节点 flog=0; while(psn->next) { if(psn->next->expon==ppp->expon){ flog=1; break; } else{ psn=psn->next; } } if(flog==1){ psn->next->expon=ppp->expon; psn->next->coef=psn->next->coef+ppp->coef;//注意不要写错哦 } else{ psn->next=ppp; psn=psn->next; psn->next=NULL; } p22=p22->next; } p11=p11->next; } return ps; } pNode Add(pNode p1,pNode p2){ pNode ps,pp1,ppp;//pp指向链表头部,pp1指向链表尾部,ppp指向新节点 pNode p11,p22;//p11,p22都指向链表尾部 p11=p1->next; p22=p2->next; ps=new node; pp1=ps; while(p11&&p22){ ppp=new node; if(p11->expon>p22->expon){ ppp->expon=p11->expon; ppp->coef=p11->coef; pp1->next=ppp; pp1=pp1->next; p11=p11->next; } else if(p11->expon<p22->expon){ ppp->expon=p22->expon; ppp->coef=p22->coef; pp1->next=ppp; pp1=pp1->next; pp1->next=NULL; p22=p22->next; } else if(p11->expon==p22->expon){ ppp->expon=p11->expon; ppp->coef=p11->coef+p22->coef; pp1->next=ppp; pp1=pp1->next; p11=p11->next; p22=p22->next; } } if(p11!=NULL){ pp1->next=p11; } if(p22!=NULL){ pp1->next=p22; } return ps; } pNode sort(pNode p){//冒泡排序 pNode r,t; int ti; double td; r=p->next; while(r){ t=r->next; while(t){ if(t->expon>r->expon){ ti=t->expon; td=t->coef; t->expon=r->expon; t->coef=r->coef; r->expon=ti; r->coef=td; } t=t->next; } r=r->next; } return p; } int main(){ pNode p1,p2,pp,ps; p1=ReadPoly(p1); p2=ReadPoly(p2); pp=Mult(p1,p2); pp=sort(pp); printPoly(pp); ps=Add(p1,p2); pp=sort(pp); printPoly(ps); return 0; }
输入样例:
2 1 2.4 0 3.2 2 2 1.5 1 0.5
样本输出:
3 3 3.6 2 6.0 1 1.6 3 2 1.5 1 2.9 0 3.2
运行截图: