多项式的加法和乘法算术运算的C++实现

来源:互联网 发布:南瑞科技 知乎 编辑:程序博客网 时间:2024/06/07 06:22

数据结构第一部分实验后半段,实现多项式的加法和乘法,其中乘法部分难度更大。这个源码继承了部分上个实验的类,属于线性表的基本运算的拓展应用

Term.h:

#include <iostream.h>#include <string>class Term{public:    Term(int c,int e);    Term(int c,int e,Term* nxt);    Term* insertafter(int c,int e);    int coef;    int exp;    Term *link;private:    friend ostream &operator<<(ostream &,const Term &);    friend class Polynominal;};Term::Term(int c,int e){    coef=c;    exp=e;    link=NULL;}Term::Term(int c,int e,Term* nxt){    coef=c;    exp=e;    link=nxt;}Term* Term::insertafter(int c,int e){    link=new Term(c,e,link);    return link;}ostream &operator<<(ostream & out,const Term &val){    if(val.coef==0) return out;    out<<val.coef;    switch(val.exp)     {    case 0:        break;    case 1:        out<<"X";        break;    default:        out<<"X^"<<val.exp;        break;    }    return out;}

Polynominal.h:

#include "Term.h"#include <string>class Polynominal{     private:        Term *thelist;        friend ostream & operator<<(ostream &,const Polynominal &);        friend istream& operator>>(istream &,Polynominal &);        friend Polynominal& operator +(Polynominal &,Polynominal &);        friend Polynominal& operator *(Polynominal &,Polynominal &);     public:        Polynominal();        ~Polynominal();        void addterms(istream& in);        void addterms(int c,int e);        void padd(Polynominal & r);        void padd(int c,int e);        void pimul(Polynominal & r);        void output(ostream &out)const;};Polynominal::Polynominal(){    thelist=new Term(0,-1);    thelist->link=thelist;}Polynominal::~Polynominal(){    Term* p=thelist->link;    while(p!=thelist)    {        thelist->link=p->link;        delete p;        p=thelist->link;    }}void Polynominal::addterms(istream& in){    Term* q=thelist;    int c,e;    for(;;)    {        cout<<"input a term(coef,exp):\n"<<endl;        cin>>c>>e;        if(e<0) break;        q=q->insertafter(c,e);    }}void Polynominal::addterms(int c,int e){    if(e<0) return;    Term *q=new Term(0,-1);    Term *p=thelist;    q->coef=c;    q->exp=e;    q->link=thelist;    while(p->link->exp>0)    {        p=p->link;    }    p->link=q;}void Polynominal::output(ostream &out)const{    int first=1;    Term *p=thelist->link;    cout<<"the polynominal is:\n"<<endl;    for(;p!=thelist;p=p->link)    {        if(!first && (p->coef>0))  cout<<"+";        first=0;        cout<<*p;    }    cout<<"\n"<<endl;}void Polynominal::padd(Polynominal &r)     //要求输入的多项式必须是从大到小排好的{    Term *q,*q1=thelist,*p;    p=r.thelist->link;    q=q1->link;    while (p->exp>=0)     //遍历r    {        while(p->exp<q->exp)   //跳过q->exp大的项        {            q1=q;            q=q->link;        }        if(p->exp==q->exp)    //合并多项式        {            q->coef=q->coef+p->coef;            if(q->coef==0)           //相加等于0的处理            {                q1->link=q->link;                delete(q);                q=q1->link;            }            else            {                q1=q;                q=q->link;            }        }        else    //添加新项        {            q1=q1->insertafter(p->coef,p->exp);        }        p=p->link;    }    cout<<"1";}void Polynominal::padd(int c,int e){    Term *q,*q1=thelist;    q=q1->link;    while(e<q->exp)   //跳过q->exp大的项    {        q1=q;        q=q->link;    }    if(e==q->exp)    //合并多项式    {        q->coef=q->coef+c;        if(q->coef==0)           //相加等于0的处理        {            q1->link=q->link;            delete(q);            q=q1->link;        }    }    else    //添加新项    {        q1=q1->insertafter(c,e);    }   }void Polynominal::pimul(Polynominal &r){    Polynominal *a=this;    Term *p,*q;    p=thelist->link;    //p=左第一个    q=r.thelist->link;  //q=右第一个    Polynominal n;    while(p->exp>=0)    {        while(q->exp>=0)          //死循环了        {             n.padd(p->coef*q->coef,p->exp+q->exp);             q=q->link;        }        q=r.thelist->link;        p=p->link;    }    Term *np=n.thelist->link;    //以下为向this循环赋值    thelist->link->coef=0;    thelist->link->exp=-1;    thelist->link->link=thelist;    while(np->exp>=0)    {        a->addterms(np->coef,np->exp);        np=np->link;    }    a->addterms(0,-1);}

main.cpp:

#include "Polynominal.h"void main(){    Polynominal p,q,a;    cout<<"Next is for yourself...."<<endl;    cin>>p;    cout<<p;    cin>>q;    cout<<q;    q=q+p;    cout<<q;    cin>>a;    cout<<a;    q=q*a;    cout<<q;}
原创粉丝点击