m0_74464010 2023-07-26 16:10 采纳率: 94.1%
浏览 15
已结题

一元多项式的相加减运算

经过一次计算之后,再经过依次计算,就不出结果

img

#include<iostream>
using namespace std;
typedef int Status;
//链式多项式的创建 
typedef struct PNode
{
    float coef ;
    int   expn ;
    struct PNode *next ;
}PNode,*Polynomial ; 
//创建多项式 
void CreatePolyn(Polynomial &P,int n)
{
    int i ;
    P=new PNode ;
    P->next = NULL ;
    cout<<"请分别输入多项式的系数和指数!"<<endl;
    for(i=1 ; i<=n ; ++i)
    {
        Polynomial s = new PNode ;
        cin>>s->coef>>s->expn ;
        Polynomial pre = P ;
        Polynomial q = P->next ;
        while(q&&q->expn<s->expn )
        {
            pre = q ;
            q = q->next ;
        }
        s->next = q ;
        pre->next = s ;
    }
}
//多项式的相加
void AddPolyn(Polynomial &Pa,Polynomial &Pb)
{  
   
    Polynomial p1 = Pa->next  ; Polynomial  p2 = Pb->next ;
    Polynomial p3 = Pa ;
    
    while(p1&&p2)
    {   float sum = 0 ;
        if(p1->expn == p2->expn )
        {
            sum = p1->coef + p2->coef ;
            if(sum!=0)
            {
                p1->coef = sum;
                p3->next = p1 ; p3 = p1 ;
                p1 = p1->next ;
                Polynomial r = p2 ; p2 = p2->next ; delete r ;
             }
                else
                {  
                  Polynomial r ;
                  r = p1 ; p1 = p1->next ; delete r ;
                  r = p2 ; p2 = p2->next ; delete r ; 
                }
            }
            else if(p1->expn < p2->expn)
            {
                p3->next = p1 ;
                p3 = p1 ;
                p1 = p1->next ;
            }
            else
            {
                p3->next = p2 ;
                p3 = p2 ;
                p2 = p2->next ;
                
            }
        }
        p3->next = p1 ? p1 : p2 ;
        delete Pb;
        Polynomial p4 = Pa->next;
        while (p4)
        {
          cout << p4->coef  << "x^" << p4->expn ;
          if(p4->next)
            cout << "+" ; 
          p4 = p4->next ;
        }
         cout << endl ;
    }
void Cutpolyn(Polynomial &Pa,Polynomial &Pb)
{
    Polynomial p1 = Pa->next  ; Polynomial  p2 = Pb->next ;
    Polynomial p3 = Pa ;
    
    while(p1&&p2)
    {   float sum = 0 ;
        if(p1->expn == p2->expn )
        {
            sum = p1->coef - p2->coef ;
            if(sum!=0)
            {
                p1->coef = sum;
                p3->next = p1 ; p3 = p1 ;
                p1 = p1->next ;
                Polynomial r = p2 ; p2 = p2->next ; delete r ;
             }
                else
                {  
                  Polynomial r ;
                  r = p1 ; p1 = p1->next ; delete r ;
                  r = p2 ; p2 = p2->next ; delete r ; 
                }
            }
            else if(p1->expn < p2->expn)
            {
                p3->next = p1 ;
                p3 = p1 ;
                p1 = p1->next ;
            }
            else
            {
                p3->next = p2 ;
                p3 = p2 ;
                p2 = p2->next ;
                
            }
        }
        p3->next = p1 ? p1 : p2 ;
        delete Pb;
        Polynomial p4 = Pa->next;
        while (p4)
        {
          cout << p4->coef  << "x^" << p4->expn ;
          if(p4->next)
            cout << "+" ; 
          p4 = p4->next ;
        }
         cout << endl ;
}

int main()
{
    int a,b=1;
    Polynomial(P)  ;
    Polynomial Pa  ;
    Polynomial Pb  ;
    cout<<"请选择你要进行的操作: "<<endl;
    while(b)
    {
        cout<<"--------------------------------------------------------------------------"<<endl;
        cout<<"1.创建多项式     2.多项式相加     3.多项式相减    4.退出操作"<<endl;
        cin>>a;    
        switch(a)
        {   int n,m;
            case(1): cout<<"请输入Pa的项数: "<<endl ; cin>>n ;
                     CreatePolyn(Pa,n) ;
                     cout<<"请输入Pb的项数: "<<endl ; cin>>m ;
                     CreatePolyn(Pb,m) ; break ;
            case(2): AddPolyn(Pa,Pb) ; break ;
            case(3): Cutpolyn(Pa,Pb) ; break ;
            case(4): exit(0) ;
            default: printf("输入有误!请重新输入!") ; 
        }     
    }
    return 0;
}

  • 写回答

3条回答 默认 最新

  • qzjhjxj 2023-07-26 18:21
    关注

    只要一个函数就可以实现相加、减,整体修改如下,改动处见注释,供参考:

    #include<iostream>
    using namespace std;
    typedef int Status;
    //链式多项式的创建 
    typedef struct PNode
    {
        float coef ;
        int   expn ;
        struct PNode *next ;
    }PNode,*Polynomial ;
    //创建多项式
    void CreatePolyn(Polynomial &P,int n)
    {
        int i ;
        P=new PNode ;
        P->next = NULL ;
        cout<<"请分别输入多项式的系数和指数!"<<endl;
        for(i=1 ; i<=n ; ++i)
        {
            Polynomial s = new PNode ;
            cin>>s->coef>>s->expn ;
            Polynomial pre = P ;
            Polynomial q = P->next ;
            while(q&&q->expn<s->expn )
            {
                pre = q ;
                q = q->next ;
            }
            s->next = q ;
            pre->next = s ;
        }
    }
    //多项式的相加、减
    void Add_Cut_Polyn(Polynomial Pa,Polynomial Pb,int flag = 0)// flag为加 减标志位:0 表示 + ,1 表示 -
    //void AddPolyn(Polynomial &Pa,Polynomial &Pb)      // 修改
    {
        if ((!Pa || !Pa->next) && (!Pb || !Pb->next))  return;  // 修改
        Polynomial p1 = Pa->next, p2 = Pb->next ;
        //Polynomial p3 = Pa ;                         // 修改
        Polynomial p3 = new PNode, pt3 = p3, p = NULL; // 修改
        p3->next = NULL;
        while(p1 && p2)
        {
            float sum = 0 ;
            if(p1->expn == p2->expn )
            {
                sum = flag ? p1->coef - p2->coef : p1->coef + p2->coef;
                if(sum != 0)
                {
                    p = new PNode;
                    p->next = NULL;
                    p->coef = sum;
                    p->expn = p1->expn;
                           //p1->coef = sum; // 修改
                    pt3->next = p ;
                    pt3 = p ;
                    //p1 = p1->next;         // 修改
                    //Polynomial r = p2 ; p2 = p2->next ; delete r ; // 修改
                 }
                 p1 = p1->next;
                 p2 = p2->next;
                 //else   // 修改
                 //{
                 //     Polynomial r ;
                 //     r = p1 ; p1 = p1->next ; delete r ;
                 //     r = p2 ; p2 = p2->next ; delete r ;
                 //   }
            }
            else if(p1->expn < p2->expn)
            {
                p = new PNode;
                p->next = NULL;
                p->coef = p1->coef;
                p->expn = p1->expn;
    
                pt3->next = p;
                pt3 = p ;
                p1 = p1->next ;
            }
            else
            {
                p = new PNode;
                p->next = NULL;
                p->coef = p2->coef;
                p->expn = p2->expn;
    
                pt3->next = p ;
                pt3 = p;
                p2 = p2->next ;
            }
        }
        p1 = p1 ? p1 : p2 ; //p3->next = p1 ? p1 : p2 ; 修改
                            //delete Pb;
        while(p1)           // 修改
        {
            p = new PNode;
            p->next = NULL;
            p->coef = p1->coef;
            p->expn = p1->expn;
    
            pt3->next = p;
            pt3 = p ;
            p1 = p1->next ;
        }
        Polynomial p4 = p3->next;// 修改
        pt3 = p3;    // 修改
        while (p4)
        {
            cout << p4->coef  << "x^" << p4->expn ;
            if (p->next && p->next->coef > 0)    // 修改
                cout << "+" ;
            delete pt3;  // 修改
            pt3 = p4;    // 修改
            p4  = p4->next ;
        }
        delete pt3;      // 修改
        cout << endl ;
    }
    
    
    int main()
    {
        int a,b=1;
        Polynomial(P)  ;
        Polynomial Pa  ;
        Polynomial Pb  ;
        cout<<"请选择你要进行的操作: "<<endl;
        while(b)
        {
            cout<<"--------------------------------------------------------------------------"<<endl;
            cout<<"1.创建多项式     2.多项式相加     3.多项式相减    4.退出操作"<<endl;
            cin>>a;
            switch(a)
            {   int n,m;
                case(1): cout<<"请输入Pa的项数: "<<endl ; cin>>n ;
                         CreatePolyn(Pa,n) ;
                         cout<<"请输入Pb的项数: "<<endl ; cin>>m ;
                         CreatePolyn(Pb,m) ; break ;
                case(2): Add_Cut_Polyn(Pa,Pb,0) ; break ; // 修改
                case(3): Add_Cut_Polyn(Pa,Pb,1) ; break ; // 修改
                case(4): exit(0) ;
                default: printf("输入有误!请重新输入!") ; 
            }     
        }
        return 0;
    }
    
    
    // 以下代码删除
    void Cutpolyn(Polynomial &Pa,Polynomial &Pb)
    {
        Polynomial p1 = Pa->next  ; Polynomial  p2 = Pb->next ;
        Polynomial p3 = Pa ;
    
        while(p1&&p2)
        {   float sum = 0 ;
            if(p1->expn == p2->expn )
            {
                sum = p1->coef - p2->coef ;
                if(sum!=0)
                {
                    p1->coef = sum;
                    p3->next = p1 ; p3 = p1 ;
                    p1 = p1->next ;
                    Polynomial r = p2 ; p2 = p2->next ; delete r ;
                 }
                    else
                    {
                      Polynomial r ;
                      r = p1 ; p1 = p1->next ; delete r ;
                      r = p2 ; p2 = p2->next ; delete r ;
                    }
                }
                else if(p1->expn < p2->expn)
                {
                    p3->next = p1 ;
                    p3 = p1 ;
                    p1 = p1->next ;
                }
                else
                {
                    p3->next = p2 ;
                    p3 = p2 ;
                    p2 = p2->next ;
                    
                }
            }
            p3->next = p1 ? p1 : p2 ;
            delete Pb;
            Polynomial p4 = Pa->next;
            while (p4)
            {
              cout << p4->coef  << "x^" << p4->expn ;
              if(p4->next)
                cout << "+" ;
              p4 = p4->next ;
            }
             cout << endl ;
    }
    
    
    

    修改完善简化的代码如下,供参考:

    #include <iostream>
    using namespace std;
    typedef int Status;
    //链式多项式的创建 
    typedef struct PNode
    {
        float coef;
        int   expn;
        struct PNode* next;
    }PNode, * Polynomial;
    //创建多项式 
    void CreatePolyn(Polynomial& P, int n)
    {
        int i;
        P = new PNode;
        P->next = NULL;
        cout << "请分别输入多项式的系数和指数!" << endl;
        for (i = 1; i <= n; ++i)
        {
            Polynomial s = new PNode;
            cin >> s->coef >> s->expn;
            Polynomial pre = P;
            Polynomial q = P->next;
            while (q && q->expn < s->expn)
            {
                pre = q;
                q = q->next;
            }
            s->next = q;
            pre->next = s;
        }
    }
    //多项式的相加、减 ,flag值为 0 做加法,flag值为 1 做减法
    void Add_Cut_Polyn(Polynomial Pa, Polynomial Pb, int flag = 0)
    {
    
        if ((!Pa || !Pa->next) && (!Pb || !Pb->next))  return; 
        Polynomial p1 = Pa->next, p2 = Pb->next;
        Polynomial p3 = new PNode, pt3 = p3, p = NULL; 
        p3->next = NULL;                  
        while (p1 && p2)
        {
            float sum = 0;
            if (p1->expn == p2->expn){
                sum = flag ? p1->coef - p2->coef : p1->coef + p2->coef;
                if (sum != 0){
                    p = new PNode;
                    p->next = NULL;
                    p->coef = sum;
                    p->expn = p1->expn;
                    
                    pt3->next = p;
                    pt3 = p;
                }
                p1 = p1->next; 
                p2 = p2->next; 
            }
            else {
                p = new PNode;
                p->next = NULL;
                if (p1->expn < p2->expn) {
                    p->coef = p1->coef;
                    p->expn = p1->expn;
                    p1 = p1->next;
                }
                else{
                    p->coef = p2->coef;
                    p->expn = p2->expn;
                    p2 = p2->next;
                }
                pt3->next = p;
                pt3 = p;            
            }
        }
        p1 = p1 ? p1 : p2;
        while (p1) {
            p = new PNode;
            p->next = NULL;
            p->coef = p1->coef;
            p->expn = p1->expn;
            pt3->next = p;
            pt3 = p;
            p1 = p1->next;
        }
        pt3 = p3;
        p = p3->next;
        while (p){
            cout << p->coef << "x^" << p->expn;
            if (p->next && p->next->coef > 0)
                cout << "+";
            delete pt3;
            pt3 = p;
            p = p->next;
        }
        delete pt3;
        cout << endl;
    }
    
    int main()
    {
        int a, b = 1;
        //Polynomial(P);
        Polynomial Pa = NULL;
        Polynomial Pb = NULL;
        cout << "请选择你要进行的操作: " << endl;
        while (b)
        {
            cout << "--------------------------------------------------------------------------" << endl;
            cout << "1.创建多项式     2.多项式相加     3.多项式相减    4.退出操作" << endl;
            cin >> a;
            switch (a)
            {
                int n, m;
            case(1): cout << "请输入Pa的项数: " << endl; cin >> n;
                CreatePolyn(Pa, n);
                cout << "请输入Pb的项数: " << endl; cin >> m;
                CreatePolyn(Pb, m); break;
            case(2): Add_Cut_Polyn(Pa, Pb, 0); break;  
            case(3): Add_Cut_Polyn(Pa, Pb, 1); break;
            case(4): exit(0);
            default: printf("输入有误!请重新输入!");
            }
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月10日
  • 已采纳回答 8月2日
  • 创建了问题 7月26日