02-线性结构2 一元多项式的乘法与加法运算 (20分) 浙大PTA

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

 

 

#include

using namespace std;


typedef struct Node
{
    int a;  //系数
    int b;  //指数
    struct Node *next;
} Node, *List;

List create_list()
{
    int len;
    cin >> len;
    List L = new Node;
    Node *tmp, *p = L;
    //输入零多项式
    if(len == 0)
    {
        tmp = new Node;
        tmp->a = 0;
        tmp->b = 0;
        p->next = tmp;
        p = p->next;
        p->next = nullptr;
        return L;
    }
    while(len--)
    {
        tmp = new Node;
        cin >> tmp->a >> tmp->b;
        p->next = tmp;
        p = p->next;
    }
    p->next = nullptr;
    return L;
}

void print_list(List L)
{
    Node *p = L;
    //结果有零多项式
    bool has_print = false;
    bool is_first = true;
    if(L->next != nullptr)
    {
        p = L->next;
    }
    else
    {
        cout << "0 0" << endl;
        return;
    }
    while(p != nullptr)
    {
        //注意 同类项合并时有抵消
        if(p->a != 0)
        {
            if(is_first)
            {
                cout << p->a << " " << p->b;
                is_first = false;
            }
            else
                cout << " " << p->a << " " << p->b;
            has_print = true;
        }
        p = p->next;
    }
    if(!has_print)
        cout << "0 0";
    cout << "\n";
}

List multi_list(List L1, List L2)
{
    List L3 = new Node;
    int len_L3 = 0;
    Node *p3 = L3, *p2, *p1;
    Node *tmp = nullptr;
    for(p1 = L1->next; p1 != nullptr; p1 = p1->next)
    {
        for(p2 = L2->next; p2 != nullptr; p2 = p2->next)
        {
            tmp = new Node;
            tmp->a = p1->a * p2->a;
            tmp->b = p1->b + p2->b;
            p3->next = tmp;
            p3 = p3->next;
            len_L3 += 1;
        }
    }
    p3->next = nullptr;
    tmp = new Node;
    //排序
    for(int i = 0; i < len_L3 - 1; i++)
    {
        p3 = L3->next;
        p1 = p3->next;
        for(int j = 0; j < len_L3 - 1 - i; j++)
        {
            if(p3->b < p1->b)
            {
                tmp->a = p3->a;
                tmp->b = p3->b;
                p3->a = p1->a;
                p3->b = p1->b;
                p1->a = tmp->a;
                p1->b = tmp->b;
            }
            p3 = p3->next;
            p1 = p1->next;
        }
    }
    //合并 同指数 项
    p3 = L3->next;
    p1 = p3->next;
    for(int i = 0; i < len_L3 - 1;)
    {
        if(p3->b == p1->b)
        {
            p3->a += p1->a;
            p3->next = p1->next;
            delete p1;
            p1 = p3->next;
            len_L3--;
        }
        else
        {
            i++;
            p3 = p3->next;
            p1 = p1->next;
        }
    }
    return L3;
}

List add_list(List L1, List L2)
{
    Node *p1 = L1->next, *p2 = L2->next;
    List L3 = new Node;
    Node *p3 = L3;
    int len_L3 = 0;
    while(1)
    {
        if(p1 != nullptr && p2 != nullptr)
        {
            if(p1->b > p2->b)
            {
                p3->next = p1;
                p1 = p1->next;
            }
            else
            {
                p3->next = p2;
                p2 = p2->next;
            }
            p3 = p3->next;
        }
        else if(p1 != nullptr)
        {
            p3->next = p1;
            p1 = p1->next;
            p3 = p3->next;
        }
        else if(p2 != nullptr)
        {
            p3->next = p2;
            p2 = p2->next;
            p3 = p3->next;
        }
        else
        {
            p3->next = nullptr;
            break;
        }
        len_L3++;
    }
    //合并 同指数 项
    p3 = L3->next;
    p1 = p3->next;
    for(int i = 0; i < len_L3 - 1;)
    {
        if(p3->b == p1->b)
        {
            p3->a += p1->a;
            p3->next = p1->next;
            delete p1;
            p1 = p3->next;
            len_L3--;
        }
        else
        {
            i++;
            p3 = p3->next;
            p1 = p1->next;
        }
    }
    return L3;
}

int main()
{
    List L1 = create_list();
    List L2 = create_list();
    List L3 = multi_list(L1, L2);
    List L4 = add_list(L1, L2);
    print_list(L3);
    print_list(L4);
    return 0;
}

 02-线性结构2 一元多项式的乘法与加法运算 (20分) 浙大PTA_第1张图片

你可能感兴趣的:(数据结构)