zoukankan      html  css  js  c++  java
  • 多项式加法和乘法(链表实现)

    数据结构树上的代码~~练习留着以后复习

    //Polynomial.h
    
    #include <iostream>
    using namespace std;
    
    struct PNode
    {
        int di;
        int ci;
        PNode *next;
        PNode(PNode *n=NULL){next=n;}
        PNode(int& d,int& c,PNode *n=NULL)
        {
            di=d;
            ci=c;
            next=n;
        }
    };
    class Polynomial{
    protected:
        PNode *first;
    public:
        Polynomial()  {first=new PNode;}
        Polynomial(int& d,int & c) 
        {
            first=new PNode(d,c);
        }  
        bool insert();                        //插入
        PNode* gethead()
        {
            return first;
        }   
        Polynomial(Polynomial &P1,Polynomial &P2);   //多项式1 2相加放入3中
        int getmax();              //返回最大阶数
        friend Polynomial operator +(Polynomial &P1,Polynomial &P2);        //多项式加法
        friend Polynomial operator *(Polynomial &P1,Polynomial &P2);        //多项式乘法
        friend ostream& operator<<(ostream & out,Polynomial &P)            //输出
        {
            PNode *p=P.gethead()->next;
            while(p->next!=NULL)
            {
                if (p->ci==0)
                {
                    out<<"x+";
                }
                else if(p->ci==1)
                {
                    out<<p->di<<"x+";
                }
                else
                    out<<p->di<<"x^"<<p->ci<<"+";
                p=p->next;
            }
            if (p->next==NULL)
            {
                if (p->ci==0)
                {
                    out<<"1"<<endl;
                }
                else if(p->ci==1)
                {
                    out<<p->di<<"x"<<endl;
                }
                else
                    out<<p->di<<"x^"<<p->ci<<endl;
                p=p->next;
            }
            return out;
        }   
    };
    
    bool Polynomial::insert()
    {
        PNode *p=gethead();
        while(p->next=NULL)
            p=p->next;
        cout<<"依次输入底数和指数(以底数0结束)"<<endl;
        int d,c;
        cout<<"d=";
        cin>>d;
        cout<<"c=";
        cin>>c;
        while (d!=0)
        {
            PNode *q=new PNode(d,c);
            p->next=q;
            p=q;
            cout<<"d=";
            cin>>d;
            cout<<"c=";
            cin>>c;
        }
        return true;
    };
    
    int Polynomial::getmax()
    {
        int i=0;
        PNode *p=gethead()->next;
        while (p!=NULL)
        {
            if (p->ci>i)
            {
                i=p->ci;
            }
            p=p->next;
        }
        return i;
    };
    
    Polynomial::Polynomial(Polynomial &P1,Polynomial &P2)
    {
        int i=P1.getmax();
        if(P2.getmax()>i)
            i=P2.getmax();
        int *num=new int[i+1];
        for (int j=0;j<=i;j++)
        {
            num[j]=0;
        }
        PNode *p=P1.gethead()->next;
        while (p!=NULL)
        {
            num[p->ci]=num[p->ci]+p->di;
            p=p->next;
        }
        p=P2.gethead()->next;
        while (p!=NULL)
        {
            num[p->ci]+=p->di;
            p=p->next;
        }
        p=first=new PNode;
        for (int j=0;j<=i;j++)
        {
            if (num[j]==0)
                continue;
            PNode *q=new PNode(num[j],j);
            p->next=q;
            p=q;
        }
        p->next=NULL;
    };
    
    Polynomial operator+(Polynomial &P1,Polynomial &P2)
    {
        int i=P1.getmax();
        if(P2.getmax()>i)
            i=P2.getmax();
        int *num=new int[i+1];
        for (int j=0;j<=i;j++)
        {
            num[j]=0;
        }
        PNode *p=P1.gethead()->next;
        while (p!=NULL)
        {
            num[p->ci]=num[p->ci]+p->di;
            p=p->next;
        }
        p=P2.gethead()->next;
        while (p!=NULL)
        {
            num[p->ci]+=p->di;
            p=p->next;
        }
        Polynomial P3;
        p=P3.gethead();
        for (int j=0;j<=i;j++)
        {
            if (num[j]==0)
                continue;
            PNode *q=new PNode(num[j],j);
            p->next=q;
            p=q;
        }
        p->next=NULL;
        return P3;
    };
    
    Polynomial operator*(Polynomial &P1,Polynomial &P2)
    {
        int i=P1.getmax();
        int j=P2.getmax();
        i=i*j;
        int *num=new int[i+1];
        for (j=0;j<=i;j++)
        {
            num[j]=0;
        }
        PNode *p=P1.gethead()->next;
        PNode *q=P2.gethead()->next;
        while(p!=NULL)
        {
            while(q!=NULL)
            {
                int m=p->ci+q->ci;
                int n=(p->di)*(q->di);
                num[m]=num[m]+n;
                q=q->next;
            }
            p=p->next;
            q=P2.gethead()->next;
        }
        Polynomial P3;
        p=P3.gethead();
        for (int j=0;j<=i;j++)
        {
            if (num[j]==0)
                continue;
            PNode *q=new PNode(num[j],j);
            p->next=q;
            p=q;
        }
        p->next=NULL;
        return P3;
    }
    
    
    
    //main.cpp
    
    #include <iostream>
    #include "Polynomial.h"
    using namespace std;
    
    int main()
    {
        Polynomial poly1;
        poly1.insert();
        PNode *p=poly1.gethead();
        if(p->next==NULL)
        {
            cout<<"多项式为空"<<endl;
            return -1;
        }
        cout<<poly1<<endl;
    
        Polynomial poly2;
        poly2.insert();
        p=poly2.gethead();
        if(p->next==NULL)
        {
            cout<<"多项式为空"<<endl;
            return -1;
        }
        cout<<poly2<<endl;
    //    Polynomial poly3(poly1,poly2);   //多项式加法的一种
    //    cout<<poly3;
        cout<<"多项式加法"<<endl;
        Polynomial poly3;
        poly3=poly1+poly2;
        cout<<poly3<<endl;
        cout<<"多项式乘法"<<endl;
        Polynomial poly4;
        poly4=poly1*poly2;
        cout<<poly4<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    NeiHappy我相信做技术也能身体好
    陈皓程序员技术练级攻略
    张子阳对人生的一点看法
    HaoyuTan程序员之路──C语言
    三种冒泡排序的实现与时间快慢的比较
    R语言——中文分词包jiebaR
    任务计划程序执行bat失败
    R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)
    R+NLP︱text2vec包——四类文本挖掘相似性指标 RWMD、cosine、Jaccard 、Euclidean
    R语言做文本挖掘 Part5情感分析
  • 原文地址:https://www.cnblogs.com/tuzijs/p/3427369.html
Copyright © 2011-2022 走看看