zoukankan      html  css  js  c++  java
  • 线性表在一元多项式运算中的应用

    实验题1-1 多项式运算

    【问题描述】有两个指数递减的一元多项式,写一程序先求这两个多项式的和,再求它们的积。

    【提示】 用带表头结点的单链表作为多项式的存储表示;要建立两个单链表;多项式相加就是要把一个单链表中的结点插入到另一个单链表中去,要注意插入、删除操作中指针的正确修改。

    #include <iostream>
    using namespace std;
    
    int k = 1;
    typedef struct {
        float coef;  //系数
        int expn;   //指数
    }term;
    
    struct LNode{
        term data;
        struct LNode *next;
    };
    
    typedef struct LNode* Polynomial;
    
    //合并同类项
    Polynomial MergePolyn(Polynomial P)
    {
        Polynomial p = NULL,q = NULL,r = NULL,Q = NULL;
        if(P == NULL||P->next == NULL){
            return NULL;
        }
        else{
            for(p = P->next;p!=NULL;p=p->next)
                for(q = p->next,r = p;q!=NULL;){
                    if(p->data.expn == q->data.expn){
                        p->data.coef+=q->data.coef;
                        Q = q;
                        r->next = q->next;
                        q = r->next;//?至关重要
                        delete Q;
                    }
                    else
                        r=r->next,q = q->next;
                }
            return P;
        }
    }
    
    //1.创建一个一元多项式
    Polynomial CreatePolyn(int m)
    {
        if(m>=0){
            Polynomial head = new LNode;
            head->next = NULL;
            Polynomial s,r = head;
            for(int i=0;i<m;i++){
                cout<<"第"<<i+1<<"项的系数和指数是:";
                float c;
                int e;
                cin>>c>>e;
                s = new LNode;
                s->next = NULL;
                s->data.coef = c;
                s->data.expn = e;
                r->next = s;
                r = r->next;
            }
            r->next = NULL;
            return head;
        }
        else{
            cout<<"输入m值非法,创建多项式失败
    ";
            k = 0;
            return NULL;
        }
    }
    
    //2.两个一元多项式相加
    Polynomial AddPolyn(const Polynomial pa,const Polynomial pb)
    {
        if(pa&&pa->next&&pb&&pb->next){
            Polynomial head = new LNode;
            Polynomial s = pa->next,t = pb->next,r = head;
            r->next = NULL;
            while(s!=NULL){
                Polynomial n = new LNode;
                n->next = NULL;
                n->data.coef = s->data.coef;
                n->data.expn = s->data.expn;
                r->next = n;
                r = r->next;
                s = s->next;
            }
            while(t!=NULL){
                Polynomial n = new LNode;
                n->next = NULL;
                n->data.coef = t->data.coef;
                n->data.expn = t->data.expn;
                r->next = n;
                r = r->next;
                t = t->next;
            }
            r->next = NULL;
            head = MergePolyn(head);
            return head;
    
        }
        else if((pa == NULL||pa->next == NULL)&&(pb!=NULL&&pb->next!=NULL))
            return pb;
        else if((pb == NULL||pb->next == NULL)&&(pa!=NULL&&pa->next!=NULL))
            return pa;
        else
            return NULL;
    }
    
    //3.两个一元多项式相乘
    Polynomial MultiplyPolyn(const Polynomial pa,const Polynomial pb)
    {
       if(pa==NULL||pa->next==NULL||pb==NULL||pb->next==NULL)
            return NULL;
        else{
            Polynomial head = new LNode;
            head->next = NULL;
            Polynomial p,q,r,s = head;
            for(p = pa->next;p!=NULL;p=p->next)
                for(q = pb->next;q!=NULL;q=q->next){
                    r = new LNode;
                    r->data.coef = p->data.coef * q->data.coef;
                    r->data.expn = p->data.expn + q->data.expn;
                    r->next = NULL;//千万记住将new的结点指针域置空
                    s->next = r;
                    s = s->next;
                }
            s->next = NULL;
            head = MergePolyn(head);
            return head;
        }
    }
    
    //打印多项式
    void PrintPolyn(Polynomial P)
    {
        if(P==NULL||P->next==NULL){
            cout<<"无项
    ";
        }
        else{
            cout<<"Y=";
            int iszero = 1;
            Polynomial p = NULL,q = NULL;
            p = P->next;
            if(p->data.coef&&p->data.coef!=1&&p->data.coef!=-1&&p->data.expn&&p->data.expn!=1)
                {cout<<p->data.coef<<"X^"<<p->data.expn;iszero = 0;}
            else if(p->data.coef&&p->data.coef!=1&&p->data.coef!=-1&&p->data.expn==1)
                {cout<<p->data.coef<<"X";iszero = 0;}
            else if(p->data.coef&&p->data.coef!=1&&p->data.coef!=-1&&p->data.expn==0)
                {cout<<p->data.coef;iszero = 0;}
            else if(p->data.coef==1&&p->data.expn&&p->data.expn!=1)
                {cout<<"X^"<<p->data.expn;iszero = 0;}
            else if(p->data.coef==1&&p->data.expn==1)
                {cout<<"X";iszero = 0;}
            else if(p->data.coef==1&&p->data.expn==0)
                {cout<<"1";iszero = 0;}
            else if(p->data.coef==-1&&p->data.expn&&p->data.expn!=1)
                {cout<<"-X^"<<p->data.expn;iszero = 0;}
            else if(p->data.coef==-1&&p->data.expn==1)
                {cout<<"-X";iszero = 0;}
            else if(p->data.coef==-1&&p->data.expn==0)
                {cout<<"-1";iszero = 0;}
            else if(p->data.coef==0)
                ;
            else
                {cout<<p->data.coef<<"X^"<<p->data.expn;iszero = 0;}
            if(p->next)
                q = p->next;
            while(q){
                if(q->data.coef>0&&q->data.coef!=1&&q->data.expn&&q->data.expn!=1)
                    {cout<<"+"<<q->data.coef<<"X^"<<q->data.expn;iszero = 0;}
                else if(q->data.coef>0&&q->data.expn==0)
                    {cout<<"+"<<q->data.coef;iszero = 0;}
                else if(q->data.coef>0&&q->data.coef!=1&&q->data.expn==1)
                    {cout<<"+"<<q->data.coef<<"X";iszero = 0;}
                else if(q->data.coef==1&&q->data.expn&&q->data.expn!=1)
                    {cout<<"+"<<"X^"<<q->data.expn;iszero = 0;}
                else if(q->data.coef==1&&q->data.expn==1)
                    {cout<<"+"<<"X";iszero = 0;}
                else if(q->data.coef==1&&q->data.expn==0)
                    {cout<<"1";iszero = 0;}
                else if(q->data.coef<0&&q->data.coef!=-1&&q->data.expn==1)
                    {cout<<q->data.coef<<"X";iszero = 0;}
                else if(q->data.coef==-1&&q->data.expn&&q->data.expn!=1)
                    {cout<<"-X^"<<q->data.expn;iszero = 0;}
                else if(q->data.coef==-1&&q->data.expn==1)
                    {cout<<"-X";iszero = 0;}
                else if(q->data.coef==-1&&q->data.expn==0)
                    {cout<<"-1";iszero = 0;}
                else if(q->data.coef==0)
                    ;
                else
                    {cout<<q->data.coef<<"X^"<<q->data.expn;iszero = 0;}
                q=q->next;
            }
            if(iszero)
                cout<<"0";
            cout<<endl;
        }
    }
    
    int main()
    {
        Polynomial pa = NULL,pb = NULL,P = NULL,Q = NULL,R = NULL,T = NULL;
        do{
            cout<<"1.创建两个一元多项式"<<endl;
            cout<<"2.两个一元多项式相加得一新多项式"<<endl;
            cout<<"3.两个一元多项式相乘得一新多项式"<<endl;
            cout<<"请选择:";
            int n,m;
            cin >> n;
            switch(n)
            {
                case 1:
                    cout<<"请输入第一个多项式的项数:";
                    cin>>m;
                    P = CreatePolyn(m);
                    pa = MergePolyn(P);
                    PrintPolyn(pa);
                    cout<<"请输入第二个多项式的项数:";
                    cin>>m;
                    Q = CreatePolyn(m);
                    pb = MergePolyn(Q);
                    PrintPolyn(pb);
                    break;
                case 2:
                    R = AddPolyn(pa,pb);
                    PrintPolyn(R);
                    break;
                case 3:
                    T = MultiplyPolyn(pa,pb);
                    PrintPolyn(T);
                    break;
                default:
                    k = 0;
                    cout<<"输入了无效字符
    ";
                    break;
            }
        }while(k);
        return 0;
    }
    

     注意点:不能随意修改pa,pb的值,两多项式的加法运算与乘法运算应该互不干扰,尤其注意在多项式加法中不能采用两链表合为一个链表的算法(会改变pa的链表)。

    P.S 对每一个new的结点的指针域要置空,同理,对每一个delete后的悬垂指针也应置空,否则后面的程序使用的时候以为还是没释放的对象, 访问就会出错。

  • 相关阅读:
    我们用的信息系统安全吗?
    硬件代理服务器的日志分析方法
    Solarwinds Orion NPM实战视频演示
    网络资源管理系统LANsurveyor实战体验
    2013年,我的推荐博客汇总
    如何精准高效的实现视觉稿?------前端开发辅助工具AlloyDesigner使用介绍
    SVG如何做圆形图片
    canvas绘制一定数目的圆(均分)
    如何禁止火狐onblur时alert()产生类似选中的拖蓝效果
    ABCD多选正则表达式
  • 原文地址:https://www.cnblogs.com/socrates-lzstu/p/5369322.html
Copyright © 2011-2022 走看看