一元多项式的表达和相加

​ 使用单链表表示一元多项式,由于使用java语言自己编写实现,没有使用LinkedList集合实现。所以需要创建单链表的类,类中包含指数,系数和后继元素的地址。类的设计如下:

public class SingleList {

public double coef;//系数

public int expn;//指数

public SingleList next;//后继

//构造函数

public SingleList(double coef, int expn) {

this.coef = coef;

this.expn = expn;

}

}

​ 下面来讲解一下如何用单链表表示和运算。

/*

*

* 1.一元多项式的表示:

* 采用单链表的形式表示,只存储非0系数项

* 链表中的每一个项封装成一个对象:coef--系数 expn--指数 next--后继元素

*

* 2.一元多项式的相加:

* 2.1定义两个指针qa和qb分别指向两个链表的当前元素

* 2.2如果两个指针都不为空的时候执行while循环

* 2.3循环语句中包含三种情况:

* 2.3.1 qa的指数小于qb的指数:qa的指针后移,qb不动,结束本次循环

* 2.3.2 qa的指数等于qb的指数:

* 计算系数和sum

* 1.如果系数和为0,将qa指向的元素删除,qa指针同时后移一位

* 2.如果系数和不为0,将qa指向的元素的系数修改为sum,qa指针后移一位

* 3.无论系数是不是为0,,删除qb指向的元素,qb指针后移

* 2.2.2 qa的指数大于qb的指数:qb的指针后移,qa不动,结束本次循环

* 2.4如果第二个链表不为空,将剩余元素插入到第一个链表的最后

* 2.5清空并释放链表2

*/

**1.**在类中首先定义两个头结点,用于指向链表中的第一个元素,不表示具体的元素项。

import java.util.Scanner;

public class PolynomialOfOne {

//两个 链表的头结点

public static SingleList head1 = new SingleList(0,0);

public static SingleList head2 = new SingleList(0,0);

}

**2.**初始化链表方法

/*

* 多项式链表初始化

*/

public static void init(SingleList head) {

head.next = null;

}

**3.**增加元素项

/*

* 多项式链表增加元素项

*/

public static void put(SingleList head,SingleList m){

//1.如果链表为空,直接放到头结点后

if(head.next == null) {

head.next = m;

return;

}

//2.如果链表不空,找到链表的最后一个元素,插入

SingleList p = head.next;

while(p.next != null) {

p = p.next;

}

p.next = m;

}

**4.**遍历输出多项式

/*

* 遍历输出

*/

public static void traverse(SingleList head) {

SingleList p = head.next;

int k = 0;//记录位置

while(p != null) {

k++;

if(k == 1 || p.coef < 0) {//第一项或者系数为负数时,不需要另加运算符

System.out.print(p.coef+"x^"+p.expn);

}

else {//不是第一项的正数项,需要加“+”运算符

System.out.print("+"+p.coef+"x^"+p.expn);

}

p = p.next;

}

System.out.println();

}

**5.**两个多项式相加

/*

* 两个多项式相加

*/

public static void addition() {

//多项式加法:head1+head2,利用两个多项式的节点构成“和多项式”

//pa和pb分别指向head1和head2中的当前结点

SingleList qa = head1.next;

SingleList qb = head2.next;

//当pa和pb均为非空时

while(qa !=null && qb !=null) {

if(qa.expn < qb.expn) {//多项式ha中的当前结点指数值小

qa = qa.next;

}//if

else if(qa.expn == qb.expn) {//多项式ha和hb中的当前结点指数值相等

double sum = qa.coef + qb.coef;//系数和

if(sum != 0.0) {//如果系数值不为0就修改当前ha中当前结点的值

qa.coef = sum;

qa = qa.next;

}//else if

else {//删除多项式ha中的当前结点,并将qa指向下一个结点

qa = freeElement(head1, qa);

}

//无论系数和为不为0,都要将当前的qb的元素删除

qb = freeElement(head2, qb);

}

else {//多项式hb中的当前结点指数值小

qb = qb.next;

}//else

}//while

//如果链表2不为空,将元素加入到链表1的后边

if(!isEmpty(head2)) {

appEnd(head1, head2);

}

//释放链表2

clear(head2);

}

**6.**删除多项式中的项

/*

* 删除链表中的某个元素并返回所删元素的下一个元素

*/

public static SingleList freeElement(SingleList head,SingleList l) {

SingleList p = head.next;//当前位置的元素

SingleList q = head;//q为p的前驱

while(p!=null) {

//如果找到该元素,删除后跳出循环

if(p == l) {

q.next = p.next;

p = null;

break;

}

//否则元素后移,前驱也跟着后移

else {

p = p.next;

q = q.next;

}

}

return q.next;

}

**7.**判断链表是否为空

/*

* 判断链表是否为空

*/

public static boolean isEmpty(SingleList head) {

if(head.next == null) {

return true;

}

else {

return false;

}

}

**8.**清空链表

/*

* 清空链表

* 如果head的后继为空,直接return即可

* 否则定义一个指针,依次后移将元素置空,最后将head的后继置空

*/

public static void clear(SingleList head) {

if(head.next==null) {

return;

}

SingleList p = head.next;

while(p.next!=null) {

head.next = p.next;//记录p的后继

p = null;

p = head.next;//p后移

}

head.next = null;//表置空

}

**9.**将一个链表的元素插入到另一个链表的最后

/*

* 将一个链表h2的元素插入到另一个链表h1的最后

*/

public static void appEnd(SingleList h1,SingleList h2) {

SingleList p = h1.next;//指针

while(p!=null) {

//当p.next等于空时,找到了h1的最后元素

if(p.next==null) {

//h1的最后元素指向h2的第一个元素完成连接

p.next = h2.next;

break;

}

p = p.next;

}

}

**10.**测试主函数

public static void main(String[] args) {

Scanner reader = new Scanner(System.in);

//初始化链表

System.out.println("请输入你的选择:\n输入-1停止添加:");

init(head1);

init(head2);

while(true) {

//选择操作

System.out.println("请输入你的选择:\n1.给多项式1添加新项\n2.给多项式2添加新项\n输入-1结束");

int select = reader.nextInt();//输入的选择

//输入-1结束添加

if(select == -1) {

break;

}

else {

//输入系数和指数

System.out.println("请输入系数:");

double coef = reader.nextDouble();

System.out.println("请输入指数:");

int expn = reader.nextInt();

//封装成对象

SingleList L = new SingleList(coef, expn);

//如果输入的为1给多项式1添加 否则给多项式2添加

if(select == 1) {

put(head1, L);

}

else {

put(head2, L);

}

}

}

//添加结束,打印输出

System.out.println("多项式1如下:");

traverse(head1);

System.out.println("多项式2如下:");

traverse(head2);

System.out.println("*****************************");

addition();

traverse(head1);

}

**11.**运行实例

多项式1如下:

3.0x^1+5.0x^2+9.0x^6

多项式2如下:

6.0x^1-5.0x^2+7.0x^3+8.0x^4+11.0x^5+7.0x^7

*****************************

9.0x^1+9.0x^6+7.0x^3+8.0x^4+11.0x^5+7.0x^7

本文地址:https://blog.csdn.net/weixin_47666481/article/details/110245019

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

单链表一元多项式求和java_计算一元多项式的相加相关推荐

  1. 单链表逆置 java_单链表的就地逆置--java实现(含头节点和不包含头节点)

    前沿:链表是面试中经常问道的知识点,比如链表反转,就地反转,判断单链表是否相交,判断链表是否有环等都是常问的问题.今天说一下单链表就地反转. 本文从包含头节点和不包含头节点两种链表都提供了相应的就地反 ...

  2. java单链表基本操作 一,Java_实现单链表-基本操作

    1 packageofficeCoding;2 3 importjava.util.ArrayList;4 importjava.util.Stack;5 6 /** 7 * 从尾到头遍历链表 输入一 ...

  3. C语言——一元多项式定义求和 [单链表] (数据结构)

    输入多项式项数后,对多项式进行描述,将求两个多项式和 仅为demo基础版,可拓展. 单链表实现 #include<stdio.h> #include<stdlib.h> #in ...

  4. 数据结构一元多项式的相加-单链表实现

    实验内容:把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果. 一元多项式可以用单链表表示,结点结构图示如下: coef  exp next 首先分析一下这个过程是 ...

  5. 一元多项式的相加(单链表的应用)

    一元多项式的相加,基于单链表的结构上实现的. 单链表的结点结构定义为: typedef struct _NODE { int coef; int exp; struct _NODE *next; }N ...

  6. 【一元多项式算法】设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接。设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中。

    [一元多项式算法]设一个一元多项式采用带头结点的单链表存储,所有结点 按照升幂方式链接.设计一个算法,求两个多项式 A 和 B 的乘积,结果多项式 C 存放在新辟的空间中. #include<s ...

  7. java 单链表一元多项式_java单链表实现一元多项式加法和乘法运算

    设有一个一元多项式  f(x)=∑aixi  ,我们要用一个单链表将它表示出来,并实现它的加和乘运算.多项式的每一项放在一个结点中,每个结点中放两个信息,即每一项的系数和幂.在这里我们用有头结点的链表 ...

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

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

  9. c语言单链表实现一元多项式相加算法

    给定两个一元多项式,实现两个一元多项式的相加算法.提示:用一条单链表表示一个一元多项式,每个节点包含三个域:指数域.系数域和后继结点链. 可直接运行 #include <stdio.h> ...

最新文章

  1. HTML5 监听当前位置
  2. AI玩填字游戏,赢得全国锦标赛冠军!官方:不是人,没有奖金和名次
  3. 用 C 语言开发一门编程语言 — 语法解析器
  4. Javascript入门视频教程
  5. 软件工程综合实践阶段小结(2)
  6. 关于开源软件的书籍一定要尽量提供搭配好的软件版本
  7. 【学习笔记】7、标准数据类型—字符串
  8. JAXB –新手的观点,第2部分
  9. 关于 spring MVC 配置自动扫描中 use-default-filters 属性
  10. linux 简单命令
  11. SpringMVC自学日志05(结果跳转方式,数据处理 ,乱码问题)
  12. php监控url,php对URL地址探测
  13. php - 获取数组头尾元素
  14. SQL Server - 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)
  15. 标签打印软件如何制作图文标签
  16. 雅虎将提供PHP网站托管服务
  17. DevOps 小组运维管理手册
  18. 不用加减乘除做四则运算
  19. oracle数据删了怎么恢复吗,oracle误删数据恢复方法总结
  20. CRFEntityExtractor文档

热门文章

  1. 【Python】Python进程池multiprocessing.Pool八个函数对比:apply、apply_async、map、map_async、imap、starmap...
  2. Matlab随机森林库
  3. 敏感文件/目录扫描工具 dirsearch
  4. HTML中input输入框动态模糊匹配
  5. Django 配置数据库相关
  6. 世界首个拥有肌肉骨骼机器人问世(组图)
  7. 微信开发者工具字体模糊
  8. 【福利继续无套路】整理的一系列IT视频
  9. layui教程,非常全,常用代码一键复制粘贴
  10. Java面试题中高级,nasdocker有啥好玩的