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

时间:2015-03-11 20:44:42

标签: java linked-list polynomial-math

我有以下代码..

    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()函数看似有点复杂。

2 个答案:

答案 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

考虑nullif

的情况

您的代码将正确地确定它为空并输入您的第二个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&&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);

}

}