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

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

输入格式:
输入分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

1.两个一元多项式的乘法:先将第一个一元多项式的第一项与第二个一元多项式的每一项相乘形成初始链表

 Polynomial t1 = p1,t2 = p2,rear,p,t;
    p = (Polynomial)malloc(sizeof(struct PolyNode));
    p->link = NULL;
    rear = p;
    while(t2)/*先用t1的第一个结点乘以t2的每一个结点建立初始链表*/
    {
        Attach(t1->ceof * t2->ceof ,t1->expon + t2->expon,&rear);/*连接结点*/
        t2 = t2->link;
    }

再将一元多项式的第二项及第二项以后的每一项分别乘以第二个一元多项式的每一项再按照从大到小的顺序插入

t1 = t1->link;
    while(t1)/*从t1的第二个节点开始每个结点分别乘以t2的每一个结点*/
    {
        t2 = p2;/*每乘完一轮就更新t2为p2*/
        rear = p;
        while(t2)
        {
            int c = t1->ceof * t2->ceof;/*两结点系数相乘*/
            int e = t1->expon + t2->expon;/*两结点指数相加*/
            while(rear->link && rear->link->expon > e)/*将算出来的结点按指数从大到小顺序插入。因此要找到比算出来的结点指数小的结点并插在其前面*/
            {
                rear = rear->link;
            }
            if(rear->link && e == rear->link->expon)/*如果此待插结点的指数等于下一个结点的指数*/
            {
                int sum = c + rear->link->ceof;/*系数相加*/
                if(sum) rear->link->ceof = sum;/*如果系数相加不为0 则更新系数*/
                else/*如果系数相加为0则删掉此结点*/
                {
                    t = rear->link;
                    rear->link = t->link;
                    free(t);
                }
            }
            else/*如果待插结点的指数不等于下一个结点的指数则直接插入此结点*/
            {
                t = (Polynomial)malloc(sizeof(struct PolyNode));
                t->ceof = c;
                t->expon = e;
                t->link = rear->link;
                rear->link = t;
                rear = rear->link;/*每次都要更新尾指针*/
            }
            t2 = t2->link;/*t2向后挪*/
        }
        t1 = t1->link;
    }
    t2 = p;

2. 两个一元多项式的加法:将第一个多项式的第一项与第二个多项式的第一项的指数相比,如果第一个大于第二个则插入第一个多项式的第一个结点否则插入第二个结点,再将插入结点对应的链表往后挪一位
如果相等则系数相加,如果系数相加不为0则插入系数相加后的结点,否则不插,两个链表都往后挪

 while(t1 && t2)
    {
        if(t1->expon > t2->expon)/*如果t1此结点指数大于t2此结点指数则插入t1*/
        {
            Attach(t1->ceof,t1->expon,&rear);
            t1 = t1->link;/*t1指向下一个结点*/
        }
        else if(t1->expon < t2->expon)/*如果指数小于t2则插入t2*/
        {
            Attach(t2->ceof,t2->expon,&rear);
            t2 = t2->link;/*t2向后挪*/
        }
        else/*如果指数相等*/
        {
            int sum = t1->ceof + t2->ceof;/*系数相加*/
            if(sum) Attach(sum,t1->expon,&rear);/*如果系数相加不为0才插入结点否则不插入*/
            t1 = t1->link;
            t2 = t2->link;/*t1,t2都向后挪*/
        }
    }

完整代码1 (ps:两个代码一样只是不同时期写的风格不同)

#include <iostream>
#include <cstdlib>
using namespace std;
typedef struct PolyNode *Polynomial;
struct PolyNode
{
    int ceof;/*系数*/
    int expon;/*指数*/
    Polynomial link;/*指针域指向下一个指针*/
};
Polynomial ReadPoly();/*读入数据,建立链表*/
Polynomial Mult(Polynomial p1,Polynomial p2);/*乘法函数*/
Polynomial add(Polynomial p1,Polynomial p2);/*加法函数*/
void Attach(int c,int e,Polynomial *pRear);/*连接链表结点*/
void PrintPoly(Polynomial p);/*输出函数*/

int main()
{
    Polynomial p1,p2,pp,ps;
    p1 = ReadPoly();/*读入第一个多项式*/
    p2 = ReadPoly();/*读入第二个多项式*/
    pp = Mult(p1,p2);/*进行乘法运算*/
    PrintPoly(pp);/*输出乘法运算结果*/
    ps = add(p1,p2);/*进行加法运算*/
    PrintPoly(ps);/*输出加法运算结果*/
    return 0;
}
Polynomial ReadPoly()
{
    Polynomial p/*头指针*/,rear/*尾指针*/,t;
    p = (Polynomial)malloc(sizeof(struct PolyNode));
    p->link = NULL;
    rear = p;
    int n;
    cin >> n;/*输入项数*/
    while(n--)
    {
        int c,e;
        cin >> c >> e;/*输入每一项的系数和指数*/
        Attach(c,e,&rear);/*连接结点*/
    }
    t = p;
    p = p->link;
    free(t);/*释放临时申请的头结点*/
    return p;/*返回头指针*/
}
Polynomial Mult(Polynomial p1,Polynomial p2)
{
    if(!p1 || !p2) return NULL;/*如果两个链表有一个为空则返回NULL*/
    Polynomial t1 = p1,t2 = p2,rear,p,t;
    p = (Polynomial)malloc(sizeof(struct PolyNode));
    p->link = NULL;
    rear = p;
    while(t2)/*先用t1的第一个结点乘以t2的每一个结点建立初始链表*/
    {
        Attach(t1->ceof * t2->ceof ,t1->expon + t2->expon,&rear);/*连接结点*/
        t2 = t2->link;
    }
    t1 = t1->link;
    while(t1)/*从t1的第二个节点开始每个结点分别乘以t2的每一个结点*/
    {
        t2 = p2;/*每乘完一轮就更新t2为p2*/
        rear = p;
        while(t2)
        {
            int c = t1->ceof * t2->ceof;/*两结点系数相乘*/
            int e = t1->expon + t2->expon;/*两结点指数相加*/
            while(rear->link && rear->link->expon > e)/*将算出来的结点按指数从大到小顺序插入。因此要找到比算出来的结点指数小的结点并插在其前面*/
            {
                rear = rear->link;
            }
            if(rear->link && e == rear->link->expon)/*如果此待插结点的指数等于下一个结点的指数*/
            {
                int sum = c + rear->link->ceof;/*系数相加*/
                if(sum) rear->link->ceof = sum;/*如果系数相加不为0 则更新系数*/
                else/*如果系数相加为0则删掉此结点*/
                {
                    t = rear->link;
                    rear->link = t->link;
                    free(t);
                }
            }
            else/*如果待插结点的指数不等于下一个结点的指数则直接插入此结点*/
            {
                t = (Polynomial)malloc(sizeof(struct PolyNode));
                t->ceof = c;
                t->expon = e;
                t->link = rear->link;
                rear->link = t;
                rear = rear->link;/*每次都要更新尾指针*/
            }
            t2 = t2->link;/*t2向后挪*/
        }
        t1 = t1->link;
    }
    t2 = p;
    p = p->link;
    free(t2);/*删除临时申请的空结点*/
    return p;/*返回头结点*/
}
Polynomial add(Polynomial p1,Polynomial p2)
{
    Polynomial p,rear,t;
    p = (Polynomial)malloc(sizeof(struct PolyNode));
    p->link = NULL;
    rear = p;
    Polynomial t1 = p1;
    Polynomial t2 = p2;
    while(t1 && t2)
    {
        if(t1->expon > t2->expon)/*如果t1此结点指数大于t2此结点指数则插入t1*/
        {
            Attach(t1->ceof,t1->expon,&rear);
            t1 = t1->link;/*t1指向下一个结点*/
        }
        else if(t1->expon < t2->expon)/*如果指数小于t2则插入t2*/
        {
            Attach(t2->ceof,t2->expon,&rear);
            t2 = t2->link;/*t2向后挪*/
        }
        else/*如果指数相等*/
        {
            int sum = t1->ceof + t2->ceof;/*系数相加*/
            if(sum) Attach(sum,t1->expon,&rear);/*如果系数相加不为0才插入结点否则不插入*/
            t1 = t1->link;
            t2 = t2->link;/*t1,t2都向后挪*/
        }
    }
    for(;t1;t1 = t1->link) Attach(t1->ceof,t1->expon,&rear);/*如果t1还不为空则将t1剩下的结点插入*/
    for(;t2;t2 = t2->link) Attach(t2->ceof,t2->expon,&rear);/*否则插入t2剩下的结点*/
    rear->link = NULL;
    t = p;
    p = p->link;
    free(t);/*释放临时申请的空结点*/
    return p;
}
void Attach(int c,int e,Polynomial *pRear)
{
    Polynomial p;
    p = (Polynomial)malloc(sizeof(struct PolyNode));
    p->ceof = c;
    p->expon = e;
    p->link = NULL;
    (*pRear)->link = p;
    *pRear = p;
}
void PrintPoly(Polynomial p)
{
    if(!p)
    {
        cout << "0 0" << endl;
        return;
    }
    else
    {
        int flag = 0;/*控制输出的空格*/
        while(p)
        {
            if(flag)
            {
                cout << " ";
            }
            else
            {
                flag = 1;
            }
            cout << p->ceof << " " << p->expon;
            p = p->link;
        }
        cout << endl;
    }
}

完整代码2

#include <iostream>
#include <malloc.h>

using namespace std;

typedef struct PolyNode *Polynomial;//结构指针
struct PolyNode
{
    int coef;//系数
    int expon;//指数
    Polynomial link;//一个指针域指向下一个结点
};

void Attach(int c,int e,Polynomial *PRear)/*连接两个结点*/
{
    Polynomial P;
    P = (Polynomial)malloc(sizeof(struct PolyNode));/*申请一个新结点*/
    P->coef = c;/*对新结点赋值*/
    P->expon = e;
    P->link = NULL;
    (*PRear)->link = P;/*连接最后一个结点Rear和P,令Rear的指针域指向P*/
    *PRear = P;/*P连接上后为最后一个结点,让Rear指向P*/
}
Polynomial ReadPoly()
{
    Polynomial P,Rear,t;
    int n;
    cin >> n;
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->link = NULL;
    Rear = P;//赋初值
    while(n--)
    {
        int c,e;
        cin >> c >> e;//输入系数和指数
        Attach(c,e,&Rear);//连接每个结点
    }
    t = P;
    P = P->link;//指向空结点下一个真正的结点
    free(t);//删除表头空结点
    return P;
}

Polynomial Add(Polynomial P1,Polynomial P2)//两个多项式的加法
{
    Polynomial P,Rear,temp;
    Polynomial t1 = P1,t2 = P2;
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->link = NULL;
    Rear = P;
    while(t1 && t2)
    {
        if(t1->expon == t2->expon)//指数相等
        {
            int sum;
            sum = t1->coef + t2->coef;//系数相加
            if(sum) Attach(sum,t1->expon,&Rear);//和不为0
            t1 = t1->link;
            t2 = t2->link;
        }
        else if(t1->expon > t2->expon)//P1指数大于P2,P1拷贝,并向后挪
        {
            Attach(t1->coef,t1->expon,&Rear);
            t1 = t1->link;
        }
        else//P2指数大于P1,P2拷贝,并向后挪
        {
            Attach(t2->coef,t2->expon,&Rear);
            t2 = t2->link;
        }
    }
    while(t1)//t1不为空,t2为空,把t1剩下的结点拷贝
    {
        Attach(t1->coef,t1->expon,&Rear);
        t1 = t1->link;
    }
    while(t2)//t2不为空,t1为空,把t2剩下的结点拷贝
    {
        Attach(t2->coef,t2->expon,&Rear);
        t2 = t2->link;
    }
    temp = P;
    P = P->link;
    free(temp);//删除表头空结点
    return P;
}
Polynomial Mult(Polynomial P1,Polynomial P2)//P1,P2两个多项式相乘
{
    Polynomial t1 = P1,t2 = P2,t,P,Rear;
    int c,e;
    if(!P1 || !P2)//如果任意为空则结果为空
    {
        return NULL;
    }
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->link = NULL;
    Rear = P;//给Rear初始化,开始指向空表头
    while(t2)/*建立初始表,令t1的第一个结点分别乘t2并相加形成一个多项式,并让t1之后的每一个结点分别乘t2插入到这个多项式中*/
    {
        Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);
        t2 = t2->link;
    }
    t1 = t1->link;
    while(t1)//遍历第一个结点之后的结点
    {
        t2 = P2;
        Rear = P;
        while(t2)//遍历t2的每一个结点
        {
            c = t1->coef * t2->coef;//系数相乘
            e = t1->expon + t2->expon;//指数相加
            while(Rear->link && Rear->link->expon > e)/*为保证降序。将该结点插入到指数比其小的结点之前*/
            {
                Rear = Rear->link;
            }
            if(Rear->link && Rear->link->expon == e)//指数相等
            {
                if( Rear->link->coef + c )//系数相加不为0
                {
                    Rear->link->coef += c;
                }
                else//系数相加为0,,删除该结点
                {
                    t = Rear->link;//t指向要删除的结点
                    Rear->link = t->link;//Rear->link指向要删除结点的下一个结点
                    free(t); //释放该结点
                }
            }
            else//指数不相等
            {
                t = (Polynomial)malloc(sizeof(struct PolyNode));
                t->coef = c;//插入该结点
                t->expon = e;
                t->link = Rear->link;
                Rear->link = t;
                Rear = Rear->link;
            }
            t2 = t2->link;
        }
        t1 = t1->link;
    }
    t2 = P;
    P = P->link;
    free(t2);
    return P;
}
void PrintPoly(Polynomial P)
{
    if(!P)
    {
        cout << "0 0" << endl;
        return ;
    }
    int flag = 0;
    while(P)
    {
        if(!flag)
        {
            flag = 1;
        }
        else
        {
            cout << " ";
        }
        cout << P->coef << " " << P->expon;
        P = P->link;
    }
    cout << endl;
}
int main()
{
    Polynomial P1,P2,PP,PS;
    P1 = ReadPoly();//读入P1
    P2 = ReadPoly();//读入P2;
    PP = Mult(P1,P2);//乘法运算
    PrintPoly(PP);//输出乘法运算结果
    PS = Add(P1,P2);//加法运算
    PrintPoly(PS);//输出加法结果
    return 0;
}
发布了18 篇原创文章 · 获赞 4 · 访问量 321

猜你喜欢

转载自blog.csdn.net/leslie___/article/details/105573525