我有一个分配,我使用链表操纵多项式。作业的一部分是求多项式的一阶,二阶,三阶导数。我所有的方法都单独起作用。然而,在运行一阶导数方法后,它将原始输入列表更改为一阶导数是什么-这是我不想要的。
方法如下:
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
这可能是一个极其简单的错误,但由于某种原因我无法抓住它。谢谢你的帮助,我很感激!
编辑:派生方法中的attach方法:
private void attach (int coeff, int exp) {
Term t = new Term (coeff, exp);
newList.addLast(t);
}
您只是初始化newList
实例(使用newList = new ObjectList()
),而没有在其中放入任何内容,并且您正在更新输入列表list1
的项。
你没有发布ObjectList
和ObjectListNode
的代码,所以我不能说你应该调用的确切方法,以便向newList
添加节点,但是你应该为输入列表的每个节点添加一个新节点到newList
,初始化它以包含输入列表各自的Term的副本,并更新newList的Term而不是输入列表的Term。
您没有将newList
传递给attach
,因此您正在添加项的列表与您在derivative
方法中初始化的列表不同。此外,您不应该根据输入列表的条件调用setCoeff
和setExp
,因为您不想更改它。
因此你应该替换:
t1.setCoeff(0);
attach(0,0);
:
attach(0,0);
并替换为:
t1.setCoeff(t1.getCoeff()*t1.getExp());
t1.setExp(t1.getExp() - 1);
attach(t1.getCoeff(), t1.getExp());
:
attach(t1.getCoeff()*t1.getExp(), t1.getExp() - 1);
但是,如果您想要更新derivative
方法中创建的newList
,您应该将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;
}