将存储为链表的两个多项式相加
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&¤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() 函数。
我在这里看到的最重要的事情是你没有正确处理你的 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
}
考虑 current2
是 null
的情况
您的代码将正确确定它为 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&¤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);
}
}
我有以下代码..
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() 函数。
我在这里看到的最重要的事情是你没有正确处理你的 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
}
考虑 current2
是 null
您的代码将正确确定它为 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&¤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);
}
}