多项式(Polynomial)的运算——利用单链表

1. 多项式的概念

1.1 多项式的定义

  • 有限的单项式之和称为多项式,其中每个单项式叫做多项式的项,不含字母的项叫做常数项。
  • 多项式里,次数最高的项的次数叫做这个多项式的次数。
  • 多项式按某个字母降或升幂排序。
  • 单项式与多项式统称为整式。

1.2 多项式的表示

  • 通常在数学中对一元n次多项式可表示成如下的形式,设多项式的最高可能阶数为maxDegree,当前的最高阶数为n,各个项按指数递增的次序,从0到n顺序排列。
    (1)一元n次多项式的数学式:
    Pn(x)=a0+a1x+a2x2+a3x3+……+an−1xn−1+anxn=∑ni=0aixi P_n(x) = a_0 + a_1x + a_2x^2 + a_3x^3 + …… + a_{n-1}x^{n-1} + a_nx^n = ∑_{i=0}^n a_ix^i
    (2)一元n次多项式的存储表示:

    编号 0 1 2 3 …… n maxDegree
    coef a0 a_0 a1 a_1 a2 a_2 a3 a_3 …… an a_n ……
  • 缺很多项而且各项指数跳动很大的一元多项式称为稀疏多项式。如果在存储多项式时只存储那些系数非零的项,可以节省存储空间。因此,对于每一个系数非零的项只存储它的系数 ai a_i和指数 ei e_i,并用一个存储各系数非零项的数组来表示这个多项式。其中,每个 ai a_i是 Pn(x) P_n(x)中的非零系数,指数 ei e_i是递增的,即0≤ e0 e_0< e1 e_1<……< em e_m
    (1)一元多项式的数学式:
    Pn(x)=a0xe0+a1xe1+a2xe2+a3xe3+……+amxem P_n(x) = a_0x^{e_0} + a_1x^{e_1} + a_2x^{e_2} + a_3x^{e_3} + …… + a_mx^{e_m}
    (2)一元多项式的存储表示:

    编号 0 1 2 3 …… i …… m maxDegree
    coef a0 a_0 a1 a_1 a2 a_2 a3 a_3 …… ai a_i …… am a_m ……
    exp e0 e_0 e1 e_1 e2 e_2 e3 e_3 …… ei e_i …… em e_m ……

1.3 多项式的运算法则

  • 多项式的加法:指多项式中同类项的系数相加,字母保持不变(即合并同类项)。
  • 多项式的乘法:指把一个多项式中的每个单项式与另一个多项式中的每个单项式相乘之后合并同类项。

2. 多项式运算的实现

2.1 多项式的结点结构定义

  • (1)文件:Term.h

    
    #ifndef TERM_H_#define TERM_H_#include <iostream>#include <string>#include <strstream>using namespace std;struct Term             //多项式结点的定义
    {float coef;         //数据域——系数int exp;            //数据域——指数Term *link;         //指针域——后继指针//初始化数据与指针成员的构造函数Term(float c, int e, Term* ptr = NULL){ coef = c; exp = e; link = ptr; }
    };#endif /* TERM_H_ */
    

2.2 多项式的类定义及其操作的实现

  • 文件:Polynomial.h

    
    #ifndef POLYNOMIAL_H_#define POLYNOMIAL_H_#include "Term.h"class Polynomial//带附加头结点
    {
    public:Polynomial();                                                   //构造函数Polynomial(const Polynomial& L);                                //拷贝构造函数~Polynomial();                                                 //析构函数
    public:Term* Search(const int e)const;                                 //搜索数据值为x的结点并返回Term* InsertAfter(Term* lastNode, const float c, const int e);  //后插法建立链表void Output()const;                                             //输出所有结点的数据值void Sort();                                                    //表排序——冒泡排序void MakeEmpty();                                               //清空链表(保留附加头结点)
    public:Term* GetHead()const;                                           //返回附加头结点的地址int GetMaxOrder();                                              //获取最大阶数
    private:Term *first;                                                    //链表的头结点
    };//构造函数
    Polynomial::Polynomial()
    : first(new Term(0, -1))
    {cout << "$ 执行构造函数" << endl;
    }//拷贝构造函数
    Polynomial::Polynomial(const Polynomial& L)
    {cout << "$ 执行拷贝构造函数" << endl;Term *srcptr = L.GetHead();Term *destptr = first = new Term(0, -1);while (NULL != srcptr->link){srcptr = srcptr->link;destptr->link = new Term(srcptr->coef, srcptr->exp);destptr = destptr->link;}
    }//析构函数
    Polynomial::~Polynomial()
    {cout << "$ 执行析构函数" << endl;MakeEmpty();
    }//搜索数据值为x的结点并返回
    Term* Polynomial::Search(const int e)const
    {Term *curNode = first->link;while ((NULL != curNode) && (e != curNode->exp)){curNode = curNode->link;}return curNode;
    }//后插法建立链表
    Term* Polynomial::InsertAfter(Term* lastNode, const float c, const int e)
    {if ((c == 0) || (e < 0)){return lastNode;}Term *curNode = Search(e);if (NULL != curNode){curNode->coef += c;return lastNode;}Term *newNode = new Term(c, e);lastNode->link = newNode;return lastNode->link;
    }//输出所有结点的数据值
    void Polynomial::Output()const
    {Term *curNode = first->link;if (NULL != curNode){cout << "Pn(x) = ";}while (NULL != curNode){if ((first->link != curNode) && (curNode->coef > 0)){cout << "+";}if (0 == curNode->exp){cout << curNode->coef;}else{cout << curNode->coef << "*x^" << curNode->exp; }curNode = curNode->link;}cout<<endl;
    }//表排序——冒泡排序
    void Polynomial::Sort()
    {Term *curNode = first->link;while (NULL != curNode){Term *nextNode = curNode->link;while (NULL != nextNode){if (curNode->exp < nextNode->exp){float coef_temp = curNode->coef;curNode->coef = nextNode->coef;nextNode->coef = coef_temp;int exp_temp = curNode->exp;curNode->exp = nextNode->exp;nextNode->exp = exp_temp;}nextNode = nextNode->link;}curNode = curNode->link;}
    }//清空链表(保留附加头结点)
    void Polynomial::MakeEmpty()
    {Term *curNode = NULL;while (NULL != first->link)         //当链表不为空时,删去链表中所有结点{curNode = first->link;          //保存被删结点first->link = curNode->link;    //将链表附加头结点中指针域的指针指向被删结点的下一个结点delete curNode;                 //从链表上摘下被删结点}
    }//返回附加头结点的地址
    Term* Polynomial::GetHead()const
    {return first;
    }//获取最大阶数
    int Polynomial::GetMaxOrder()
    {Sort();if (NULL == first->link){return -1;}return first->link->exp;
    }#endif /* POLYNOMIAL_H_ */
    

2.3 多项式加法运算的实现

  • 文件:PolynomialAdd.h

    
    #ifndef POLYNOMIAL_ADD_H_#define POLYNOMIAL_ADD_H_#include "Polynomial.h"Polynomial operator + (Polynomial& polynomial1, Polynomial& polynomial2)
    { Polynomial destpolynomial;Term *destlastNode = destpolynomial.GetHead();Term *curNode1 = polynomial1.GetHead()->link;Term *curNode2 = polynomial2.GetHead()->link;while ((NULL != curNode1) && (NULL != curNode2)){if (curNode1->exp == curNode2->exp){if (0 != curNode1->coef + curNode2->coef){destlastNode = destpolynomial.InsertAfter(destlastNode, curNode1->coef + curNode2->coef, curNode1->exp);}curNode1 = curNode1->link;curNode2 = curNode2->link;}else if (curNode1->exp > curNode2->exp){destlastNode = destpolynomial.InsertAfter(destlastNode, curNode1->coef, curNode1->exp);curNode1 = curNode1->link;}else if (curNode1->exp < curNode2->exp){destlastNode = destpolynomial.InsertAfter(destlastNode, curNode2->coef, curNode2->exp);curNode2 = curNode2->link;}}return destpolynomial;
    }#endif /* POLYNOMIAL_ADD_H_ */
    

2.4 多项式乘法运算的实现

  • 文件:PolynomialMultiply.h

    
    #ifndef POLYNOMIAL_MULTIPLY_H_#define POLYNOMIAL_MULTIPLY_H_#include "Polynomial.h"Polynomial operator * (Polynomial& polynomial1, Polynomial& polynomial2)
    {Polynomial destpolynomial;Term *destlastNode = destpolynomial.GetHead();Term *curNode1 = polynomial1.GetHead()->link;while (NULL != curNode1){Term *curNode2 = polynomial2.GetHead()->link;while (NULL != curNode2){destlastNode = destpolynomial.InsertAfter(destlastNode, curNode1->coef * curNode2->coef, curNode1->exp + curNode2->exp);curNode2 = curNode2->link;}curNode1 = curNode1->link;}return destpolynomial;
    }#endif /* POLYNOMIAL_MULTIPLY_H_ */
    

2.5 主函数(main函数)的实现

  • 文件:main.cpp

    
    #include "PolynomialAdd.h"  #include "PolynomialMultiply.h"//返回输入的结点数据值
    template <class T>
    T get_value(const string& content)
    {string value;cout << content;cin >> value;return StrToTtype<T>(value);
    }//类型转换——将string型转为模板类型T
    template <class T>
    T StrToTtype(const string& s_num)
    {T n_num;strstream ss_num;ss_num << s_num;ss_num >> n_num;return n_num;
    }//构造多项式
    void construct_polynomial(Polynomial* linkedList)
    {Term *lastNode = linkedList->GetHead();float coef = get_value<float>("newNode->coef = ");int exp = get_value<int>("newNode->exp = ");while ((coef != 0) && (exp >= 0)){lastNode = linkedList->InsertAfter(lastNode, coef, exp);coef = get_value<float>("newNode->coef = ");exp = get_value<int>("newNode->exp = ");}linkedList->Sort();linkedList->Output();
    }int main(int argc, char* argv[])
    {Polynomial *polynomial1 = new Polynomial;construct_polynomial(polynomial1);Polynomial *polynomial2 = new Polynomial;construct_polynomial(polynomial2);Polynomial adddest = (*polynomial1) + (*polynomial2);adddest.Output();Polynomial multiplydest = (*polynomial1) * (*polynomial2);multiplydest.Output();delete polynomial1;delete polynomial2;system("pause");return 0;
    }

参考文献:
[1]《数据结构(用面向对象方法与C++语言描述)(第2版)》殷人昆——第二章
[2]《C/C++常用算法手册》秦姣华、向旭宇——第六章
[3] 百度搜索关键字:多项式、多项式的运算

多项式(Polynomial)的运算——利用单链表相关推荐

  1. c语言用单链表实现lru算法,利用单链表实现LRU算法

    利用单链表实现LRU算法 首先,我们先看下对于Node的定义: package datastructure.linklist.node; import lombok.Data; /** * 单链表节点 ...

  2. 数据结构与算法 实验二:利用单链表(实现ADT)判断回文

    必须要有两个 .h文件 和一个 .cpp文件,一个定义,一个实现,一个解决问题: LinkedList.h #ifndef LINKEDLIST_H_ #define LINKEDLIST_H_ #i ...

  3. 数据结构学习之单链表

    节点类 #ifndef Node_H #define Node_H template <class Type> class Node //单链节点类 { public: Type data ...

  4. 单链表存储一元多项式[IMUT 数据结构实验]

    题目 [问题描述] 利用单链表存储一元多项式. [基本要求] 实现以下基本操作: (1)从键盘输入一元多项式的信息,建立一元多项式. (2)实现两个一元多项式相加,并输出和多项式. 分析 题目说是用单 ...

  5. 实习一 线性表及其应用 (题目:一元稀疏多项式的加法运算 )

    一.需求分析 1.输入并建立两个多项式: 2.多项式a与b相加,建立和多项式c: 3.输出多项式a,b,c.输出格式:比如多项式a为:A(x)=c1xe1+ c2xe2+-+ cmxem,其中,ci和 ...

  6. 【数据结构】单链表的应用(C语言)

    1.设计一个算法,求一个单链表中的节点数 2.设计一个算法,在一个单链表中值为y的结点前插入一个值为x的结点(值为x的新结点为成为值为y的结点前驱结点) 3.设计一个算法,判断单链表中各结点是否有序 ...

  7. 【数据结构链表】之五单链表

    一:链表基础 1.链表基础----------------摘录自百度百科 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中 ...

  8. 成绩管理单链表文件c语言,c语言学生信息管理完整.docx

    学生信息管理系统 本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉 C 语言的文件和单链表的各种基本操作.本程序中涉及结构体.单链表.文件等方面的知 识.通过本程序的训练,使学 ...

  9. 单链表的应用(电话本)

    单链表 单链表的定义就不说了, 很简单, 请自行百度; 那么从今天的主题<单链表的应用>入手; 利用单链表实现电话本的模拟程序:定义单链表的数据类型,将头插法和尾插法.插入.逆置.删除.查 ...

最新文章

  1. Android HttpClient post MultipartEntity - Android 上传文件
  2. java 判断日期是同一天_如何检查Java中的两个日期是否在同一天
  3. 16位汇编相关寄存器
  4. oracle驱动权限如何修改,详解如何实现Oracle修改用户权限和角色
  5. 科技部成立新一代人工智能发展研究中心
  6. mpi tcp连接报错_关于WinCC与真实PLC之间的TCP/IP连接问题-工业支持中心-西门子中国...
  7. 非递归中序,后序,先序遍历二叉树完整代码(用链式栈实现)
  8. Dynamic Performance Tables not accessible Automatic Statistics disabled for this session
  9. 【入门】PyTorch文本分类
  10. 64 位Instant Client连接64位PLSQL(win10)
  11. godot引擎学习7
  12. 【大杂烩】杂7杂8的东西
  13. python的rs232通信_RS-232与Python的通信返回Gibberish
  14. Named Route index has a default child route. When navigating to this named route to name index
  15. 0085 开头的电话拦截方法(小米手机有效)
  16. 智慧工地-未来工地新形态
  17. python执行时产生了typeerror错误?
  18. Eclipse无法启动
  19. 安卓手机怎么设置蓝牙耳机弹窗动画_链接重推其他团无线蓝牙耳机
  20. GooglePageRank排名新算法(一)

热门文章

  1. Java 编程问题:十三、HTTP 客户端和 WebSocket API
  2. Ubuntu20.04部署微软counterfit AI系统安全测评工具实战
  3. 【MOOC嵩天Python语言程序设计】第9周 Python计算生态概览
  4. Hadoop Shell命令-hdfs常用命令
  5. Vue3推荐的替代Vuex的新一代状态管理工具:Pinia 配置教程
  6. 2019年中国互联网企业100强
  7. VMware克隆多个虚拟机
  8. 关于数组名:数组名是数组首元素的地址
  9. 程序员想获得一份高薪工作,得从这4个方面入手
  10. Python实现的通讯录