2012-02-17 78 views
0
package polynomial; 

/** 
* 
* @author Steven 
*/ 

public class Polynomial 
{ 
private float data; 
protected static Polynomial head; 
private Polynomial link; 

/** 
* @param args the command line arguments 
*/  
public Polynomial(float[] data) 
{ 
    head = null; 

    if(data.length == 1) 
     head = insertAtFront(head, data[0]); 

    for(int i = data.length-1; i >= 0; i--) 
    { 
     System.out.println(head); 
     head = insertAtFront(head, data[i]); 
    } 
} 

public Polynomial(float data, Polynomial link) 
{ 
    this.link = link; 
    this.data = data; 
} 

public static Polynomial add(Polynomial p, Polynomial p2) 
{ 
    if(p.length() > p2.length()) 
    { 
     while(p.length() != p2.length()) 
      { 
       insertAtFront(p2, 0); 
      } 

     for(Polynomial poly = p; poly != null && p2 != null; poly = poly.link) 
     { 
      p2.data = (p2.data + poly.data); 
      p2 = p2.link; 
     } 
    } 
    else if(p2.length() > p.length()) 
    { 
     while(p2.length() != p.length()) 
      { 
       insertAtFront(p, 0); 
      } 

     for(Polynomial poly = p; poly != null && p2 != null; poly = poly.link) 
     { 
      p2.data = (p2.data + poly.data); 
      p2 = p2.link; 
     } 
    } 
    else 
    { 
     for(Polynomial poly = p; poly != null && p2 != null; poly = poly.link) 
     { 
      p2.data = (p2.data + poly.data); 
      p2 = p2.link; 
     } 
    } 
    return p2.head; 
} 

public float evaluate(float x) 
{ 
    int i = head.length()-1; 
    float y = 0; 
    for(Polynomial poly = head; poly != null; poly = poly.link) 
    { 
     if(poly.link == null) 
      y += poly.data; 
     else 
      y += (poly.data * (float)(Math.pow(x, i))); 
     i -= 1; 
    } 
    return y; 
} 

@Override 
public String toString() 
{ 
    int i = 1; 
    String polyString = "blank"; 
    for(Polynomial poly = head; poly != null; poly = poly.link) 
    { 
     if(polyString.equalsIgnoreCase("blank")) 
     { 
      if(poly.data != 0) 
        polyString = poly.data + "x^" + (poly.length()-i) + " + "; 
      else if(poly.data == 1) 
       polyString = "x^" + (poly.length()-i) + " + "; 
      else 
       polyString = poly.data + "x^" + (poly.length()-i) + " + "; 
     } 
     else 
     { 
      if(poly.link == null) 
      { 
       if(poly.data != 0) 
        polyString = polyString + poly.data; 
       else if(poly.data == 1) 
        polyString = polyString + "x"; 
       else 
        polyString = polyString + poly.data + "x^" + (poly.length()-i); 
      } 
      else 
      { 
       if(poly.data != 0) 
        polyString = polyString + poly.data + "x^" + (poly.length()-i) + " + "; 
       else if(poly.data == 1) 
        polyString = polyString + "x^" + (poly.length()-i) + " + "; 
       else 
        ; 
      } 
     } 
     i = i + 1; 
    } 
    return polyString; 
} 

public int length() 
{ 
    int answer = 0; 

    for(Polynomial poly = head; poly != null; poly = poly.link) 
    { 
     answer++; 
    } 
    return answer; 
} 

private static Polynomial insertAtFront(Polynomial head, float data) 
{ 
    return new Polynomial(data, head); 
} 

} 

我有第二个类只是一个程序来运行这些方法,并且当我创建一个新的多项式时,并运行相关的方法,一切似乎运行成功。在创建一个新的多项式后,第一个多项式取第二个值。我不明白1.第一个创建的多项式值是在哪里进行的,2.为什么它是这样做的。当我构建第二个新的多项式(链表)类时,第一个采用第二个的值

回答

0
protected static Polynomial head; 

head被声明为static - 所以有它的所有类只有一个副本!一旦你的第二个Polynomial被创建,它将覆盖第一个的头部。

您可能希望它是实例变量而不是类变量。
虽然这样做也会有其无限递归构造函数调用的问题。为了克服它,你可能想要一个不同的类来保存Polynomial head作为一个实例变量,并且每个列表只对其初始化一次。

相关问题