koitatsu

数据结构cpp实现线性表应用 —— 一元多项式表示和实现

509浏览 2023-8-1 日常 MA34044

一元多项式的表示

    多项式的每一项都可以用一个二元组表示,具体可以表示为,对于多项式的操作,我们可以用顺序表也可以用链表存储。但因为需要进行插入和删除操作,所以在这里使用链表存储。


加法操作实现的思路    a和b两个加数相加,算法从a、b两个链表头开始取元素,并进行步骤一。

    步骤一:

                1)指数不等:指数大者插入和多项式链表,并向后取元素

                2)指数相等:二者相加后,若非0,则插入和多项式链表

    步骤二:

                将a、b链表中剩余部分加到和多项式中

减法操作相似,符号变换即可    Polynomial.h代码实现(单链表代码)

#include "LinkList.h"//包含链表类

#include "cmath"

struct PolyItem

{

    double coef=0;          // 系数

    int    expn;            // 指数


    PolyItem(){expn = -1;} ;            // 如果是调用无参构造函数,则指数域赋值为0

    PolyItem(double cf, int en){coef=cf;expn=en;};// 已知系数域和指数域建立结构

};


class Polynomial {

private:

    LinkList<PolyItem> polylist;//多项式的线性表,存储系数和指数信息

public:

    Polynomial(){}//无参构造函数什么都不做

    ~Polynomial(){}//析构函数同理

    int Length() const;//获取多项式的项数

    bool IsNull() const;//判断多项式是否为空

    void SetNull();//将多项式清空

    void Display() const;//打印多项式

    void InsItem(const PolyItem &it);//插入一项,相当重要的功能

    Polynomial operator +(const Polynomial &p) const;

    Polynomial operator -(const Polynomial &p) const;

    Polynomial &operator =(const Polynomial &copy);    // 赋值语句重载

    Polynomial &operator =(const LinkList<PolyItem> &copyLinkList);    // 赋值语句重载

    double_t Cal(double_t x);

};


int Polynomial::Length() const {

    return polylist.GetLength();

}


bool Polynomial::IsNull() const {

    return Length()==0;

}


void Polynomial::SetNull() {

    polylist.clear();

}


void Polynomial::Display() const {

    PolyItem temp;

    for(int i=1;polylist.GetElem(i,temp);i++)

    {

        std::cout<<temp.coef<<"x^"<<temp.expn<<"+";

    }

    std::cout<<"\b"<<" ";//这个作用是清除多余的一个+号

}


void Polynomial::InsItem(const PolyItem &it) {

//多项式插入项的方式按照降幂排序

    int position=1;

    PolyItem temp;

    while(polylist.GetElem(position,temp)&&temp.expn>it.expn)//查找按照降幂插入的位置

    {

        position++;

    }

    polylist.insert(position,it);

}


Polynomial Polynomial::operator+(const Polynomial &p) const {

    LinkList<PolyItem> la=polylist;//被加数(被加多项式)

    LinkList<PolyItem> lb=p.polylist;//加数

    LinkList<PolyItem> lc;//合多项式的链表


    int aPos=1,bPos=1;

    PolyItem aItem,bItem;

    bool aStatus=la.GetElem(aPos++,aItem),bStatus=lb.GetElem(bPos++,bItem);


    while(aStatus && bStatus)

    {

        if(aItem.expn>bItem.expn)//la的项aItem的指数较大

        {

            lc.insert(aItem);//将取出的la的项插入到合多项式尾

            aStatus=la.GetElem(aPos++,aItem);

        }

        else if(aItem.expn<bItem.expn)//lb的项bItem指数较大

        {

            lc.insert(bItem);

            bStatus=lb.GetElem(bPos++,bItem);

        }

        else//指数相等的情况

        {

            PolyItem sumItem(aItem.coef+bItem.coef,aItem.expn);

            if(sumItem.coef!=0)

            {

                lc.insert(sumItem);

                aStatus=la.GetElem(aPos++,aItem);

                bStatus=lb.GetElem(bPos++,bItem);

            }

        }


    }

    while (la.GetElem(aPos++,aItem)) { // 将la的剩余项追加到lc的后面

        lc.insert(aItem);  // 将aItem追加到lc的后面

    }


    while (lb.GetElem(bPos++,bItem)) { // 将lb的剩余项追加到lc的后面

        lc.insert(bItem);  // 将bItem追加到lc的后面

    }

    Polynomial fc;//合多项式

    fc.polylist=lc;


    return fc;

}


Polynomial Polynomial::operator-(const Polynomial &p) const {

    LinkList<PolyItem> la=polylist;//被减数

    LinkList<PolyItem> lb=p.polylist;//减数

    LinkList<PolyItem> lc;//合多项式的链表


    int aPos=1,bPos=1;

    PolyItem aItem,bItem;

    bool aStatus=la.GetElem(aPos++,aItem),bStatus=lb.GetElem(bPos++,bItem);


    while(aStatus && bStatus)

    {

        if(aItem.expn>bItem.expn)//la的项aItem的指数较大

        {

            lc.insert(aItem);//将取出的la的项插入到合多项式尾

            aStatus=la.GetElem(aPos++,aItem);

        }

        else if(aItem.expn<bItem.expn)//lb的项bItem指数较大

        {

            bItem.coef=-bItem.coef;

            lc.insert(bItem);

            bStatus=lb.GetElem(bPos++,bItem);

        }

        else//指数相等的情况

        {

            PolyItem sumItem(aItem.coef-bItem.coef,aItem.expn);

            if(sumItem.coef!=0)

            {

                lc.insert(sumItem);

                aStatus=la.GetElem(aPos++,aItem);

                bStatus=lb.GetElem(bPos++,bItem);

            }

        }


    }

    while (la.GetElem(aPos++,aItem)) { // 将la的剩余项追加到lc的后面

        lc.insert(aItem);  // 将aItem追加到lc的后面

    }


    while (lb.GetElem(bPos++,bItem)) { // 将lb的剩余项追加到lc的后面

        lc.insert(bItem);  // 将bItem追加到lc的后面

    }

    Polynomial fc;//合多项式

    fc.polylist=lc;


    return fc;

}


Polynomial &Polynomial::operator =(const Polynomial &copy)

// 操作结果:将多项式copy赋值给当前多项式——赋值语句重载

{

    if ( &copy != this)    {

        polylist = copy.polylist;

    }

    return *this;

}


Polynomial &Polynomial::operator =(const LinkList<PolyItem> &copyLinkList)

// 操作结果:将多项式组成的线性表copyLinkList赋值给当前多项式

// ——赋值语句重载

{

    polylist = copyLinkList;

    return *this;

}


double_t Polynomial::Cal(double_t x) {

    using namespace std;

    double result=0;//计算结果

    int i=1;

    PolyItem temp;

    while(polylist.GetElem(i++, temp))

    {

        result = result+temp.coef * pow(x,temp.expn);

    }

    return result;

}    main函数

#include <iostream>

#include "Polynomial.h"

int main() {

    using namespace std;

    Polynomial list,list2,list3;

    PolyItem item(1,2);

    PolyItem item2(2,2);

    list2.InsItem(item);

    list3.InsItem(item2);

    list=list2-list3;

    list.Display();

    cout<<list.Cal(2);

    return 0;

}运行结果-1x^2 -4

#学习 #编程 #计算机 #数据结构
16