链表-一元多项式的加/减法运算

一元多项式的加/减法运算

  1. 问题描述
    假设2个稀疏一元多项式分别由带头结点的有序单链表A和B存储(指数项递增有序)。现要求设计一个算法,实现稀疏一元多项式的加减法计算。要求使用A和B的原存储空间(运算后B不再存在,A链表中保存结果多项式)。输入中的单链表的长度不得在计算算法中利用,仅作为建表使用。
    注意:加/减法计算后,如某一项的结果系数为0,则该项要从多项式链表中删除。
  2. 输入说明
    第一行:加/减法选择(0:加法 1:减法)
    第二行:一元多项式A的项数
    第三行:一元多项式A的各项的系数(系数之间以空格分隔)
    第四行:一元多项式A的各项的指数(指数之间以空格分隔)
    第五行:一元多项式B的项数
    第六行:一元多项式B的各项的系数(系数之间以空格分隔)
    第七行:一元多项式B的各项的指数(指数之间以空格分隔)
    如果A或B的项数为0,则认为输入的多项式只包含数字“0”,即系数为0,指数也为0。
  3. 输出说明
    第一行:多项式A的第一项的系数、指数(以空格分隔)
    第一行:多项式A的第二项的系数、指数(以空格分隔)

    第n行:多项式A的第n项的系数、指数(以空格分隔) (假设多项式A的项数为n)
    (空行)
    第一行:多项式B的第一项的系数、指数(以空格分隔)
    第一行:多项式B的第二项的系数、指数(以空格分隔)

    第m行:多项式B的第m项的系数、指数(以空格分隔) (假设多项式B的项数为m)
    (空行)
    第一行:加/减法计算后,结果多项式A的第一项的系数、指数(以空格分隔)
    第一行:加/减法计算后,结果多项式A的第二项的系数、指数(以空格分隔)

    第p行:加/减法计算后,结果多项式A的第n项的系数、指数(以空格分隔) (假设结果多项式的项数为p)
    (多项式之间以空行分隔,如果多项式只包含“0”,则相应的多项式输出"0 0",不包含引号。)
  4. 输入范例

1
6
7 3 -22 9 5 -8
0 1 7 8 17 100
3
8 22 -9
1 7 8

  1. 输出范例

7 0
3 1
-22 7
9 8
5 17
-8 100
 
8 1
22 7
-9 8
 
7 0
-5 1
-44 7
18 8
5 17
-8 100

  1. AC代码参考
#include<bits/stdc++.h>

using namespace std;


struct node{
    int xs;
    int zs;
    node *next;
};


node *create(int n){
    node *head = new node;
    node *p = head;
    for(int i=0;i<n;i++){
        node *s = new node;
        cin>>s->xs;
        p->next = s;
        p = s;
    }
    p->next = NULL;
    p = head->next;
    while(p){
         cin>>p->zs;
         p = p->next;
    }
    return head;
}


node *add(node *A,node *B){
    node *p = B->next,*q,*r;
    while(p){
        r = p->next;
        q = A->next;
        while(q){
            if(q->zs==p->zs){
                q->xs = p->xs+q->xs;
                break;
            }
            q =q->next;
        }
        if(!q){
            q = A;
            while(q->next&&q->next->zs<p->zs)  q = q->next;
            p->next = q->next;
            q->next = p;
        }
        p = r;
    }
    return A;
}

node *reduce(node *A,node *B){
    node *p = B->next,*q,*r;
    while(p){
        r = p->next;
        q = A->next;
        while(q){
            if(q->zs==p->zs){
                q->xs = q->xs - p->xs;
                break;
            }
            q =q->next;
        }
        if(!q){
            q = A;
            while(q->next&&q->next->zs<p->zs)  q = q->next;
            q->xs = (0-q->xs);
            p->next = q->next;
            q->next = p;
        }
        p = r;
    }
    return A;
}

node *norm(node *head){
    node *p = head->next,*pre = head;
    while(p){
        if(p->xs==0){
            pre->next = p->next;
            p = pre->next;
        }else{
            pre = p;
            p = p->next;   
        }
    }
    return head;
}

void display(node *head){
    head = norm(head);
    node *p = head->next;
    if(!p)  cout<<"0 0"<<endl;
    while(p){
        cout<<p->xs<<" "<<p->zs<<endl;
        p = p->next;
    }
    cout<<endl;
}


int main(){
    int op,n,m;
    cin>>op;
    node *A = new node;
    node *B =new node;
    cin>>n;
    A = create(n);
    cin>>m;
    B = create(m);
    display(A);
    display(B);
    node *C = new node;
    if(op==0){  
        C = add(A,B);
    }else{
        C = reduce(A,B);
    }
    display(C);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值