zoukankan      html  css  js  c++  java
  • 线性表应用二:一元多项式运算

    任务描述

    一元多项式可以通过记录一元多项式各项的指数和系数值,使用按指数升序排列的线性表进行存储。本关使用带头结点升序排列单链表存储一元多项式,并实现两一元多项式的加法和乘法运算。输入n(1<=n<=100),按指数升序顺序输入第一个一元多项式中n项指数和系数,输入m1<=m<=100),按指数升序顺序输入第二个一元多项式中m项指数和系数。然后按照特定格式输入出两一元多项式的和与乘积结果。 例如:第一个一元多项式 ,
    第二个一元多项式 , 则输入为: 3 1 1 2 3 4 5 2 2 2 7 -2 则输出为(输出函数已实现): 和:1x^1+5x^2+5x^4-2x^7 积:2x^3+6x^4+10x^6-2x^8-6x^9-10x^11

    相关知识

    具有n项的一元多项式可以表达为:a1xb1 +a2xb2 +a3xb3+……+anxbn,其中第i项可以表示为aixbi,即指数为bi,系数为ai。可以定义一个结构体类型,对指数和系数信息进行封装,例如 struct datatype { float zhishu; float xishu; }; 则整个n项的一元多项式,就可以使用包含n个datatype型的元素的线性表来表示,如:{ (a1,b1),(a2,b2),(a3,b3),……,(an,bn)},线性表按指数升序有序。 若使用带头结点的单链表存储以上线性表,则可以先定义链表的结点结构如下: struct node { datatype data; node* next; }; 该链表的图示表示为: , 一元多项式的相关操作包括: *(1) 一元多项式中加一项addA(node h, datatype t)** 一元多项式中加一项需要考虑三种情况: 情况1:在原一元多项式中,不存在与新增项的指数相同的指数项,则按照指数升序顺序进行项的插入即可。 例如:原一元多项式:,
    新增项:, , 情况2:在原一元多项式中,存在与新增项的指数相同的指数项,且相同指数的两项的系数之和不等于零,则修改原有一元多项式中该项的系数为两项之和即可。 例如:原一元多项式:,
    新增项:, , 情况3:在原一元多项式中,存在与新增项的指数相同的指数项,且相同指数的两项的系数之和等于零,则删除原有一元多项式中指数相同的项。 例如:原一元多项式:,
    新增项:, , (2) 两一元多项式相加:addS(node* a, node* a) 两个一元多项式a和b相加,结果存于c中,即c=a+b 在实现了一元多项式中加一项的addA()函数后,两个一元多项式的相加算法为: 1)初始化c为带头结点的空链表; 2)循环遍历a中的各项,并根据各项的指数和系数数据,在c多项式中增加项; 3)循环遍历b中的各项,并根据各项的指数和系数数据,在c多项式中增加项; 4)返回c的头指针; (3) 两一元多项式项相乘:mutiply(node* a, node* a) 两个一元多项式a和b相乘,结果存于c中,即c=a*b 在实现了一元多项式中加一项的addA()函数后,两个一元多项式的相乘算法为: 1)初始化c为带头结点的空链表; 2)双重循环遍历a和b中的各项,并根据各项的指数和系数数据,计算两多项式中任意两项的乘积(系数相乘,指数相加),并把乘积项通过addA()函数增加到c多项式中; 3)返回c的头指针;

    编程要求

    本关的编程任务是补全step7/polynomailList.h文件中的addA()、addS()、multiply()函数,分别实现一元多项式的加一项、两一元多项式相加、两一元多项式相乘的功能。三个函数的具体说明如下: // 函数addA:一元多项式加一项 // 参数:h-一元多项式链表表头指针,t-待加项的数据,包含系数和指数 // 返回值:一元多项式链表表头指针 node* addA(node* h, datatype t);

    // 函数addS:两个一元多项式相加 // 参数:a-一元多项式链表表头指针,b-一元多项式链表表头指针 // 返回值:c=a+b多项式链表表头指针 node* addS(node* a, node* b);

    // 函数multiply:两个一元多项式相乘 // 参数:a-一元多项式链表表头指针,b-一元多项式链表表头指针 // 返回值:c=ab一元多项式链表表头指 node multiply(node* a, node* b);

    评测说明

    本关中包含两个文件分别是: step7/polynomailList.h :此文件为学员文件,包含一元多项式链表的操作函数说明与实现,其中addA() addS() multiply()为学员待实现函数。 step7/test.cpp:此文件为评测文件(含main函数),引用“polynomailList.h”,主要用于输入两一元多项式数据,并进行加法和乘法运算,并输出结果。 (上述两个文件可通过点击在代码取的右上角文件夹中的step7文件夹中查看)

    输入输出说明

    输入n(1<=n<=100),输入第一个一元多项式n项中各项的指数和系数,输入m(1<=m<=100),输入第一个一元多项式n项中各项的指数和系数,输出两一元多项式的和与积如下所示:(注意:一元多项式的和积的输出函数已经实现,详情请阅读step7文件夹中的文件。)

    测试输入: 3 1 1 2 3 4 5 2 2 2 7 -2 预测输出: 和:1x^1+5x^2+5x^4-2x^7 积:2x^3+6x^4+10x^6-2x^8-6x^9-10x^11

    测试输入: 2 1 3 2 -2 2 1 -3 3 1 预测输出: 和:-2x^2+1x^3 积:-9x^2+6x^3+3x^4-2x^5

    #include "linkList.h"
    node* addA(node* h, datatype t);
    
    node* addS(node* a, node* b);
    
    node* multiply(node* a, node* b);
    
    
    // 函数addA:一元多项式加一项 
    // 参数:h-一元多项式链表表头指针,t-待加项的数据,包含系数和指数
    // 返回值:一元多项式链表表头指针
    node* addA(node* h, datatype t)
    {
        // 请在此添加代码,补全函数addA
        /********** Begin *********/
        node* p = new node;
        p = h;
        while (p->next != NULL && p->next->data.zhishu < t.zhishu)//找位置
        {
            p = p->next;
        }
        if (p->next == NULL)//新增指数最大则插尾部
        {
            node* n = new node;
            n->data = t;
            n->next= NULL;
            p->next = n;
        }
        else
        {
            if (p->next->data.zhishu == t.zhishu)//指数相等
            {
                p->next->data.xishu += t.xishu;//系数相加
                if (p->next->data.xishu == 0)//系数为0
                {
                    node* k = p->next;//删除节点
                    p->next = k->next;
                    free(k);
                }
            }
            else//不存在相同的指数按升序插入
            {
                node* n = new node;
                n->data = t;
                n->next = NULL;
                node* m = p->next;
                p->next = n;
                n->next = m;
            }
        }
        return h;
        /********** End **********/
    }
    
    // 函数addS:两个一元多项式相加 
    // 参数:a-一元多项式链表表头指针,b-一元多项式链表表头指针
    // 返回值:c=a+b多项式链表表头指针
    node* addS(node* a, node* b)
    {
        // 请在此添加代码,补全函数addS
        /********** Begin *********/
        node* f = new node;
        f = a;
        node* p = new node;
        p = b;
        node* newq = new node;
        newq->next = NULL;
        node* i = new node;
        i = newq;
        while (f->next != NULL && p->next != NULL)
        {
            while (i->next != NULL)
                i = i->next;
            i->next = new node;
            if (p->next->data.zhishu < f->next->data.zhishu)
            {
                i->next->data.xishu = p->next->data.xishu;
                i->next->data.zhishu = p->next->data.zhishu;
                i->next->next = NULL;
                p = p->next;
            }
            else if (p->next->data.zhishu > f->next->data.zhishu)
            {
                i->next->data.xishu =f->next->data.xishu;
                i->next->data.zhishu =f->next->data.zhishu;
                i->next->next = NULL;
                f = f->next;
            }
            else
            {
                i->next->data.xishu = (p->next->data.xishu) + (f->next->data.xishu);
                i->next->data.zhishu = p->next->data.zhishu;
                i->next->next = NULL;
                if (i->next->data.xishu == 0)
                {
                    node* w = i->next;
                    i->next = w->next;
                    free(w);
                }
                p = p->next;
                f = f->next;
            }
        }
    
        while (p->next != NULL)
        {
            while(i->next!=NULL)
                i = i->next;
            i->next = new node;
            i = i->next;
            i->data.xishu = p->next->data.xishu;
            i->data.zhishu = p->next->data.zhishu;
            i->next = NULL;
            p = p->next;
        }
        while (f->next != NULL)
        {
            while(i->next!=NULL)
                i = i->next;
            i->next = new node;
            i = i->next;
            i->data.xishu = f->next->data.xishu;
            i->data.zhishu = f->next->data.zhishu;
            i->next = NULL;
            f = f->next;
        }
        return newq;
        /********** End **********/
    }
    
    // 函数multiply:两个一元多项式相乘
    // 参数:a-一元多项式链表表头指针,b-一元多项式链表表头指针
    // 返回值:c=a*b一元多项式链表表头指针
    node* multiply(node* a, node* b)
    {
        // 请在此添加代码,补全函数multiply
        /********** Begin *********/
        node* p = new node;
        p = a;
        node* f = new node;
        f = b;
        node* new1 = new node;
        new1->next = NULL;
        node* r1 = new1;
        while (p->next != NULL)
        {
            r1->next = new node;
            r1 = r1->next;
            r1->data.xishu = (p->next->data.xishu) * (f->next->data.xishu);
            r1->data.zhishu = (p->next->data.zhishu) + (f->next->data.zhishu);
            r1->next = NULL;
            p = p->next;
        }//在新链表new1中,pb的第一项已经与pa各项相乘
    
        f = f->next;
        p = a;
        while (f->next != NULL)
        {
            node* new2 = new node;
            new2->next = NULL;
            node* r2 = new2;
    
            /*从q的第二项开始,每一项分别与pa的各项相乘,存到new2中,new1,new2相加即可*/
            while (p->next != NULL)
            {
                r2->next = new node;
                r2 = r2->next;
                r2->data.xishu = (p->next->data.xishu) * (f->next->data.xishu);
                r2->data.zhishu = (p->next->data.zhishu) + (f->next->data.zhishu);
                r2->next = NULL;
                p = p->next;
            }
            new1 = addS(new1, new2);
            f = f->next;
            p = a;
        }
        return new1;
        /********** End **********/
    }
  • 相关阅读:
    C# 函数参数object sender, EventArgs e
    Winform中利用委托实现窗体之间的传值
    Web前端学习笔记——Canvas
    js 删除 按钮所在的行
    box-sizing
    前端中关于HTML标签的属性for的理解
    apply和call的用法总结
    target 确定元素是谁??
    css3过渡和动画
    处理两端极限值的小技巧
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13961446.html
Copyright © 2011-2022 走看看