我有一个使用链接列表操作多项式的任务。赋值的一部分是取多项式的一阶,二阶和三阶导数。我所有的方法都是单独的。然而,在运行第一个导数方法之后,它将原始输入列表更改为一阶导数 - 我不想要的东西。
这是我的方法:
public ObjectList derivative(ObjectList list1) {
newList = new ObjectList();
ObjectListNode p = list1.getFirstNode();
while (p != null) {
Term t1 = (Term) p.getInfo();
if (t1.getExp() == 0) {
t1.setCoeff(0);
attach(0,0);
p = p.getNext();
}
else {
t1.setCoeff(t1.getCoeff()*t1.getExp());
t1.setExp(t1.getExp() - 1);
attach(t1.getCoeff(), t1.getExp());
p = p.getNext();
}
}
return newList;
}
如您所见,衍生方法的回报为newList
。但是,该方法正在更改原始列表。
在我的主要内容中,我有类似的东西:
ObjectList poly1;
System.out.println("\nEnter a polynomial (for derivatives): ");
poly1 = p.getPolynomial();
System.out.println("First derivative: ");
p.displayPoly(p.derivative(poly1));
System.out.println("\nTest:");
p.displayPoly(poly1);
poly1
最终会改变。
我对我一直使用的控制台的输入是:3x^4+2x^3+1x^2-1x^1+8x^0
这可能是一个非常简单的错误,但由于某些原因我无法抓住它。感谢您的帮助,我很感激!
编辑:衍生方法中的附加方法:
private void attach (int coeff, int exp) {
Term t = new Term (coeff, exp);
newList.addLast(t);
}
答案 0 :(得分:2)
您只是在不添加任何内容的情况下初始化newList
实例(使用newList = new ObjectList()
),并且您正在更新输入列表list1
的条款。
您没有发布ObjectList
和ObjectListNode
的代码,因此我无法说明您应该调用的确切方法,以便将节点添加到newList
,但您应该为输入列表的每个节点添加一个新节点到newList
,初始化它以包含输入列表的相应Term的副本,并更新newList的Term而不是输入列表的Term。 / p>
编辑:
您未将newList
传递给attach
,因此您添加字词的列表与您在derivative
方法中初始化的列表不同。此外,您不应该在输入列表的条款上调用setCoeff
和setExp
,因为您不想更改它。
因此你应该替换:
t1.setCoeff(0);
attach(0,0);
with:
attach(0,0);
并替换:
t1.setCoeff(t1.getCoeff()*t1.getExp());
t1.setExp(t1.getExp() - 1);
attach(t1.getCoeff(), t1.getExp());
with:
attach(t1.getCoeff()*t1.getExp(), t1.getExp() - 1);
但是,如果要更新newList
方法中创建的derivative
,则应将newList传递给attach方法,或取消attach方法并将其内容移至派生方法:
public ObjectList derivative(ObjectList list1) {
newList = new ObjectList();
ObjectListNode p = list1.getFirstNode();
while (p != null) {
Term t1 = (Term) p.getInfo();
if (t1.getExp() == 0) {
Term t = new Term (0,0);
newList.addLast(t);
p = p.getNext();
}
else {
Term t = new Term (t1.getCoeff()*t1.getExp(), t1.getExp() - 1);
newList.addLast(t);
p = p.getNext();
}
}
return newList;
}