分享

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

 yesihao 2014-10-09

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

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

  1. package poly;  
  2.   
  3. public class PolyNode {  
  4.       
  5.     private int a;  
  6.     private int i;  
  7.     PolyNode next;  
  8.       
  9.     public PolyNode(int a,int i){  
  10.           
  11.          this.a=a;  
  12.          this.i=i;  
  13.          this.next=null;  
  14.     }  
  15.     public PolyNode(){  
  16.           
  17.         this(0,0);  
  18.     }  
  19.     public int getA() {  
  20.         return a;  
  21.     }  
  22.     public int getI() {  
  23.         return i;  
  24.     }  
  25.     public void setA(int a) {  
  26.         this.a = a;  
  27.     }  
  28.     public void setI(int i) {  
  29.         this.i = i;  
  30.     }  
  31.       
  32. }  
  33.       


        加法运算的算法如下图:

        多项式 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 如下:

  1. package poly;  
  2.   
  3. public class PolyList {  
  4.       
  5.     PolyNode head;  
  6.     PolyNode current;  
  7.       
  8.     public PolyList(){  
  9.           
  10.         head=new PolyNode();  
  11.         current=head;  
  12.         head.next=null;  
  13.     }  
  14.       
  15.     //是否为空  
  16.     public boolean isEmpty(){  
  17.           
  18.         return head.next==null;  
  19.     }  
  20.     //这里只考虑按顺序插入元素  
  21.     public void insert(PolyNode node){  
  22.           
  23.         current.next=node;  
  24.         current=node;  
  25.     }  
  26.     //打印多项式  
  27.     public String printS(){  
  28.           
  29.         StringBuilder s=new StringBuilder("");  
  30.         StringBuilder a=new StringBuilder("");  
  31.         StringBuilder i=new StringBuilder("");  
  32.         StringBuilder theOne=new StringBuilder("");  
  33.           
  34.          current=head.next;  
  35.          while(current!=null){  
  36.                
  37.              a.delete(0, a.length());  
  38.              i.delete(0, i.length());  
  39.              theOne.delete(0, theOne.length());  
  40.                
  41.                  if(current.getA()==1)  
  42.                      a.append("");  
  43.                  else  
  44.                      a.append(String.valueOf(current.getA()));  
  45.                    
  46.                  if(current.getI()==1)  
  47.                  {  
  48.                      i.append("");  
  49.                      theOne.append(a.toString()).append("x").append(i.toString());  
  50.                  } else{  
  51.                        
  52.                      i.append(String.valueOf(current.getI()));  
  53.                      theOne.append(a.toString()).append("x^").append(i.toString());  
  54.                  }  
  55.                        
  56.                
  57.             if(current==head.next)  
  58.                  s.append(theOne.toString());  
  59.             else  
  60.                 s.append("+").append(theOne.toString());  
  61.                   
  62.              current=current.next;  
  63.          }  
  64.          return s.toString();  
  65.     }  
  66.       
  67.     //加法运算  
  68.     public static PolyList add(PolyList p1,PolyList p2){  
  69.           
  70.          PolyList result=new PolyList();  
  71.          //分别指向p1 p2的第一个元素  
  72.          p1.current=p1.head.next;  
  73.          p2.current=p2.head.next;  
  74.          while(p1.current!=null && p2.current!=null){  
  75.                
  76.               if(p1.current.getI()==p2.current.getI()){  
  77.                     
  78.                    
  79.                   result.insert(new PolyNode(p1.current.getA()+p2.current.getA(),p1.current.getI()));  
  80.                   p1.current=p1.current.next;  
  81.                   p2.current=p2.current.next;  
  82.               }  
  83.               else if(p1.current.getI()<p2.current.getI()){  
  84.                     
  85.                   result.insert(p1.current);  
  86.                   p1.current=p1.current.next;  
  87.                     
  88.               }else{  
  89.                   result.insert(p2.current);  
  90.                   p2.current=p2.current.next;  
  91.               }  
  92.          }  
  93.          while(p1.current!=null){  
  94.                
  95.               result.insert(p1.current);  
  96.               p1.current=p1.current.next;  
  97.          }  
  98.          while(p2.current!=null){  
  99.                
  100.               result.insert(p2.current);  
  101.               p2.current=p2.current.next;  
  102.          }  
  103.          return result;  
  104.            
  105.     }  
  106.     //乘法运算  
  107.     public static PolyList multiply(PolyList p1,PolyList p2){  
  108.           
  109.          PolyList result=new PolyList();  
  110.          //分别指向p1 p2的第一个元素  
  111.          p1.current=p1.head.next;  
  112.          p2.current=p2.head.next;  
  113.          while(p1.current!=null){  
  114.                
  115.                while(p2.current!=null)  
  116.                {  
  117.                    int a=p1.current.getA()*p2.current.getA();  
  118.                    int i=p1.current.getI()+p2.current.getI();  
  119.                    result.insert(new PolyNode(a,i));  
  120.                    p2.current=p2.current.next;  
  121.                }  
  122.                p1.current=p1.current.next;  
  123.                p2.current=p2.head.next;  
  124.          }  
  125.          //合并同类项  
  126.          result.current=result.head.next;  
  127.          PolyNode tempPrevious=result.current;  
  128.          PolyNode temp=result.current.next;  
  129.          while(result.current.next!=null){  
  130.                
  131.              while(temp!=null)  
  132.              {  
  133.                  if(temp.getI()!=result.current.getI())  
  134.                  {  
  135.                      temp=temp.next;  
  136.                      tempPrevious=tempPrevious.next;  
  137.                  }else{  
  138.                      result.current.setA(result.current.getA()+temp.getA());  
  139.                      tempPrevious.next=temp.next;  
  140.                      temp=temp.next;  
  141.                  }  
  142.                        
  143.              }  
  144.              result.current=result.current.next;  
  145.              tempPrevious=result.current;  
  146.              temp=result.current.next;  
  147.          }         
  148.          return result;  
  149.     }  
  150.   
  151. }  


        演示的代码如下:

  1. package poly;  
  2.   
  3. public class PolyDemo {  
  4.   
  5.     public static void main(String[] args) {  
  6.   
  7.         //多项式p1  
  8.          PolyList p1=new PolyList();  
  9.          p1.insert(new PolyNode(2,2));  
  10.          p1.insert(new PolyNode(100,3));  
  11.          p1.insert(new PolyNode(45,5));  
  12.          p1.insert(new PolyNode(3,20));  
  13.          System.out.println("p1="+p1.printS());  
  14.           
  15.        //多项式p2  
  16.          PolyList p2=new PolyList();  
  17.          p2.insert(new PolyNode(8,2));  
  18.          p2.insert(new PolyNode(7,3));  
  19.          p2.insert(new PolyNode(4,4));  
  20.          p2.insert(new PolyNode(6,18));  
  21.          p2.insert(new PolyNode(7,20));  
  22.          System.out.println("p2="+p2.printS());  
  23.            
  24.         //相加  
  25.         PolyList resultList1= PolyList.add(p1, p2);  
  26.         System.out.println("p1+p2="+resultList1.printS());  
  27.           
  28.         System.out.println();  
  29.           
  30.       //多项式p3  
  31.         PolyList p3=new PolyList();  
  32.         p3.insert(new PolyNode(2,1));  
  33.         p3.insert(new PolyNode(3,2));  
  34.         p3.insert(new PolyNode(4,3));  
  35.         System.out.println("p3="+p3.printS());  
  36.           
  37.           
  38.       //多项式p4  
  39.         PolyList p4=new PolyList();  
  40.         p4.insert(new PolyNode(5,1));  
  41.         p4.insert(new PolyNode(1,2));  
  42.         System.out.println("p4="+p4.printS());  
  43.           
  44.         //相乘  
  45.         PolyList resuList2=PolyList.multiply(p3, p4);  
  46.         System.out.println("p3*p4="+resuList2.printS());  
  47.                  
  48.     }  
  49.   
  50. }  


        运行的结果如下:      

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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多