У меня есть назначение, когда я манипулирую полиномами, используя связанные списки. Одна часть задания состоит в том, чтобы взять первую, вторую и третью производные от полинома. Все мои методы работают индивидуально. Однако после запуска метода первой производной он меняет исходный список ввода на то, что первая производная - что-то я не хочу.
Вот мой метод:
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
Вероятно, это очень простая ошибка, но по какой-то причине я не могу ее поймать. Спасибо за любую помощь, я ценю это!
EDIT: метод attach в производном методе:
private void attach (int coeff, int exp) {
Term t = new Term (coeff, exp);
newList.addLast(t);
}
Вы только инициализируете экземпляр newList
(с помощью newList = new ObjectList()
), не newList = new ObjectList()
в него ничего, и вы обновляете условия списка входных list1
.
Вы не отправляли код ObjectList
и ObjectListNode
, поэтому я не могу сказать точные методы, которые вы должны вызывать, чтобы добавлять узлы в newList
, но вы должны добавить новый узел в newList
для каждого узла списка ввода, инициализировать он должен содержать копию соответствующего Свода входного списка и обновлять термин нового списка вместо Терминала списка ввода.
РЕДАКТИРОВАТЬ:
Вы не передаете 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);
Однако, если вы хотите обновить 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;
}