链表的经典应用,程序在多项式相加同类项合并还有小的瑕疵,有待改进。

代码如下:

package 一元多项式计算器;public class PolyNode {private double a;  private int i;  PolyNode next;  public PolyNode(double a,int i){  this.a=a;  this.i=i;  this.next=null;  }  public PolyNode(){  this(0,0);  }  public double getA() {  return a;  }  public int getI() {  return i;  }  public void setA(double a) {  this.a = a;  }  public void setI(int i) {  this.i = i;  }  }
package 一元多项式计算器;public class PolyList {PolyNode head;  PolyNode current;  public PolyList(){  head=new PolyNode();  current=head;  head.next=null;  }  //是否为空  public boolean isEmpty(){  return head.next==null;  }  //这里只考虑按顺序插入元素  public void insert(PolyNode node){  current.next=node;  current=node;  }  //打印多项式  public String printS(){  StringBuilder s=new StringBuilder("");  StringBuilder a=new StringBuilder("");  StringBuilder i=new StringBuilder("");  StringBuilder theOne=new StringBuilder("");current=head.next;int count1=0;int count2=0;while(current!=null){if(current.getA() == 0){count1++;}count2++;current = current.next;}if(count1 == count2){s.append("0");}else{current=head.next;  while(current!=null){  a.delete(0, a.length());  i.delete(0, i.length());  theOne.delete(0, theOne.length());  if((current.getA()==1 || current.getA()==-1) && current.getI()!=0)  a.append("");  else if(current.getA() < 0){a.append(String.valueOf((-current.getA())));}else{a.append(String.valueOf(current.getA()));  }if(current.getI()==1)  {  i.append("");  theOne.append(a.toString()).append("x").append(i.toString());  } else if(current.getI()==0){  i.append("");  theOne.append(a.toString());  } else{i.append(String.valueOf(current.getI()));  theOne.append(a.toString()).append("x^").append(i.toString());  }if(current.getA() == 0){s.append("");}else{if(current==head.next && current.getA()<0){s.append("-").append(theOne.toString());}else if(current==head.next && current.getA()>0){s.append(theOne.toString());}else if(current.getA() < 0){s.append(" - ").append(theOne.toString());}elses.append(" + ").append(theOne.toString());  }current = current.next;  }}return s.toString();  }  //加法运算  public static PolyList add(PolyList p1,PolyList p2){  PolyList result=new PolyList();  //分别指向p1 p2的第一个元素  p1.current=p1.head.next;  p2.current=p2.head.next;  while(p1.current!=null && p2.current!=null){  if(p1.current.getI()==p2.current.getI()){  result.insert(new PolyNode(p1.current.getA()+p2.current.getA(),p1.current.getI()));  p1.current=p1.current.next;  p2.current=p2.current.next;  }  else if(p1.current.getI()<p2.current.getI()){  result.insert(p1.current);  p1.current=p1.current.next;  }else{  result.insert(p2.current);  p2.current=p2.current.next;  }  }  while(p1.current!=null){  result.insert(p1.current);  p1.current=p1.current.next;  }  while(p2.current!=null){  result.insert(p2.current);  p2.current=p2.current.next;  }  //return result;  result.current=result.head.next;  PolyNode tempPrevious=result.current;  PolyNode temp=result.current.next;  while(result.current.next!=null){  while(temp!=null)  {  if(temp.getI()!=result.current.getI())  {  temp=temp.next;  tempPrevious=tempPrevious.next;  }else{  result.current.setA(result.current.getA()+temp.getA());  tempPrevious.next=temp.next;  temp=temp.next;  }  }  result.current=result.current.next;  tempPrevious=result.current;  temp=result.current.next;  }         return result;  }  //减法运算public static PolyList sub(PolyList p1,PolyList p2){  PolyList result=new PolyList();p2.current = p2.head.next;while(p2.current!=null){p2.current.setA(-(p2.current.getA()));p2.current=p2.current.next;}//System.out.println(p2.printS());//分别指向p1 p2的第一个元素  p1.current=p1.head.next;  p2.current=p2.head.next;  while(p1.current!=null && p2.current!=null){  if(p1.current.getI()==p2.current.getI()){  result.insert(new PolyNode(p1.current.getA()+p2.current.getA(),p1.current.getI()));  p1.current=p1.current.next;  p2.current=p2.current.next;  }  else if(p1.current.getI()<p2.current.getI()){  result.insert(p1.current);  p1.current=p1.current.next;  }else{  result.insert(p2.current);  p2.current=p2.current.next;  }  }  while(p1.current!=null){  result.insert(p1.current);  p1.current=p1.current.next;  }  while(p2.current!=null){  result.insert(p2.current);  p2.current=p2.current.next;  }  return result;  }  //乘法运算  public static PolyList multiply(PolyList p1,PolyList p2){  PolyList result=new PolyList();  //分别指向p1 p2的第一个元素  p1.current=p1.head.next;  p2.current=p2.head.next;  while(p1.current!=null){  while(p2.current!=null)  {  double a=p1.current.getA()*p2.current.getA();  int i=p1.current.getI()+p2.current.getI();  result.insert(new PolyNode(a,i));  p2.current=p2.current.next;  }  p1.current=p1.current.next;  p2.current=p2.head.next;  }  //合并同类项  result.current=result.head.next;  PolyNode tempPrevious=result.current;  PolyNode temp=result.current.next;PolyNode t = result.current.next;while(result.current.next!=null){  while(temp!=null)  {  if(temp.getI()!=result.current.getI())  {  temp=temp.next;  tempPrevious=tempPrevious.next;  }else{  result.current.setA(result.current.getA()+temp.getA());  tempPrevious.next=temp.next;  temp=temp.next;  }  }  result.current=result.current.next;  tempPrevious=result.current;  temp=result.current.next;  }   return result;  } //就地逆置单链表public static void reverse(PolyList p_){PolyNode p,q;p = p_.head.next;p_.head.next = null;while(p!=null){q = p.next;p.next = p_.head.next;//让p.next变成p_.head.next;p_.head.next = p;//让p_.head.next变成p;p = q;//让p变成q;}}
}
package 一元多项式计算器;
import java.util.*;public class Testclass {public static void main(String[] args) {// TODO Auto-generated method stubwhile(true){PolyList p1 = new PolyList();PolyList p2 = new PolyList();Scanner scan = new Scanner(System.in);System.out.print("请输入要计算的第一个多项式的系数和指数,以0,0结束:");double a = scan.nextDouble();int i = scan.nextInt();while(a!=0 || i!=0){p1.insert(new PolyNode(a,i));a = scan.nextDouble();i = scan.nextInt();}System.out.println("您输入的第一个多项式为:");System.out.println("p1 = " + p1.printS());System.out.print("请输入要计算的第二个多项式的系数和指数,以0,0结束:");a = scan.nextDouble();i = scan.nextInt();while(a!=0 || i!=0){p2.insert(new PolyNode(a,i));a = scan.nextDouble();i = scan.nextInt();}System.out.println("您输入的第二个多项式为:");System.out.println("p2 = " + p2.printS());System.out.println("请按提示选择您想要进行的运算:");System.out.println("0 -----> +");System.out.println("1 -----> -");System.out.println("2 -----> x");int n;n = scan.nextInt();if(n == 0){PolyList resultList= PolyList.add(p1, p2);PolyList.reverse(resultList);System.out.println("p1 + p2 = "+resultList.printS()); }else if(n == 1){PolyList resultList= PolyList.sub(p1, p2);  PolyList.reverse(resultList);System.out.println("p1 - p2 = "+resultList.printS()); }else{PolyList resultList= PolyList.multiply(p1, p2);  //PolyList.reverse(resultList);System.out.println("p1 x p2 = "+resultList.printS()); }}}
}
//还存在的bug:1-当系数为0的时候应该删去一整项;   已解决!
//          2-当一个多项式只有0时,应该输出一个0;已解决!
//          3-计算器的仿真界面。已解决!使用不方便!
//          4-合并同类项有空指针错误,待解决,错误数据如1 1 1 1 0 0+1 1 1 1 0 0;

链表一元多项式计算器的实现(Java语言描述)相关推荐

  1. java链表的用法_数据结构(java语言描述)链表的使用

    1.定义node类,实现Node结点的构造函数(空结点和指定数值的结点),基本的获取结点的指针域,数据域,设置指针域,数据域. package class2; public class Node { ...

  2. 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)

    题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...

  3. 杀人游戏约瑟夫环(洛谷P1145题题解,Java语言描述)

    题目要求 题目链接P1145 约瑟夫环问题了解一下 约瑟夫环问题其实在数据结构里与单循环链表关系密切,但是这里模拟就完事~~ 我写过的约瑟夫环问题 AC代码(Java语言描述) import java ...

  4. HashMap暴力枚举(洛谷P1765题题解,Java语言描述)

    前言 本题水题一个,但是这里会结合着提一些HashMap的内容~~但不是什么深度分析,没营养的... 题目要求 P1765题目链接 分析 这题懒得去排着弄,突然就觉得不如打个表,这样还是很简洁滴~~ ...

  5. 数据结构java实验 刘小晶_《数据结构实例解析与实验指导——Java语言描述》刘小晶著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 刘小晶著 出版社:清华大学出版社 出版时间:2013-2-1 版次:1 印次:1 印刷时间:2013-2-1 字数:619000 页数:380 开本:16开 装帧:平装 ISBN:9 ...

  6. s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...

    <数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...

  7. 算法java语言描述_java语言描述数据结构与算法崔笑颜的博客

    java语言描述数据结构与算法崔笑颜的博客 冒泡排序 插入排序 选择排序 希尔排序 快速排序 归并排序 二分查找package com.demo.test; import java.util.Arra ...

  8. 《数据结构与抽象:Java语言描述(原书第4版)》一JI2.3 抛出异常

    本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. H ...

  9. 《数据结构与抽象:Java语言描述(原书第4版)》一2.2.1 可变大小数组

    本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.2.1节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timo ...

最新文章

  1. 年终总结:2021年五大人工智能(AI)和机器学习(ML)发展趋势
  2. 获取顺序容器vector,deque,string和array的首尾元素的方法有四个
  3. 生成验证码图片的Java代码
  4. ARM汇编中的ldr和adr的区别及其在uboot中相关源码的分析
  5. 问题 G: 区间权值
  6. 回到顶部 jquery
  7. NEAT(NeuroEvolution of Augmenting Topologies)算法详解与实践(基于NEAT-Python)
  8. 【NLP Subword】三大算法原理:BPE、WordPiece、ULM
  9. linux夸分区建立软链接,Linux硬链接和软链接
  10. [iOS] 使用xib做为应用程序入口 with Code
  11. C++函数参数省略号
  12. 聚焦存储即平台,浪潮存储迎来发展新机遇
  13. toms 尺寸 shoes or boots finds
  14. 2018-07-03 根据Excel后缀名获取WorkBook
  15. windows有哪些版本
  16. Android自定义View(一)
  17. Notes on MatConvNet(II):vl_simplenn
  18. 带中文的网页下载为PDF格式的文件(jsPDF)
  19. 解决《新编全医药学大词典》开机启动及桌面快捷方式的问题
  20. 亚马逊智能化管理软件解孵全面便捷的仓库管理功能

热门文章

  1. 大北农集团被指控授意窃取商业秘密
  2. Linux 系统必须掌握的文件_【all】
  3. Java程序设计进阶之路一:捕捉异常
  4. PHP开发之thinkPHP分层设计
  5. ASP.net实现邮件发送
  6. JPA中persistence.xml模板
  7. Happy birthday! Hubble
  8. VS2013中使用git发布解决方案master分支的时候出现错误
  9. 如何导入别人的android studio项目,解决gradle版本不兼容问题
  10. 分布式系统一致性问题解决实战