数据结构.多项式加法

#include<iostream>
using namespace std;
int a[100][2], b[100][2], sum[100][2];
int n, m;
int main()
{

    cin >> n;//输入第一个多项式的项数
    for (int i = 0; i < n; i++)
    {
        cin >> a[i][0] >> a[i][1];//分别输入系数和指数

    }
    cin >> m;//输入第二个多项式的项数
    for (int i = 0; i < m; i++)
    {
        cin >> b[i][0] >> b[i][1];//分别输入系数和指数

    }
    int x = 0, y = 0, s = 0;//定位a,b,sum数组的下标指向
    while (x < n && y < m)//当x,y在项数数量范围内,则比较两个多项式的大小
    {
        if (a[x][1] == b[y][1])//如果二者的指数相同
        {
            sum[s][0] = a[x][0] + b[y][0];//则系数相加
            if (sum[s][0] != 0)//如果系数不等于0
            {
               
                sum[s][1] = a[x][1];//则指数落系下来
                s++;//指针往后移动
            }
            x++, y++;//指针往后移动

        }
        else if (a[x][1] > b[y][1])//如果a多项式的指数比b的多项式的指数大
        {
            sum[s][0] = a[x][0];//则将a的系数和指数都落到sum中
            sum[s][1] = a[x][1];
            s++, x++;//a和sum的指针往后移动
        }
        else//如果b的多项式的指数比a的多项式的指数大
        {
            sum[s][0] = b[y][0];//则将b的系数和指数都落到sum中
            sum[s][1] = b[y][1];
            s++, y++;//b和sum的指针往后移动
        }
    }
    if (x == n && y < m)//如果a没有项数可以比较
    {
        for (int i = y; i < m; i++)//则将b剩余的项的系数和指数都落下来
        {
            sum[s][0] = b[i][0];
            sum[s][1] = b[i][1];
            s++;
        }
    }
    if (y == m && x < n)//如果b没有项数可以比较
    {
        for (int i = x; i < n; i++)//则将a剩余的项的系数和指数都落下来
        {
            sum[s][0] = a[i][0];
            sum[s][1] = a[i][1];
            s++;
        }
    }

    for (int i = 0; i < s; i++)
    {
        if (i == 0)
        {
            cout << sum[i][0] << " " << sum[i][1];
        }
        else
        {
            cout << " " << sum[i][0] << " " << sum[i][1];
        }
   }
    if (s == 0)
    {
        cout << 0 << " " << 0;
    }





    return 0;
}
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct node {
    int coef;//系数
    int exp;//指数
    node* next;//在c++中支持node*这种写法
}list;
node* newNode(int c, int e)//创建一个新结点
{
    node* temp = (node*)malloc(sizeof(node));
    temp->coef = c;//系数
    temp->exp = e;//指数
    temp->next = NULL;
    return temp;
}
list* createPoly(int n)//创建长度为n的链表
{
    list* L = NULL;//创建一个指针表示链表
    if (n == 0)//如果链表的长度为0,则直接返回
    {
        return L;
    }
    else
    {
        L = (list*)malloc(sizeof(node));//如果链表的长度不是0,则分配空间
    }
    int ac = 0;//初始化系数
    int ae = 0;//初始化指数
    node* lastp = L;//创建尾指针
    node* temp = NULL;//创建一个指针用来接收新插入的结点
    for (int i = 0; i < n; i++)
    {
        cin >> ac >> ae;//输入系数,指数
        temp = newNode(ac,ae);//接收这个新的结点
        lastp->next = temp;//尾插入新的结点
        lastp = temp;//更新尾结点
    }
    return L;//返回这条链表
}
list* addPoly(list* A, list* B)//将两个多项式相加
{
    if (!A->next)return B;
    if (!B->next)return A;
    node* pa = A->next;//pa指向A的第一项
    node* pb = B->next;//pb指向B的第一项
    list* sum = (list*)malloc(sizeof(node));//创建一个计算总和的链表
    sum->next = NULL;//初始化
    node* lastp = sum;//尾结点
    node* temp = NULL;//创建一个临时结点
    while (pa && pb)//如果满足二者的长度在多项式内 
    {
        if (pa->exp == pb->exp)//并且这一项的指数相同
        {
            if (pa->coef + pb->coef != 0)//并且相加还不等于0
            {
                temp = newNode(pa->coef + pb->coef, pa->exp);//那么就得到这个系数相加后的结点
                lastp->next = temp;//尾插入总和链表
                lastp = temp;
            }
            pa = pa->next;//指针向后移动
            pb = pb->next;

        }
        else if (pa->exp > pb->exp)//如果pa的指数比pb的指数大
        {
            temp = newNode(pa->coef, pa->exp);//将pa落下来
            lastp->next = temp;//尾插
            lastp = temp;
            pa = pa->next;//移动
        }
        else//如果pa的指数比pb小,同理
        {
            temp = newNode(pb->coef, pb->exp);
            lastp->next = temp;
            lastp = temp;
            pb = pb->next;
        }
    }
    if (pa == NULL && pb != NULL)//如果pa指向空,将pb后面的全部落下来
    {
        lastp->next = pb;

    }
    if (pb == NULL && pa != NULL)//同理
    {
        lastp->next = pa;
    }
    return sum;
}
void printPoly(list*L)//打印链表
{
    if (!L->next)//如果链表为空,则直接打印0 0
    {
        cout << "0 0";

    }
    else//如果链表不为空
    {
        node* p = L->next;//p指向第一个结点
        int i = 0;
        while (p)
        {
            if (i == 0)
            {
                cout << p->coef << " " << p->exp;
                i++;
            }
            else
            {
                cout << " " << p->coef << " " << p->exp;
            }
            p = p->next;
        }
    }
}
int main()
{
    int n, m;
    cin >> n;
    list* La = createPoly(n);//创建A链表
    cin >> m;
    list* Lb = createPoly(m);//创建B链表
    list* result = addPoly(La, Lb);//计算
    printPoly(result);//打印
    return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值