0
我已經創建了一個數據結構以使用本地節點類來排斥多項式。我有方法來加減兩個長度爲n的多項式。我試圖添加一個乘法方法,它將返回兩個多項式的乘積。我幾乎完成了這個問題。在這一點上,我試圖創建第三個鏈表(使用Node類)來存儲和返回兩個多項式的乘積。我的問題只是編碼這個解決方案。我得到空指針異常。使用節點類乘以多項式
這裏是我的節點類完整代碼:
public class Node{
//Fields
public int data1;
public int data2;
public Node next;
//constructors
public Node(){
data1 = 0;
data2 = 0;
next = null;
}
public Node(int d1){
data1 = d1;
data2 = 0;
next = null;
}
public Node(int d1, Node n){
data1 = d1;
data2 = 0;
next = n;
}
public Node(int d1, int d2){
data1 = d1;
data2 = d2;
next = null;
}
public Node(int d1,int d2, Node n){
data1 = d1;
data2 = d2;
next = n;
}
//Methods
//Fetch data
public int getData1(){
return data1;
}
public int getData2(){
return data2;
}
//store Data
public void setData1(int d){
data1 = d;
}
public void setData2(int d){
data2 = d;
}
public int addData1(Node n2){
data1 = data1 + n2.data1;
return data1;
}
public int addData2(Node n2){
data2 = data2 + n2.data2;
return data2;
}
public void subData1(Node n2){
data1 = data1 - n2.data1;
}
public int multiplyData1(Node n2){
data1 = data1*n2.data1;
return data1;
}
//getNext
public Node getNext(){
return next;
}
//Get data of next node
public int getNextData1(){
return next.data1;
}
public int getNextData2(){
return next.data2;
}
//Store Link
public void setNext(Node n){
next = n;
}
public boolean containsLink(){
if(this.next != null){
return true;
}else{
return false;
}
}
public static void displayAll(Node head){
for(; head != null; head = head.next){
System.out.printf("%d, %d\n", head.data1, head.data2);
}
}
public static int numOfNonZeroData1(Node n){
int count = 0;
for(; n != null ; n = n.next){
if(n.data1 != 0){
count++;
}
}
return count;
}
public static int numOfNonZeroData2(Node n){
int count = 0;
for(; n != null ; n = n.next){
if(n.data2 != 0){
count++;
}
}
return count;
}
public static int listLength(Node head){
int counter = 0;
for(; head!=null; head = head.next){
counter++;
}
return counter;
}
//copy list [Recursive method found on website StackOverflow.com]
public Node copyData1(Node p) {
if(p == null)
return null;
else
return new Node(p.data1, copyData1(p.next));
}
public Node copyData2(Node p) {
if(p == null)
return null;
else
return new Node(p.data2, copyData2(p.next));
}
//===============================================================
public static void toPolynomial(Node head){
int order = Node.listLength(head);
int i = 0;
int increment = Node.numOfNonZeroData2(head);
for(; head != null; head = head.next){
if(head.data2 != 0 && head.data1 != 0){
if(i >= 0 && i < order){
System.out.printf("%dx^%d", head.data1, head.data2);
i++;
if(i < increment && head.data1 >= 0){
System.out.print("+"); //case integer is positive
}else if(i != increment && head.data1 <= 0){
System.out.println(" "); //case integer is negative
}
}
}
}
System.out.println();
}
public static Node mergeLists(Node n1, Node n2){
if (n1 == null)
return n2;
else if (n2 == null)
return n1;
else {
n1.next = mergeLists(n1.next, n2);
return n1;
}
}
public static Node addPolynomials(Node n1, Node n2) {
Node x = n1;
Node y = n2;
for(x = n1; x != null; x = x.next){
for(y = n2; y != null; y = y.next){
if(x.getData2() == y.getData2()){
x.addData1(y);
System.out.println("Added " + (x.data1 - y.data1) + " and " + y.data1);
}
}
}
System.out.println("Add completed");
return x;
}
public static Node subtractPolynomials(Node n1, Node n2){
Node x = n1;
Node y = n2;
for(x = n1; x != null; x = x.next){
for(y = n2; y != null; y = y.next){
if(x.getData2() == y.getData2()){
x.subData1(y);
System.out.println("Subtracted " + (x.data1 - y.data1) + " and " + y.data1);
}
}
}
System.out.println("Subtract completed");
return x;
}
public static Node multiplyPolynomials(Node n1, Node n2){
Node x = n1;
Node y = n2;
Node z = new Node();
for(x = n1; x != null; x = x.next){
for(y = n2; y != null; y = y.next){
z.data1 = x.multiplyData1(y); // error is here
z.data2 = x.addData2(y);
//System.out.println("Multiplied " + (x.data1 - y.data1) + " and " + y.data1);
z = z.next;
}
}
System.out.println("Multiplication completed");
return x;
}
}
什麼想法?
'我得到一個空指針異常。當你嘗試調試你的程序時,你看到了什麼? –
NPE應該爲您提供獲取錯誤的代碼行。鑑於您在此發佈了荷馬的Illiad,也許您可以將我們指向違規代碼行。 –
我得到了相同的結果...程序進入內循環並在拋出異常之前迭代一次 –