我有以下代码..
import java.io.*;
class Link
{
public int coeff;
public int exp;
Link next;
public Link(int a,int b)
{
coeff=a;exp=b;
}
public int retcof(){
return coeff;
}
public int retexp() {
return exp;
}
public void displayLink(){
System.out.print(coeff+"x^"+exp);
}
}
class LinkList{
Link first,last;
public LinkList(){
;
}
public void insertfirst(int x,int y)
{
Link newLink=new Link(x,y);
newLink.next=first;
first=newLink;
}
public void displayList()
{
Link x=first;
while(x!=null)
{
x.displayLink();
x=x.next;
if(x!=null)
System.out.print("+");
}
}
/*public void add(LinkList a,LinkList b)
{
int p;
Link current1=a.first;
Link current2=b.first;
LinkList qwe=new LinkList();
while(current2!=null)
{
while(current1!=null)
{
if(current1.retexp()>current2.retexp())
qwe.insertfirst(current1.retcof(),current1.retexp());
else if(current2.retexp()>current1.retexp())
qwe.insertfirst(current2.retcof(),current2.retexp());
else if(current1.retexp()==current2.retexp())
{
p=current1.retcof()+current2.retcof();
qwe.insertfirst(p,current2.retexp());
}
current1=current1.next;
}
current2=current2.next;
}
qwe.displayList();
}*/
public void add(LinkList a,LinkList b)
{
Link current1=a.first;
Link current2=b.first;
LinkList qwe=new LinkList();
while (current1 != null || current2 != null) {
//now check if one of them has ended
if (current1 == null&¤t2!=null) //first ended; insert remaining nodes from second; return result
{qwe.insertfirst(current2.retcof(),current2.retexp());current2 = current2.next;}
if (current2 == null&¤t1!=null) //second ended, insert remaining nodes from first; return result
{qwe.insertfirst(current1.retcof(),current1.retexp()); current1 = current1.next;}
//otherwise, compare exponents
if ((current1 != null && current2 != null)&&(current1.retexp() > current2.retexp()))
{qwe.insertfirst(current1.retcof(),current1.retexp()); current1 = current1.next;}
//advance the first pointer, but not he second
else if ((current1 != null && current2 != null)&&(current1.retexp() < current2.retexp()))
{qwe.insertfirst(current2.retcof(),current2.retexp()); current2 = current2.next;}
//in this case advancing the second pointer, but not the first
else if((current1 != null && current2 != null)&&(current1.retexp() == current2.retexp()))//exponents are equal
{qwe.insertfirst(current2.retcof()+current1.retcof(),current2.retexp());; current1 = current1.next; current2 = current2.next;}
//add the members and advance both pointers
}
qwe.displayList();
}
}
class zz
{
public static void main(String [] args)throws IOException
{
int degree1,degree2,num1,itr;
LinkList wow=new LinkList();
LinkList wow1=new LinkList();
//wow.insertfirst(1,2);
System.out.println("Enter the degree of the first polynomial "+" ");
DataInputStream X=new DataInputStream(System.in);
String s=X.readLine();
degree1=Integer.parseInt(s);
itr=degree1;
while(itr>=0){
System.out.print("enter the coeff of x^"+itr+" : ");
s=X.readLine();
num1=Integer.parseInt(s);
wow.insertfirst(num1,itr);
itr--;
}
wow.displayList();
System.out.println("\n"+"Enter the degree of the second polynomial "+" ");
s=X.readLine();
degree2=Integer.parseInt(s);
itr=degree2;
while(itr>=0)
{
System.out.print("enter the coeff of x^"+itr+" : ");
s=X.readLine();
num1=Integer.parseInt(s);
wow1.insertfirst(num1,itr);
itr--;
}
wow1.displayList();
System.out.println("\n");
wow.add(wow,wow1);
}
}
编辑:固定。 add()函数有问题,现在已经纠正了!
还有其他有效的方法吗?如何使这段代码更简单,特别是add()函数看似有点复杂。
答案 0 :(得分:1)
我在这里看到的最重要的事情是,您的current
变量中的任何一个null
变量null
的情况都不能正确处理,这会阻止NPE(正如您所见)。 ..
您的代码,下面更好的格式有关于while (current1 != null || current2 != null) {
//now check if one of them has ended
if (current1 == null) //first ended; insert remaining nodes from second; return result
{
qwe.insertfirst(current2.retcof(),current2.retexp());
current2 = current2.next;
}
if (current2 == null) //second ended, insert remaining nodes from first; return result
{
qwe.insertfirst(current1.retcof(),current1.retexp());
current1 = current1.next;
}
//otherwise, compare exponents
if (current1.retexp() > current2.retexp())
{
qwe.insertfirst(current1.retcof(),current1.retexp());
current1 = current1.next;
}
//advance the first pointer, but not he second
else if (current1.retexp() < current2.retexp())
{
qwe.insertfirst(current2.retcof(),current2.retexp());
current2 = current2.next;
}
//in this case advancing the second pointer, but not the first
else //exponents are equal
{
qwe.insertfirst(current2.retcof()+current1.retcof(),current2.retexp());
current1 = current1.next;
current2 = current2.next;
}
//add the members and advance both pointers
}
current2
考虑null
为if
您的代码将正确地确定它为空并输入您的第二个current1
块,并提前current2
。
但是,您无法阻止if
后续 //otherwise, compare exponents
if (current1.retexp() > current2.retexp()) // right here! you access current2, but it's null :(
区域中null
字段的访问,因此您最终将获得NPE:
{{1}}
如果你的任何一个链接是{{1}},你需要绕过所有这些逻辑,这样你就不会陷入这种混乱。
答案 1 :(得分:0)
以下是完整解析的代码。
import java.io.*;
class Link
{
public int coeff;
public int exp;
Link next;
public Link(int a,int b)
{
coeff=a;exp=b;
}
public int retcof(){
return coeff;
}
public int retexp() {
return exp;
}
public void displayLink(){
System.out.print(coeff+"x^"+exp);
}
}
class LinkList{
Link first,last;
public LinkList(){
;
}
public void insertfirst(int x,int y)
{
Link newLink=new Link(x,y);
newLink.next=first;
first=newLink;
}
public void displayList()
{
Link x=first;
while(x!=null)
{
x.displayLink();
x=x.next;
if(x!=null)
System.out.print("+");
}
}
public void add(LinkList a,LinkList b)
{
Link current1=a.first;
Link current2=b.first;
LinkList qwe=new LinkList();
while (current1 != null || current2 != null) {
if (current1 == null&¤t2!=null)
{qwe.insertfirst(current2.retcof(),current2.retexp());current2 = current2.next;}
if (current2 == null&¤t1!=null)
{qwe.insertfirst(current1.retcof(),current1.retexp()); current1 = current1.next;}
if ((current1 != null && current2 != null)&&(current1.retexp() > current2.retexp()))
{qwe.insertfirst(current1.retcof(),current1.retexp()); current1 = current1.next;}
else if ((current1 != null && current2 != null)&&(current1.retexp() < current2.retexp()))
{qwe.insertfirst(current2.retcof(),current2.retexp()); current2 = current2.next;}
else if((current1 != null && current2 != null)&&(current1.retexp() == current2.retexp()))//exponents are equal
{qwe.insertfirst(current2.retcof()+current1.retcof(),current2.retexp());; current1 = current1.next; current2 = current2.next;}
}
qwe.displayList();
}
}
class k
{
public static void main(String [] args)throws IOException
{
int degree1,degree2,num1,itr;
LinkList wow=new LinkList();
LinkList wow1=new LinkList();
System.out.println("Enter the degree of the first polynomial "+" ");
DataInputStream X=new DataInputStream(System.in);
String s=X.readLine();
degree1=Integer.parseInt(s);
itr=degree1;
while(itr>=0){
System.out.print("enter the coeff of x^"+itr+" : ");
s=X.readLine();
num1=Integer.parseInt(s);
wow.insertfirst(num1,itr);
itr--;
}
wow.displayList();
System.out.println("\n"+"Enter the degree of the second polynomial "+" ");
s=X.readLine();
degree2=Integer.parseInt(s);
itr=degree2;
while(itr>=0)
{
System.out.print("enter the coeff of x^"+itr+" : ");
s=X.readLine();
num1=Integer.parseInt(s);
wow1.insertfirst(num1,itr);
itr--;
}
wow1.displayList();
System.out.println("\n");
wow.add(wow,wow1);
}
}