线性表的应用

文章目录

  • 线性表的应用
    • 一元多项式(polynomial)的加法
      • 数学表示方法
      • 计算机内实现
        • 数据的存放方法
        • 数据结构的选择
        • 一元多项式以及基本操作的实现
      • 结束

一元多项式(polynomial)的加法

数学表示方法

一元多项式通常按幂升序排列,在数学上表示为:

pn(x) =p0 + p1x + p2x2 + p3x3 + p4x4 + p5x5 +… + pnxn

计算机内实现

在计算机内实现的话,可以使用线性表来存储,每个结点内存储两个成员:data数据、next指针,data数据包括单项式的系数和次数

且是按照次数的升序来进行存储的

《《此处应有图片,参考课本图2-18

数据的存放方法

如果不论次数是否为0都将数据存储进结点,那么有可能会造成空间的大量浪费,比如1 + x100

如果只存储次数不为0的单项式,不会造成空间的浪费,但是考虑到两个多项式相加,次数相同的多项式需要合并在一起,这种存储方式可能需要花费一些时间来寻找两个多项式里的相同次数的单项式

数据结构的选择
  1. 不用多说必须使用动态内存,静态内存会造成空间不够或者空间浪费的情况
  2. 数据结构选择链表,顺序表动态开辟内存是成倍开辟,会造成空间浪费
一元多项式以及基本操作的实现

polynomial.h

#include"sList.h"

数据结构是链表,要包含链表的头文件

(不过说实话,好像并没有用上链表的功能,只是用了链表作为结构体,除了用到了sList头问价中的#include以及using namespace std之外好像啥也没用上)

组成多项式的基本单位:单项式结点

struct Type
{int coef;//系数int exp;//次数
};template<class elemType>
struct Node
{elemType data;//数据Node* next;//下一个结点
};

在这里,次数和系数被存放在了结构体Type

结点Node包括data和next,因为用的模板,所以data适用于任何数据类型,当然也包括Type

不是直接将次数和系数放到Node里是为了Node的复用性,Node作为链表结点只包含data和next两个成员

这里既可以使用结构体也可以使用类,因为在C++中,类和结构体的唯一区别就是类的成员默认是私有的,结构体的默认是公有的(下面的也是

多项式及其加法的构想

多项式的构想:

构建一个多项式就是输入每一个单项式的系数和次数,等到所有的单项式都输入完毕,多项式就构建好了

但是单项式一个一个输入比较麻烦,可以一口气全部输入完,最后输入一个结束标志表示所有的单项式都输入完了,停止多项式的构建

每个单项式含有两个数据,那就将输入的这一串数字每两个写入一个Node中,如果读取到的两个数字跟结束标志相符,则说明多项式构建好了

由于写入多项式的前提是已知所有单项式的系数和次数,只要把不是次数和系数的组合的两个数作为结束标志就可以了

加法的构想:

用a、b表示两个相加的多项式,用另一个多项式c作为多项式相加的结果

如果a、b多项式里有同类相,要合并之后作为结果,没有同类相的单项式直接作为结果

多项式及加法的实现

多项式类(结构体)的定义

template <class elemType>
struct Polynomial
{private:Node<elemType>* head;elemType stop_flag;//多项式结束标志,用作判断多项式是否结束
public:Polynomial(const elemType& stop);void getPoly();//读入一个多项式void addPoly(const Polynomial& a, const Polynomial& b);//相加函数void dispPoly();//显示一个多项式void clear();//释放多项式空间(清空多项式,仅保留头结点~Polynomial() { clear(); delete head; };//销毁所有动态内存
};

数据成员只需要有头和结束标志就可以,头是链表的头,有了头就可以找到链表的所有数据;结束标志用来判断多项式是否结束

获取多项式结束标志

//getStop为外部函数,是非类成员函数
template <class elemType>//从用户处获取结束标志
void getStop(elemType& stopFlag)
{int c, e;cout << "请输入系数、指数对作为结束标志,如'0 0'" << endl;cin >> c >> e;stopFlag.coef = c;stopFlag.exp = e;
}

不同的多项式的结束标志是可以相同的,获取一次结束标志就可以供所有多项式使用,因此没有必要将其作为成员函数

个人认为这里有点强行构建模板类

在使用的时候,其实elemType只能是Type结构体或者Node结构体,因为在各个模板类和模板函数中,都用到了elemType的成员coef和exp,或者elemType的成员head,只有Type具有成员coef和exp,只有Node有head,直接使用具体的变量类型不更简单吗

而且这个是多项式的加法,并不会封装用于其他变量

相反,多项式的次数和系数更应该使用eleType或者直接用double,因为可能不止整型

polynomial.cpp

#include "polynomial.h"
template <class elemType>
Polynomial<elemType>::Polynomial(const elemType &stop) //从用户处获取结束标志并初始化多项式
{head = new Node<elemType>();stop_flag.coef = stop.coef;stop_flag.exp = stop.exp;
}
template <class elemType>
void Polynomial<elemType>::getPoly() //读入一个多项式
{Node<elemType> *p, *next;elemType e;p = head;cout << "请按照升幂的顺序输入系数、次数对,并最后输入结束标志作结尾结束多项式的输入" << endl;cin >> e.coef >> e.exp;while (e.coef != stop_flag.coef || e.exp != stop_flag.exp) //先判断有没有到多项式的结尾{next = new Node<elemType>(); //不断创建新结点来保存数据next->data.coef = e.coef;next->data.exp = e.exp;p->next = next; // p接上新结点p = next;       // p后移cin >> e.coef >> e.exp;}
}

这里注意,在判断有没有到多项式结尾的时候的条件,是系数和次数同时一一等于结束标志对,即e.coef == stop_flag.coef && e.exp == stop_flag.exp,换做while循环的条件就是:次数或系数有一个不同于结束标志就可以进入循环

也可以写成这样:

While(1)

{

​ if(e.coef == stop_flag.coef && e.exp == stop_flag.exp)

​ break;

}

直接在while处进行判断比较简便,但是要注意条件不要出错

template <class elemType>
void Polynomial<elemType>::addPoly(const Polynomial &a, const Polynomial &b) //相加函数,a、b分别就是两个要相加的多项式
{Node<elemType> *pa, *pb, *pc; //分别用在a、b、c三个链表上Node<elemType> *New;          //创建新结点,用来保存结果并插入到多项式c中pa = a.head->next, pb = b.head->next;pc = head; //说明正在调用这个相加函数的对象是第三个多项式while (pa && pb) //如果a、b两个多项式都没有走完{if (pa->data.exp == pb->data.exp){if (pa->data.coef + pb->data.coef == 0){pa = pa->next;pb = pb->next;continue;}else{New = new Node<elemType>();New->data.coef = pa->data.coef + pb->data.coef;New->data.exp = pa->data.exp;pa = pa->next;pb = pb->next;}}else if (pa->data.exp > pb->data.exp){New = new Node<elemType>();New->data.coef = pb->data.coef;New->data.exp = pb->data.exp;pb = pb->next;}else{New = new Node<elemType>();New->data.coef = pa->data.coef;New->data.exp = pa->data.exp;pa = pa->next;}New->next = NULL; //将相加的结果作为新结点尾插到c中pc->next = New;pc = New;}//跳出第一个whlie循环说明a、b中至少一个走完了while (pa) //如过a没走完{New = new Node<elemType>();New->data.coef = pa->data.coef;New->data.exp = pa->data.exp;New->next = NULL;pc->next = New;pc = New;pa = pa->next;}while (pb) //如过b没走完{New = new Node<elemType>();New->data.coef = pb->data.coef;New->data.exp = pb->data.exp;New->next = NULL;pc->next = New;pc = New;pb = pb->next;}
}
template <class elemType>
void Polynomial<elemType>::dispPoly() //显示一个多项式
{Node<elemType> *p;p = head->next;if (!p){cout << "多项式为空" << endl;return;}cout << "多项式系数指数对分别为" << endl;while (p){cout << p->data.coef << " " << p->data.exp << endl;p = p->next;}cout << "到此结束" << endl;
}
template <class elemType>
void Polynomial<elemType>::clear() //释放多项式空间(清空多项式,仅保留头结点
{Node<elemType> *p = head->next;while (p){head->next = p->next;delete p;p = head->next;}
}

测试用例test.cpp

#include "polynomial.cpp"
int main()
{Type stop_flag;getStop(stop_flag);Polynomial<Type> a(stop_flag), b(stop_flag), c(stop_flag);a.getPoly();b.getPoly();c.addPoly(a, b);c.dispPoly();return 0;
}

a=7+3x+9x8+5x17

b=8x+22x7-9x8

结果c应该是7+11x+227+5x17

结束

That’s all, thanks for reading!

数据结构_线性表的应用-多项式加法(C++相关推荐

  1. Algorithms_基础数据结构(04)_线性表之链表_单向循环链表约瑟夫环问题

    文章目录 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 约瑟夫问题 结构 分析 大纲图 链表的经典面试题目 如何设计一个LRU缓存淘汰算法 tip:单向链表 约瑟夫问题 N个人围成一圈, ...

  2. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...

    python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...

  3. c语言如何删除数组中的某一个元素_数据结构之线性表高效删除重复元素

    刚刚学完数据结构之线性表中关于顺序表和单链表的知识,我们知道顺序表中存储数据的结构是一个数组,对于数组来说,在尾部插入.删除元素是比较高效的,但是如果在中间或者开头插入.删除元素,就会涉及数据的搬移, ...

  4. 【Java数据结构】线性表

    线性表 线性表是最基本.最简单.也是最常用的一种数据结构. 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而 ...

  5. Python 数据结构 之 线性表 的链式存储结构

    用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明:  Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...

  6. 算法实例_线性表 By:比方

    算法实例_线性表 By:比方 什么是线性表? 从线性表的功能逻辑上来看,线性表就是由n(n>=0)个数据元素的排序组合,数据由x1,x2,x3,...,xn结构有序的顺序排列. 线性表的结构和特 ...

  7. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

  8. step3 . day2 数据结构之线性表链表

    今天继续学习数据结构的线性表部分,从基础的顺序表到链表,类比写了一些调用函数,完成了表的增删改查排序等问题. 尤其是链表的排序,费了很大的心思终于捋顺写出来了,小有成就感,而且代码一次通过率越来越高, ...

  9. 数据结构之线性表(附代码)

    数据结构 之 线性表(附代码) 线性表思维导图: 线性表定义(逻辑结构): 一.顺序表 1.顺序表思维导图: 2.顺序表的逻辑结构: 3.顺序表基本操作的功能实现: 1.线性表的静态定义: 2.线性表 ...

  10. 数据结构之线性表的基本C语言语法

    一开始没做笔记,大家想看的话可以参考这里 [数据结构绪论] [数据结构(二)] [数据结构--算法和算法分析] [数据结构--渐进时间复杂度] [数据结构--初识线性表] [数据结构--线性表的顺序实 ...

最新文章

  1. 实用javaScript技术-屏蔽总结
  2. php 对象里还有哪些对象_PHP面向对象(OOP)之实例化对象的方法
  3. neo4j cypher_优化Neo4j Cypher查询
  4. Java中引入泛型的好处
  5. Zlib压缩算法:LZ77、LZ78、霍夫曼编码、滑动窗口、Rabin-Karp算法、哈希链、I/O缓冲区
  6. hfss matlab api,HFSS-Matlab-API实践体会与HFSS Scripting快速入门
  7. python端口扫描工具_基于Python的简易端口扫描器
  8. 博途v14电脑要求_博途v15对电脑配置要求
  9. 参数问题:nested exception is java.lang.NumberFormatException: For input string: “null“,已解决。
  10. 百度云网盘一直显示“下载请求中”,一个 解决办法
  11. 马三步内可以到达的点
  12. C Primer Plus(6) 中文版 第5章 运算符、表达式和语句 5.2 基本运算符
  13. 今天2006的第一天,灰蒙蒙的元旦节!
  14. 【cocos2d-x 大型ARPG手游研发----地图活起来了】
  15. 2022年人工智能发展情况及值得关注的人工智能发展趋势
  16. android hdmi拔插广播,拒绝频繁拔插:绿联 HDMI切换器 晒单
  17. gRPC快速入门(三)——Protobuf应用示例
  18. 献给android原生应用层开发初学者技术架构选型和整合的方案思路(二)
  19. 后浪:移动互联网时代的数据中心设计
  20. python笔记01:我和 Python 第一次亲密接触

热门文章

  1. 解决企业内部上网行为安全隐患很重要!
  2. python写入word表格_python-docx编辑word表格
  3. 投资应不乱于心,不困于情
  4. Android使用广播与服务实现音乐播放器
  5. USB学习入门(二)------宝马雕车香满路
  6. darknet源码解读-im2col_cpu
  7. 【思考4】为什么从人的本性出发,我们不可能成为成功的投资者?
  8. Swift 系统学习 06 循环语句
  9. python:(可输入评委人数和参赛人数)模拟决赛现场最终成绩计算过程
  10. 阿里云服务器 phpstudy 搭建多个网站并配置多域名