数组存放:

不需要记录幂,下标就是。

比如1,2,3,5表示1+2x+3x^2+5x^3

有了思路,我们很容易定义结构

typedef struct node{float * coef;//系数数组int maxSize;//最大容量int order;//最高阶数
}Polynomial;

先实现求和:我们想求两个式子a+b,结果存在c中。

逻辑很简单,就是相加啊。

void Add(Polynomial & A,Polynomial & B,Polynomial & C)
{int i;int m=A.order;int n=B.order;for(i=0;i<=m && i<=n;i++)//共有部分加一起C.coef[i]=A.coef[i]+B.coef[i];while(i<=m)//只会执行一个,作用是把剩下的放入cC.coef[i]=A.coef[i];while(i<=n)C.coef[i]=B.coef[i];C.order=(m>n)?m:n;//等于较大项
}

实现乘法:

我们思考一下,两个多项式怎么相乘?

把a中每一项都和b中每一项乘一遍就好了。

高中知识

void Mul(Polynomial & A,Polynomial & B,Polynomial & C)
{int i;int m=A.order;int n=B.order;if(m+n>C.maxSize){printf("超限");return;}for(i=0;i<=m+n;i++)//注意范围,是最高项的幂加起来C.coef[i]=0.0;for(i=0;i<=m;i++){for(j=0;j<=n;j++){C.coef[i+j]+=A.coef[i]*B.coef[j];}}C.order=m+n;//注意范围,是最高项的幂加起来
}

利用数组存放虽然简单,但是当幂相差很大时,会造成空间上的严重浪费(包括时间也是),所以我们考虑采用链表存储。

我们思考一下如何存储和做运算。

我们肯定要再用一个变量记录幂了。每个节点记录系数和指数。

考虑如何相加:

对于c,其实刚开始是空的,我们首先要实现一个插入功能,然后,遍历a和b,进一步利用插入函数来不断尾插。

因为a和b都是升幂排列,所以相加的时候,绝对不会发生结果幂小而后遇到的情况,所以放心的一直插入就好了。

具体实现也比较好想:a和b幂相等就加起来,不等就小的单独插入,然后指针向后移。

加法就放老师写的代码吧,很漂亮的代码:(没和老师商量,希望不会被打)

老师原地插的,都一样都一样

老师原文:http://www.edu2act.net/article/shu-ju-jie-gou-xian-xing-biao-de-jing-dian-ying-yong/

void AddPolyn(polynomial &Pa, polynomial &Pb)//多项式的加法:Pa = Pa + Pb,利用两个多项式的结点构成“和多项式”。
{LinkList ha = Pa;     //ha和hb分别指向Pa和Pb的头指针LinkList hb = Pb;LinkList qa = Pa->next;LinkList qb = Pb->next;    //ha和hb分别指向pa和pb的前驱while (qa && qb)     //如果qa和qb均非空{float sum = 0.0;term a = qa->data;term b = qb->data;switch (cmp(a,b)){case -1:    //多项式PA中当前结点的指数值小ha = qa;qa = qa->next;break;case 0:       //两者指数值相等sum = a.coef + b.coef;if(sum != 0.0){   //修改多项式PA中当前结点的系数值qa->data.coef = sum;ha = qa;}else{   //删除多项式PA中当前结点DelFirst(ha, qa);free(qa);}DelFirst(hb, qb);free(qb);qb = hb->next;qa = ha->next;break;case 1:DelFirst(hb, qb);InsFirst(ha, qb);qb = hb->next;ha = ha->next;break;}//switch}//whileif(!ListEmpty(Pb))Append(Pa,qb);DestroyList(hb);}//AddPolyn

对于乘法,我们就不能一直往后插了,因为遍历两个式子,可能出现幂变小的情况。所以我们要实现一个插入函数,如果c中有这一项,就加起来,没这一项就插入。

我们先实现插入函数:(哦,对了,我没有像老师那样把系数和指数再定义一个结构体,都放一起了。还有next我写的link,还有点别的不一样,都无伤大雅,绝对能看懂)

void Insert(Polynomial &L,float c,int e)//系数c,指数e
{Term * pre=L;Term * p=L->link;while(p && p->exp<e)//查找{pre=p;p=p->link;}if(p->exp==e)//如果有这一项{if(p->coef+c)//如果相加是0了,就删除节点{pre->link=p->link;free(p);}else//相加不是0,就合并{p->coef+=c;}}else//如果没这一项,插入就好了,链表插入写了很多遍了{Term * pc=new Term;//创建pc->exp=e;pc->coef=c;pre->link=pc;pc->link=p;        }
}

插入写完了,乘法就好实现了,还是两个循环,遍历a和b,只是最后调用Insert方法实现就ok

insert(c,乘系数,加幂)

拓展:一维数组可以模拟一元多项式。类似的,二维数组可以模拟二元多项式。实现以后有时间写了再放链接。

线性表实现一元多项式操作相关推荐

  1. c++用模板实现稀疏多项式_用线性表实现一元多项式及相加运算

    " 本文主要讨论线性表在多项式计算中的应用,讨论内容涉及到一元n次多项式在计算机中的表示,及多项式相加运算." 01 在数学上,一个一元n次多项式可以按照升幂写成 Pn(x)= p ...

  2. 线性表实现一元多项式的表示及相加(C语言实现)【线性表】

    一元多项式的表示及相加 一元多项式抽象数据类型的动态链式表示 操作举例:构造多项式 一元多项式的表示及相加 符号多项式的表示及其操作是线性表处理的典型用例. 一个一元多项式 Pn(x) 可以表示为 : ...

  3. 数据结构(3)--线性表实现一元多项式加法

    参考书籍:数据结构(C语言版) 严蔚敏 吴伟民编著 清华大学出版社 本文中的代码可从这里下载:https://github.com/qingyujean/data-structure 1.简要说明   ...

  4. 线性表实现多项式相加c语言,用线性表实现多个多项式相加

    今天开始想复习一下数据结构,就从线性表开始吧. 今天是用线性表实现多个多项式相加这个题目,自变量是x. 题目描述如下: 在数学上,一个一元多项式Pn(x)可按降幂写成:Pn(x) = pn x^n + ...

  5. 数据结构(运用线性表实现函数的查找、删改、查询)

    运用线性表实现函数的查找.删改.查询 #include <iostream> #define MaxSize 100 using namespace std; typedef int EL ...

  6. 栈——用顺序表实现栈操作

    一.线性表特点 线性表:由0个或者多个数据元素组成的有限序列 除了第一个节点(头节点),都有前驱节点 除了最后一个节点(尾节点),都有后继节点 线性表主要由顺序存储结构或者链式存储结构 一般线性表:可 ...

  7. [自制简单操作系统] 4、计时器(线性表实现优化中断)

    1.第一版:数组方式[09d] >_<" 在bootpack.h里面的timer.c的声明和结构体: 1 /* timer.c */ 2 #define MAX_TIMER 50 ...

  8. 线性表实现顺序存储结构的完整代码(C语言)

    代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 20 # ...

  9. 【python】队列——用顺序表实现队列操作

    一.队列 队列特点:队尾入队,队首出队,先进先出 二.队列要实现的操作 1.创建一个空队列 class Queue:def __init__(self)self.item=[] 2.添加一个元素ite ...

最新文章

  1. 留着肯定有用,让你脱胎成技术大神的JAVA开发技巧
  2. java calendar.add方法_Java Calendar add()方法与示例
  3. python编程小学生学好吗-小学生都开始学的Python编程到底是什么?
  4. C#-集合练习 107
  5. 【selenium】 selenium web测试工具介绍(一)
  6. C++ class类 实现搜索二叉树(BST)
  7. 【Django】数据库主从配置
  8. JAVA 代码交互率低的原因分析,深入剖析Java编程中的中文问题及建议最优解决方法...
  9. 杭电1715大菲波数
  10. 轻薄于型 强悍于内 拯救者9000X 2021硬核发布
  11. [生活] 2015年终总结,2016开篇计划
  12. Talib技术因子详解(七)
  13. 房贷利率有没有套路?用Python版解读!
  14. 使用JS代码将steam喜加一的免费游戏删除。
  15. ssm框架bean_Bean简介:简化的WordPress框架
  16. Elasticsearch 之(6)kibana嵌套聚合,下钻分析,聚合分析
  17. HTML入门笔记(案例+截图)
  18. Ansys workbench分析应用基础(2)
  19. 如何扩展VMware xp虚拟机磁盘
  20. JST日本压着端子PH系列线对板连接器的PCB封装库

热门文章

  1. git 合并冲突_GIT提交记录和Revert commit过程分析
  2. Qt 编码问题QTextCodec
  3. v210 启动脚本分析
  4. Asterisk权威指南/第二章 Asterisk架构
  5. 移植tslib到开发板及部分问题解决
  6. android平台的s5pc110触摸屏驱动分析
  7. php后台无法登入,typecho 后台无法登陆
  8. 平台系统云服务器配置,01-云平台连接配置
  9. homepod换wifi网络_如何实现短租网络自由,不必换房断网
  10. axure 链接html文件,通过WuliHub免费托管原型Axure HTML文件