多项式(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. python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO
  2. Android SystemServiceManager分析
  3. 1.5亿元奖金,给了这50位青年科学家
  4. springboot python 开发效率比较-2018年Java开发值得学习的10大技术
  5. 【Python】Turtle绘制科赫雪花
  6. javascript 西瓜一期 03 机器语言与高级语言
  7. BZOJ 2716: [Violet 3]天使玩偶 | CDQ分治
  8. linux 达梦C接口,达梦数据守护搭建
  9. BZOJ4530[BJOI2014] 大融合
  10. R语言Tukey检验进行事后检验(post hoc)实战:单因素方差分析告诉我们并不是所有的群体手段的效果是均等的,确切地找出哪些组彼此不同使用Tukey检验
  11. 2020年阴历二月二十八 投资理财~如何正确面对黑天鹅
  12. Visio画拓扑图随记
  13. itunes显示app store无法连接服务器,无法连接到iTunes Store的解决方案
  14. Photoshop CS6 Extended 特别版特点介绍
  15. 阿里云 ECS 构建集群
  16. 全新第 13 代英特尔酷睿处理器发布,多线程性能提升 41%
  17. Android Pixel手机Notification小图标显示白方块问题
  18. 201771010137 赵栋《面向对象程序设计(java)》第十五周学习总结
  19. 控制台线、console线做法
  20. ACM论文投稿时如何删除页眉和reference信息

热门文章

  1. Squid 缓存代理(二)---ACL访问控制、日志分析
  2. 什么是DWDM技术?
  3. 如何将Klocwork与Incredibuild一起使用来提高DevOps生产效率
  4. Deepin15.11系统深度驱动助手并未检测出独显问题
  5. 三维坐标变换(旋转矩阵旋转向量)
  6. RTSP 流媒体播放地址
  7. 用strcmp来打印输入三次密码哔哩练习
  8. 录音转文字软件有电脑版吗?推荐这几个音频转文字软件
  9. CP/M:被遗忘的精灵
  10. AAPT: error: resource android:attr/lStar not found.