PTA DS7-2

#include <iostream>
#include <list>
#include <vector>
using namespace std;
struct term {
    int expn;
    int coef;
};
void input(list <term>* A, int a)
{
    term t;
    for (int j = 0; j < a; j++)
    {
        cin >> t.coef >> t.expn;
        (*A).push_back(t);
    }
  
}

void Multiply(list <term> A, list <term> B)
{
    if (A.empty() || B.empty())
        cout << "0 0";
    else {
    list <term>::iterator p = A.begin();
    list <term>::iterator q = B.begin();
    list <term> ans;
    int arr[2004] = { 0 };
    term t;
    for (; p != A.end(); p++)
    {
        for (q = B.begin(); q != B.end(); q++)
        {
            t.coef = ((*p).coef * (*q).coef);
            t.expn = ((*p).expn + (*q).expn);
            arr[t.expn] += t.coef;
        }
    }
    int counter = 0;
    for (int i = 2003; i >=0; i--)
    {
        if (arr[i])
        {
            if (counter)
                cout << " ";

            cout << arr[i] << " " << i;
            counter++;
        }
    }
    }

}

void Add(list <term> A, list <term>B)
{
    if (B.empty())
        ;
    else if (A.empty())
        A = B;
    else if (!A.empty() && !B.empty())
    {
    list <term>::iterator t = A.begin();
    list <term>::iterator p = A.begin();
    list <term>::iterator q = B.begin();
    for (; q!=B.end();)//A是主链,A到不到end无所谓,B到end很有所谓
    {//B到end才能说加法结束了
        
            if (p != A.end() && (*p).expn == (*q).expn )
            {
                (*p).coef += (*q).coef;
                if ((*p).coef==0)
                {
                   
                    A.erase(p++);
                    
                }
                else {
                    p++;
                }
                q++;
            }
            else if (p != A.end() && (*p).expn > (*q).expn)
            {
                
                p++;
            }
            else if (p != A.end() && (*p).expn < (*q).expn  ) {
                t = p;
                if (t != A.begin())
                    A.insert(--t, *q);
                else
                    A.insert(A.begin(), *q);

                
                q++;
            }
            else if(p==A.end()) {
                A.push_back(*q);
            }
    }
    }

    if (A.empty()) cout << "0 0";
    else {
        int counter = 0;
        for (list <term>::iterator p = A.begin(); p != A.end(); p++)
        {
            if (counter)
                cout << " ";
            cout << (*p).coef << " " << (*p).expn;
            counter++;
        }
    }
    
}
int main() {
    list <term> A;
    list <term> B;
    int a;
    cin >> a;
    input(&A, a);
    cin >> a;
    input(&B, a);
    Multiply(A, B);
    cout << endl;
    Add(A, B);
}

千万注意iterator的位置,他跟指针还是不一样的,比如说p=t;指针里t++对p是没有影响的,但是迭代器里有影响,你对t++相当于对p也++,所以要注意这点。

并且iterator没有NULL一说,对于空list,iterator应该是野指针的感觉?

总之,iterator跟指针还是有很大差别的。这题思路挺简单,但是在实现上遇到了跟预期各种不符的东西。。。以及为了通过测试点才想起empty的情况。。。

加油,写的很烂,但是加油

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值