将存储为链表的两个多项式相加

Adding two polynomials stored as linked lists

我有以下代码..

    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&&current2!=null) //first ended; insert remaining nodes from second; return result    
     {qwe.insertfirst(current2.retcof(),current2.retexp());current2 = current2.next;}
  if (current2 == null&&current1!=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() 函数。

我在这里看到的最重要的事情是你没有正确处理你的 current 变量中的任何一个是 null 的情况,以防止 NPE(如你所见)...

你的代码,下面的格式更好,有几个关于处理 null

的问题
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    
}

考虑 current2null

的情况

您的代码将正确确定它为 null 并进入您的第二个 if 块,然后前进 current1.

但是,您没有防止在后续 if 块中访问 current2 上的字段,因此您最终将获得 NPE,在:

 //otherwise, compare exponents    
if (current1.retexp() > current2.retexp())  // right here! you access current2, but it's null :(

如果您的任一链接是 null,您需要绕过所有这些逻辑,这样您就不会陷入困境。

下面是完整的解析代码。

    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&&current2!=null)

     {qwe.insertfirst(current2.retcof(),current2.retexp());current2 = current2.next;}
  if (current2 == null&&current1!=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);

}

}