关闭

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

标签: javanullclassstring算法insert
11401人阅读 评论(3) 收藏 举报
分类:

       设有一个一元多项式  f(x)=∑aixi  ,我们要用一个单链表将它表示出来,并实现它的加和乘运算。多项式的每一项放在一个结点中,每个结点中放两个信息,即每一项的系数和幂。在这里我们用有头结点的链表来表示,那么对于某个多项式 p=2x2+100x3+45x5+3x20  ,它的单链表表示如下:

        尽可能地简单,结点PolyNode类如下:  

package poly;

public class PolyNode {
	
	private int a;
	private int i;
    PolyNode next;
	
	public PolyNode(int a,int i){
		
		 this.a=a;
		 this.i=i;
		 this.next=null;
	}
	public PolyNode(){
		
		this(0,0);
	}
	public int getA() {
		return a;
	}
	public int getI() {
		return i;
	}
	public void setA(int a) {
		this.a = a;
	}
	public void setI(int i) {
		this.i = i;
	}
	
}
    


        加法运算的算法如下图:

        多项式 result 用来保存结果。p1.current 和 p2.current 分别指向 p1 和 p2 的第一个元素,比较它们的幂,如果相等,将它们的系数相加,幂不变,这一新项插入到 result 中,p1.current 和 p2.current 都往后移一位;如果 p1.current 所指向的项的幂小于 p2.current ,则把 p1.current 所指向的这一项插入到 result 中,p1.current 后移一位;同样地,如果 p2.current 所指向的项的幂小于 p1.current ,执行类似的操作。重复这一过程,直到这两个指针都指向 null 。(在单链表中,最后一个结点的 next 指向null)这里还有一个细节,就是这两个指针中一般都会有一个先指向 null ,那么这时候很简单,把剩下的那个指针往后遍历,它及其后面所指向的项都插入 result 即可。

        乘法运算的算法比加法还要简单,同样看上图吧。result 用来保存结果, p1.current先固定, p2.current 遍历,p1.current 的指向乘以 p2.current 所指的每一项,这一次结束后 p1.current 后移一位,重复上述过程,直到 p1.current 指向 null 。不过结果最后有一个合并同类项的问题,这也不难,无非就是每一项跟它后面的所有项比较,如果幂相同的话,就把它们加起来,这里不再赘述,看代码吧。

        链表类 PolyList 如下:

package poly;

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;
		 while(current!=null){
			 
			 a.delete(0, a.length());
			 i.delete(0, i.length());
			 theOne.delete(0, theOne.length());
			 
				 if(current.getA()==1)
					 a.append("");
				 else
					 a.append(String.valueOf(current.getA()));
				 
				 if(current.getI()==1)
				 {
					 i.append("");
					 theOne.append(a.toString()).append("x").append(i.toString());
				 } else{
					 
					 i.append(String.valueOf(current.getI()));
					 theOne.append(a.toString()).append("x^").append(i.toString());
				 }
					 
			 
			if(current==head.next)
				 s.append(theOne.toString());
			else
				s.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;
		 
	}
	//乘法运算
	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)
			   {
				   int 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;
		 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;
	}

}


        演示的代码如下:

package poly;

public class PolyDemo {

	public static void main(String[] args) {

		//多项式p1
         PolyList p1=new PolyList();
         p1.insert(new PolyNode(2,2));
         p1.insert(new PolyNode(100,3));
         p1.insert(new PolyNode(45,5));
         p1.insert(new PolyNode(3,20));
         System.out.println("p1="+p1.printS());
        
       //多项式p2
         PolyList p2=new PolyList();
         p2.insert(new PolyNode(8,2));
         p2.insert(new PolyNode(7,3));
         p2.insert(new PolyNode(4,4));
         p2.insert(new PolyNode(6,18));
         p2.insert(new PolyNode(7,20));
         System.out.println("p2="+p2.printS());
         
        //相加
        PolyList resultList1= PolyList.add(p1, p2);
        System.out.println("p1+p2="+resultList1.printS());
        
        System.out.println();
        
      //多项式p3
        PolyList p3=new PolyList();
        p3.insert(new PolyNode(2,1));
        p3.insert(new PolyNode(3,2));
        p3.insert(new PolyNode(4,3));
        System.out.println("p3="+p3.printS());
        
        
      //多项式p4
        PolyList p4=new PolyList();
        p4.insert(new PolyNode(5,1));
        p4.insert(new PolyNode(1,2));
        System.out.println("p4="+p4.printS());
        
        //相乘
        PolyList resuList2=PolyList.multiply(p3, p4);
        System.out.println("p3*p4="+resuList2.printS());
               
	}

}


        运行的结果如下:      

p1=2x^2+100x^3+45x^5+3x^20
p2=8x^2+7x^3+4x^4+6x^18+7x^20
p1+p2=10x^2+107x^3+4x^4+45x^5+6x^18+10x^20

p3=2x+3x^2+4x^3
p4=5x+x^2
p3*p4=10x^2+17x^3+23x^4+4x^5

 

0
0
查看评论

PAT 一元多项式的乘法与加法运算(链表 c++版)

题目按照指数递减的顺序给出两个一元多项式,输出两个多项式的乘积,还有 和 ,按照指数递减的顺序。 用链表实现一元多项式的乘法与加法运算。 首先来看加法运算 多项式 poly1   x^4 + 3x^3 + 6x 多项式 poly2   6x^5 +...
  • chaiwenjun000
  • chaiwenjun000
  • 2015-09-09 22:45
  • 3517

用链表实现一元多项式的加法运算

#include using namespace std; struct Node { int coef; int exp; Node * next; Node(){coef=0;exp=0;next=nullptr;} }; class Polyn { private: //int le...
  • fightingyxy
  • fightingyxy
  • 2016-02-26 19:13
  • 2803

7-1 一元多项式的乘法与加法运算(20 point(s))

7-1 一元多项式的乘法与加法运算(20 point(s)) 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输...
  • codeswarrior
  • codeswarrior
  • 2017-11-10 21:38
  • 204

PTA--一元多项式的乘法与加法运算

这个问题耗时90分钟才搞定,其中主要的逻辑用时30分钟,调输出格式用时60分钟。。。 我想起来这是我为什么很抵触去写OJ题,很多情况下是你想明白了问题的解法,但是在最后的格式输出上不能完全匹配,便被机器判定为错误的答案。 但是,做的多了,会爱上做OJ题,原因是,要准确匹配题中的所有要求,会逼着你...
  • u011240016
  • u011240016
  • 2016-10-04 19:46
  • 1000

用链表实现一元多项式的加、减、乘、求导运算

在数据结构线性表的链表学习中有一个很有趣的题目:计算两个多项式的加、减、乘和多项式的导数。   题目不难,将多项式的系数和指数存进链表,然后进行相应操作即可。   一、加法:     1、判断指数是否相等,若相等则将系数相加,相加后不为零就开辟新空间,将新的系数存入结点,尾插进新链表中。  ...
  • Jung_zhang
  • Jung_zhang
  • 2015-09-09 15:27
  • 3361

c++一元多项式的乘法和加法

首先是结点类:Term.h代码如下:#ifndef CH_H #define CH_H #include #include #include #include using namespace std; #endif struct Term { float coef; int exp; ...
  • tianjun2012
  • tianjun2012
  • 2014-03-26 20:28
  • 1173

PAT 3-04 一元多项式的乘法与加法运算(C语言实现)

题目描述: 设计函数分别求两个一元多项式的乘积与和。 输入格式说明: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式说明: 输出分2行,分别以指数递降方...
  • wutongyu0113
  • wutongyu0113
  • 2014-10-03 15:14
  • 1561

02-线性结构1 一元多项式的乘法与加法运算 (20分)

02-线性结构1 一元多项式的乘法与加法运算   (20分) 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000...
  • sysusyf
  • sysusyf
  • 2016-03-26 16:51
  • 1322

【数据结构】C++链表实现一元多项式的加法

链表排序借鉴了隔壁家的一个博客 http://www.cnblogs.com/TenosDoIt/p/3666585.html       里面有关于链表的冒泡,选择,插入,快排等详细的代码 #include "stdafx.h...
  • JK851617453
  • JK851617453
  • 2017-10-28 20:10
  • 204

数据结构 PAT 02-线性结构1 一元多项式的乘法与加法运算

02-线性结构1 一元多项式的乘法与加法运算 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指...
  • cs_hmyy
  • cs_hmyy
  • 2015-09-30 19:19
  • 863
    个人资料
    • 访问:547494次
    • 积分:5982
    • 等级:
    • 排名:第5049名
    • 原创:117篇
    • 转载:27篇
    • 译文:0篇
    • 评论:116条
    最新评论