Производный метод изменяет исходный список, когда он должен возвращать newList

1

У меня есть назначение, когда я манипулирую полиномами, используя связанные списки. Одна часть задания состоит в том, чтобы взять первую, вторую и третью производные от полинома. Все мои методы работают индивидуально. Однако после запуска метода первой производной он меняет исходный список ввода на то, что первая производная - что-то я не хочу.

Вот мой метод:

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);
}
Теги:
linked-list

1 ответ

2
Лучший ответ

Вы только инициализируете экземпляр 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;
}
  • 0
    Это то, что происходит. Каждый метод присоединения добавляет coeff и exp как новые узлы. Хотя я не опубликовал код. Позвольте мне опубликовать это прямо сейчас. @Eran

Ещё вопросы

Сообщество Overcoder
Наверх
Меню