一元多项式的相加减运算

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

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;
}

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

#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;
}

经过一次计算后,多项式链表的指针指向了最后一个节点,因此再次调用计算函数时,由于链表的头节点没有改变,导致无法正确遍历链表。解决方法是在每次计算之前,将链表的指针重新指向头节点,使其能够再次正确遍历链表。具体修改如下:
在AddPolyn()和Cutpolyn()函数中,在开始部分添加以下代码
Pa = Pa->next;
Pb = Pb->next;

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7531389
  • 你也可以参考下这篇文章:给定一维整型数组,输入数据并求第一个值为奇数元素之前的元素和。
  • 您还可以看一下 程张浩老师的微信小程序项目实战之我画你猜视频课程课程中的 商品的展示功能和删除功能小节, 巩固相关知识点
  • 除此之外, 这篇博客: 三子棋游戏思路中的 下面的代码每次打印一个数据,打印一个竖线 一行打印完之后换行打印横线。就是除了数据元素,再就是打印棋盘的结构,让我们的棋盘能显现出来。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    void DisplayBoard(char borad[ROW][COL], int row, int col)
    {
        int i = 0;
        for (i = 0; i < row; i++)
        {
            int j = 0;
            for (j = 0; j < col; j++)
            {
                printf(" %c ", borad[i][j]);
                if (j < col - 1)
                {
                    printf("|");
                }
            }
            printf("\n");
            if (i < row - 1)
            {
                for (j = 0; j < col; j++)
                {
                    printf("---");
                    if (j < col - 1)
                        printf("|");
                }
                printf("\n");
            }


        }
    }


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^