Добавление полиномов (связанных списков) ...... Справка по ошибкам - PullRequest
0 голосов
/ 29 марта 2010

Я написал программу, которая создает узлы, которые в этом классе являются частями полиномов, а затем два полинома складываются вместе, чтобы стать одним полиномом (список узлов). Весь мой код компилируется, поэтому единственная проблема, с которой я столкнулся, заключается в том, что узлы не вставляются в полином через метод вставки, который у меня есть в polynomial.java, и при запуске программы он создает узлы и отображает их в формате 2x ^ 2, но когда дело доходит до сложения многочленов, они отображают o как многочлены, так что если кто-нибудь сможет выяснить, что не так и что я могу сделать, чтобы это исправить, это будет очень ценно.

Вот код:

import java.util.Scanner;

class Polynomial{

    public termNode head;

    public Polynomial()
    {
        head = null;
    }

    public boolean isEmpty()
    {
        return (head == null);
    }

    public void display()
    {
        if (head == null)
            System.out.print("0");
        else
            for(termNode cur = head; cur != null; cur = cur.getNext())
                {
                    System.out.println(cur);
                }
    }

    public void insert(termNode newNode)
    {
        termNode prev = null;
        termNode cur = head;
        while (cur!=null && (newNode.compareTo(cur)<0))
            {
                prev = null;
                cur = cur.getNext();
            }
        if (prev == null)
            {
                newNode.setNext(head);
                head = newNode;
            }
        else
            {
                newNode.setNext(cur);
                prev.setNext(newNode);
            }
}
 public void readPolynomial(Scanner kb)
    {
        boolean done = false;
        double coefficient;
        int exponent;
        termNode term;
        head = null; //UNLINK ANY PREVIOUS POLYNOMIAL
        System.out.println("Enter 0 and 0 to end.");
        System.out.print("coefficient: ");
        coefficient = kb.nextDouble();
        System.out.println(coefficient);
        System.out.print("exponent: ");
        exponent = kb.nextInt();
        System.out.println(exponent);
        done = (coefficient == 0 && exponent == 0);
        while(!done)
            {
                Polynomial poly = new Polynomial();
                term = new termNode(coefficient,exponent);
                System.out.println(term);
                poly.insert(term);

                System.out.println("Enter 0 and 0 to end.");
                System.out.print("coefficient: ");
                coefficient = kb.nextDouble();
                System.out.println(coefficient);
                System.out.print("exponent: ");
                exponent = kb.nextInt();
                System.out.println(exponent);
                done = (coefficient==0 && exponent==0);
            }
    }
public static Polynomial add(Polynomial p, Polynomial q)
    {
        Polynomial r = new Polynomial();
        double coefficient;
        int exponent;
        termNode first = p.head;
        termNode second = q.head;
        termNode sum = r.head;
        termNode term;
        while (first != null && second != null)
            {
                if (first.getExp() == second.getExp())
                    {
                        if (first.getCoeff() != 0 && second.getCoeff() != 0);
                        {
                            double addCoeff = first.getCoeff() + second.getCoeff();
                            term = new termNode(addCoeff,first.getExp());
                            sum.setNext(term);
                            first.getNext();
                            second.getNext();
                        }
                    }
                else if (first.getExp() < second.getExp())
                    {
                        sum.setNext(second);
                        term = new termNode(second.getCoeff(),second.getExp());
                        sum.setNext(term);
                        second.getNext();
                    }
                else
 {
                        sum.setNext(first);
                        term = new termNode(first.getNext());
                        sum.setNext(term);
                        first.getNext();
                    }
            }
        while (first != null)
            {
                sum.setNext(first);
            }
        while (second != null)
            {
                sum.setNext(second);
            }
        return r;
    }
}

Вот мой класс Node:

class termNode implements Comparable
{
    private int exp;
    private double coeff;
    private termNode next;

    public termNode(double coefficient, int exponent)
    {
        coeff = coefficient;
        exp = exponent;
        next = null;
    }

    public termNode(termNode inTermNode)
    {
        coeff = inTermNode.coeff;
        exp = inTermNode.exp;
    }

    public void setData(double coefficient, int exponent)
    {
        coefficient = coeff;
        exponent = exp;
    }

    public double getCoeff()
    {
        return coeff;
    }

    public int getExp()
    {
        return exp;
    }

    public void setNext(termNode link)
    {
        next = link;
    }

    public termNode getNext()
    {
        return next;
    }
 public String toString()
    {
        if (exp == 0)
            {
                return(coeff + " ");
            }
        else if (exp == 1)
            {
                return(coeff + "x");
            }
        else
            {
                return(coeff + "x^" + exp);
            }
    }
 public int compareTo(Object other)
    {
        if(exp ==((termNode) other).exp)
            return 0;
        else if(exp < ((termNode) other).exp)
            return -1;
        else
            return 1;
    }

}

А вот мой тестовый класс для запуска программы.

import java.util.Scanner;

class PolyTest{

    public static void main(String [] args)
    {
        Scanner kb = new Scanner(System.in);
        Polynomial r;
        Polynomial p = new Polynomial();
        System.out.println("Enter first polynomial.");
        p.readPolynomial(kb);
        Polynomial q = new Polynomial();
        System.out.println();
        System.out.println("Enter second polynomial.");
        q.readPolynomial(kb);
        r = Polynomial.add(p,q);
        System.out.println();
        System.out.print("The sum of ");
        p.display();
        System.out.print(" and ");
        q.display();
        System.out.print(" is ");
        r.display();
    }
}

Ответы [ 2 ]

4 голосов
/ 29 марта 2010

Несколько предложений:

  • Имена классов по соглашению начинаются с прописных букв, например, TermNode
  • Используйте дженерики, т.е. TermNode implements Comparable<TermNode>
  • На самом деле, вероятно, даже лучше иметь Node<Term> вместо

Ошибки, которые я видел:

  • prev = null; в insert
    • Должно быть prev = cur;
    • Подумайте об этом как вспомогательном find -подобном методе
  • В readPolynomial вы создаете новую Polynomial каждую итерацию и ничего не делаете для this.
    • Вы хотите либо вставить термины в this, либо оставить один Polynomial, который вы return, в конце static readPolynomial метода
  • while (first != null) sum.setNext(first);
    • Что вы пытаетесь достичь здесь? Это бесконечный цикл!

Дополнительные предложения:

  • Может быть проще / более читабельно / и т.д. сделать add в два прохода:
    • merge полиномы сначала, убедившись, что термины правильно упорядочены
      • 3x+1 и 2x+2 объединяются в 3x+2x+1+2
    • Затем simplify путем слияния любых последовательных пар терминов, имеющих одинаковый показатель степени
      • 3x+2x упрощается до 5x
  • Как только он заработает, рассмотрите возможность оптимизации до add за один проход, если необходимо
  • Фактически, полиномиальное слияние может быть легко выполнено в O(N^2) с использованием insert
    • Сначала поправьте, оптимизируйте до O(N), позже
  • Во время отладки / разработки часто распечатывайте полиномы. Сделайте это после того, как прочитаете это. Сделайте это после вставки. Сделайте это после первого прохода add. Сделайте это после второго прохода.
0 голосов
/ 29 марта 2010

Я сразу вижу одну ошибку: при обходе списка вам нужно сохранить текущий узел cur в prev, прежде чем двигаться дальше. Но вы все время присваиваете null prev:

while (cur!=null && (newNode.compareTo(cur)<0)) {
    prev = null;//  <---- should be prev = cur;
    cur = cur.getNext();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...