gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:48:06 25 4
gpt4 key购买 nike

我有以下代码..

    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() 函数。

最佳答案

我在这里看到的最重要的事情是,您缺乏正确处理当前当前变量为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 block ,然后前进 current1

但是,您无法防止对后续 if block 中的 current2 上的字段进行访问,因此您最终将在以下位置获得 NPE:

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

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

关于java - 添加存储为链表的两个多项式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28996980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com