数据结构 一元多项式加减法计算器

#include <iostream>

using namespace std;

struct Node//定义双向链表,方便降幂输出

{

    int C;

    int index;

    struct Node*prior;

    struct Node*next;

};

void init(struct Node* &List)

{

List=(struct Node*)malloc(sizeof(struct Node));

    List->next=NULL;

}

void Sort(struct Node* List,struct Node*p)//链表幂从小到大排序,进来一个排一个

{

    struct Node*p1,*p2;

    int flag=0;

    if(List->next==NULL)

    {

        p->next=List->next;

        List->next=p;

    }

    else

    {

        p1=List;

        p2=List->next;

        while(p2!=NULL)

        {

            if(p->index<p2->index)

            {

                p1->next=p;

                p->next=p2;

                flag=1;

                break;

            }

            else if(p->index==p2->index)

            {

                p2->C+=p->C;

                flag=1;

                break;

            }

            else

            {

                p1=p2;

                p2=p2->next;

            }


        }

        if(flag==0)

        {

            p1->next=p;

            p->next=NULL;

        }

    }

}

void Addition(struct Node*List1,struct Node*List2,struct Node*List3)//链表相加

{

    struct Node*p1,*p2,*p3,*p;

    p1=List1->next;

    p2=List2->next;

    p3=List3;//有意思

    List3->next=NULL;//避免运行加减函数互相影响

    while(p1!=NULL&&p2!=NULL)

    {


        p=(struct Node*)malloc(sizeof(struct Node));

        p->next=NULL;

        if(p1->index==p2->index)

        {

            if(p1->C+p2->C!=0)//链表相加为0,直接不录入

            {

                p->C=p1->C+p2->C;

                p->index=p1->index;

                p3->next=p;

                p3=p;

            }

            p1=p1->next;

            p2=p2->next;

        }

        else if(p1->index<p2->index)

        {

            p->C=p1->C;

            p->index=p1->index;

            p3->next=p;

            p3=p;


            p1=p1->next;


        }

        else

        {

            p->C=p2->C;

            p->index=p2->index;

            p3->next=p;

            p3=p;


            p2=p2->next;

        }

    }


    if(p1==NULL)

    {

        while(p2!=NULL)

        {

            p=(struct Node*)malloc(sizeof(struct Node));

            p->next=NULL;

            p->C=p2->C;

            p->index=p2->index;

            p3->next=p;

            p3=p;

            p2=p2->next;

        }

    }

    else

    {

        while(p1!=NULL)

        {

            p=(struct Node*)malloc(sizeof(struct Node));

            p->next=NULL;

            p->C=p1->C;

            p->index=p1->index;

            p3->next=p;

            p3=p;

            p1=p1->next;

        }

    }

}

void Subtraction (struct Node*List1,struct Node*List2,struct Node*List3)//链表相减,只需在加的基础上改+为-

{

    struct Node*p1,*p2,*p3,*p;

    p1=List1->next;

    p2=List2->next;

    p3=List3;//有意思

     List3->next=NULL;//重要

    while(p1!=NULL&&p2!=NULL)

    {


        p=(struct Node*)malloc(sizeof(struct Node));

        p->next=NULL;

        if(p1->index==p2->index)

        {

            if(p1->C-p2->C!=0)

            {

                p->C=p1->C-p2->C;

                p->index=p1->index;

                p3->next=p;

                p3=p;

            }

            p1=p1->next;

            p2=p2->next;

        }

        else if(p1->index<p2->index)

        {

            p->C=-p1->C;

            p->index=p1->index;

            p3->next=p;

            p3=p;


            p1=p1->next;


        }

        else

        {

            p->C=-p2->C;

            p->index=p2->index;

            p3->next=p;

            p3=p;


            p2=p2->next;

        }

    }


    if(p1==NULL)

    {

        while(p2!=NULL)

        {

            p=(struct Node*)malloc(sizeof(struct Node));

            p->next=NULL;

            p->C=-p2->C;

            p->index=p2->index;

            p3->next=p;

            p3=p;

            p2=p2->next;

        }

    }

    else

    {

        while(p1!=NULL)

        {

            p=(struct Node*)malloc(sizeof(struct Node));

            p->next=NULL;

            p->C=-p1->C;

            p->index=p1->index;

            p3->next=p;

            p3=p;

            p1=p1->next;

        }

    }

}

void print(struct Node* List3,struct Node*p,struct Node*p3,int flag){

cout<<"升幂:";

            p=List3->next;

            p3=List3;

            while(p)

            {

                cout<<p->C<<"*x^"<<p->index<<" ";

                p->prior=p3;

                p3=p;

                p=p->next;

                flag=1;

            }

            if(flag==0)

            cout<<"0";

            cout<<endl;

            cout<<"降幂:";

            while(p3!=List3)

            {

                cout<<p3->C<<"*x^"<<p3->index<<" ";

                p3=p3->prior;

            }

            if(flag==0)

            cout<<"0";

            cout<<endl;}

void main()

{

    int n1,n2,e,f,sum1,flag;

    char d;

        struct Node *List1,*List2,*p,*List3,*List4,*List5,*p1,*p2,*p3;

        init(List1);

init(List2);

init(List3);

init(List4);

init(List5);

cout<<"20-8软工2-9-115"<<endl;

        cout<<"请输入第一个表达式的项个数"<<endl;

        cin>>n1;

        while(n1<=0)

        {

            cout<<"请重新输入,输入值需大于0"<<endl;

            cin>>n1;

        }

         cout<<"输入成功"<<endl;

         cout<<"请输入第一个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;

        for(int i=0; i<n1; i++)

        {

            cin>>e>>d>>f;

            p=(struct Node*)malloc(sizeof(struct Node));

            if(e!=0)

            {

                p->C=e;

                p->index=f;

                 Sort(List1,p);

            }


        }

        cout<<"请输入第二个表达式的项个数"<<endl;

        cin>>n2;

        while(n2<=0)

        {

            cout<<"请重新输入,输入值需大于0"<<endl;

            cin>>n2;

        }

         cout<<"输入成功"<<endl;

        cout<<"请输入第二个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;

        p1=List5;

        for(i=0; i<n2; i++)

        {

            cin>>e>>d>>f;

            p=(struct Node*)malloc(sizeof(struct Node));

            if(e!=0)

            {

                p->C=e;

                p->index=f;

                p2=(struct Node*)malloc(sizeof(struct Node));

                p2->next=NULL;

                p1->next=p2;

                p1=p2;

                Sort(List2,p);

            }


        }


        cout<<"输入1表示相加,输入2表示相减"<<endl;

        cin>>sum1;

        while(sum1!=1&&sum1!=2&&sum1!=3)

        {

            cout<<"输入错误,请重新输入"<<endl;

            cin>>sum1;

        }

                cout<<"输入成功"<<endl;

        while(1)

        {

            flag=0;

        if(sum1==1)

        {

            Addition(List1,List2,List3);

            print(List3,p,p3,flag);

        }

        if(sum1==2)

        {


            Subtraction (List1,List2,List3);

            print(List3,p,p3,flag);

        }

       

       cout<<"输入1表示相加,输入2表示相减,输入0结束"<<endl;

       cin>>sum1;

       while(sum1!=1&&sum1!=2&&sum1!=3&&sum1!=0)

       {

           cout<<"输入错误,请重新输入";

           cin>>sum1;

       }

      if(sum1==0)

       {

           cout<<"结束"<<endl;

           break;

       }


    }

}

 

posted @ 2022-07-19 09:09  霖霖的信箱  阅读(297)  评论(0)    收藏  举报