E. DS线性表—多项式相加

题目描述

对于一元多项式 p(x)=p0+p1X+P2x2+ 。 +pnxn ,每个项都有系数和指数两部分,例如p2x2的系数为P2,指数为2。

编程实现两个多项式的相加。

例如 5+x+2x2+3 倍3,-5-x+6x2+4 倍4,两者相加结果:8x2+3 倍3+4 倍4

其中系数5和-5都是x的0次方的系数,相加后为0,所以不显示。x的1次方同理不显示。

可用顺序表或单链表实现。

输入

第1行:输入t表示有t组测试数据

第2行:输入n表示有第1组的第1个多项式包含n个项

第3行:输入第一项的系数和指数,以此类推输入n行

接着输入m表示第1组的第2个多项式包含m项

同理输入第2个多项式的m个项的系数和指数

参考上面输入第2组数据,以此类推输入t组

假设所有数据都是整数

输出

对于每1组数据,先用两行输出两个原来的多项式,再用一行输出运算结果,不必考虑结果全为0的情况

输出格式参考样本数据,格式要求包括:

1.如果指数或系数是负数,用小括号括起来。

2.如果系数为0,则该项不用输出。

3.如果指数不为0,则用符号^表示,例如x的3次方,表示为x^3。

4.多项式的每个项之间用符号+连接,每个+两边加1个空格隔开。

输入样例

2

4

5 0

1 1

2 2

3 3

4

-5 0

-1 1

6 2

4 4

3

-3 0

-5 1

2 2

4

9 -1

2 0

3 1

-2 2

输出样例

5 + 1x^1 + 2x^2 + 3x^3

(-5) + (-1)x^1 + 6x^2 + 4x^4

8x^2 + 3x^3 + 4x^4

(-3) + (-5)x^1 + 2x^2

9x^(-1) + 2 + 3x^1 + (-2)x^2

9x^(-1) + (-1) + (-2)x^1

这道题主要在写让它们相加的函数比较难,但是总体代码结构很清晰(不过不知道这个函数怎么写的话就会卡很久)

#include<iostream>
using namespace std;

class Node{
    public:
    Node *next;
    int data1;
    int data2;
    Node(){
        next=NULL;
    }
};

class LinkList{
    public:
        Node *head;
        int len;
        LinkList();
        ~LinkList();
        Node *index(int i);    
        int get1(int i);
        int get2(int i);
        void insert(int i,int data1,int data2);
        void display1();
        void add(LinkList &l1);
        void del(int i);
};

LinkList::LinkList(){
    len=0;
    head=new Node();
}

LinkList::~LinkList(){
    Node *p=head;
    Node *q=new Node();
    while(p){
        q=p;
        p=p->next;
        delete q;
    }
    len=0;
    head=NULL;
}

Node *LinkList::index(int i){
    Node *p=head;
    for(int j=0;j<i;j++){
        p=p->next;
    }
    return p;
}

int  LinkList::get1(int i){
    return index(i)->data1;
}

int LinkList::get2(int i){
    return index(i)->data2;
}

void LinkList::del(int i){
    Node *p=index(i-1);
    Node *q=index(i);
    p->next=q->next;
    q=NULL;
    len--;
}

void LinkList::insert(int i,int data1,int data2){
    Node *p=index(i-1),*q;
    q=new Node();
    q->data1=data1;
    q->data2=data2;
    q->next=p->next;
    p->next=q;
    len++;
}

void LinkList::add(LinkList &l1){
    Node *a, *b;
           a= head->next ;
           b= l1.head->next ;
           LinkList l3;//用第三个链表来存储两个多项式相加的结果
            Node *p= l3.head ; 
           while(a&&b){
            //cout<<'a';
              if(a->data2< b->data2 ){
                    p->next = new Node();
                    p= p->next ;
                     p->data2 = a->data2;
                     p->data1 = a->data1;
                     a= a->next ;


                   }
                else if(a->data2> b->data2 ){
                   p->next = new Node();
                    p= p->next ;
                    p->data2 =b->data2 ;
                    p->data1= b->data1 ;
                     b= b->next ;



                }
                else{
                    int x= a->data1 +b->data1 ;
                    if(!x){                 
                        a= a->next ;
                        b=b->next ;
                    //  delete s, s1;
                    }
                    else{


                        p->next = new Node();
                        p= p->next ;
                        p->data2= b->data2 ;
                        p->data1 = x;
                        a= a->next ;
                        b= b->next;
                    }
                }
             }
             while(a){
                p->next= new Node();
                 p= p->next;
                 p->data2= a->data2 ;
                 p->data1 = a->data1 ;
                 a= a->next ;
             }
             while(b){
                p->next= new Node();
                 p= p->next;
                 p->data2= b->data2 ;
                 p->data1 = b->data1 ;
                 b= b->next ;
             }
             p->next = NULL;
             l3.display1();
      }


void LinkList::display1(){
    Node *p=head->next;
    while(p){
        if(p->data2==0){
            if(p->data1<0){
                cout<<"("<<p->data1<<")";
            }else
            cout<<p->data1;
        }
        if(p->data2!=0){
            if(p->data2>0){
                if(p->data1<0){
                    cout<<"("<<p->data1<<")"<<"x^"<<p->data2;
                }else
                cout<<p->data1<<"x^"<<p->data2;
            }
            else{
                if(p->data1<0){
                    cout<<"("<<p->data1<<")"<<"x^"<<"("<<p->data2<<")";
                }else
                
                cout<<p->data1<<"x^("<<p->data2<<")";
            }

        }
        if(p->next!=NULL){
            cout<<" + ";
        }
        p=p->next;
    }
    cout<<endl;
}



int main(){
    int n;
    int n1,n2;
    cin>>n;
    int data1,data2;
    int data11, data22;
    while(n--){
        LinkList l1,l2;
        cin>>n1;
        for(int i=1;i<=n1;i++){
            cin>>data1>>data2;
            l1.insert(i,data1,data2);
        }
        cin>>n2;
        for(int i=1;i<=n2;i++){
            cin>>data11>>data22;
            l2.insert(i,data11,data22);
        }
        l1.display1();
        l2.display1();
        l1.add(l2);
        //l1.display1();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值