полиномиальное сложение с использованием связанного списка в java

Вот моя реализация сложения двух многочленов с использованием связанного списка.
Например, если я хочу добавить
3x^2+5^x+3 и 4x^3+5x+2

сначала я проверяю, есть ли одинаковые показатели степени в двух многочленах, и если да, я добавляю их коэффициенты и добавляю показатели степени к строке.
После добавления одинаковых показателей степени, затем, используя строку, я добавляю оставшиеся части обоих полиномов к конечному результату. результат.

 public class Node2{
        int coef;
        int exp;
        Node2 next;
        Node2(int c,int e,Node2 n){
            coef=c;
            exp=e;
            next=n;
        }
        Node2(int c,int e){
            coef=c;
            exp=e;

        }


}

public class LinkedPoly{
    static String exponent="";
    Node2 head;
    Node2 current;

LinkedPoly(){
    head=null;

}
public void createList(int c,int e){
    head=new Node2(c,e,head);
}

public static LinkedPoly add(LinkedPoly list1,LinkedPoly list2){
    LinkedPoly addList=new LinkedPoly();

    Node2 temp1=list1.head;
            Node2 temp3=temp1;
    Node2 temp2=list2.head;
            Node2 temp4=temp2;
    while(temp1.next!=null){
        while(temp2.next!=null){
            if(temp1.exp==temp2.exp){

            addList.createList((temp1.coef+temp2.coef),temp1.exp);
            exponent+=temp1.exp;

            }
            temp2=temp2.next;
        }
        temp1=temp1.next;
        temp2=temp4;
    }
    String[] array=exponent.split("");
    for(int i=1;i<array.length;i++){

        while(temp3.next!=null){
            if(temp3.exp!=Integer.parseInt(array[i])){
                addList.createList(temp3.coef,temp3.exp);
            }
            temp3=temp3.next;
        }
        while(temp4.next!=null){
            if(temp4.exp!=Integer.parseInt(array[i])){
                addList.createList(temp4.coef,temp4.exp);
            }
            temp4=temp4.next;
        }
    }

    return addList;
}


public static void main (String args[]){
    LinkedPoly l1=new LinkedPoly();
    l1.createList(3,2);
    l1.createList(5,1);
    l1.createList(3,0);
    LinkedPoly l2=new LinkedPoly();
    l2.createList(4,3);
    l2.createList(5,1);
    l2.createList(2,0);

    LinkedPoly l3=add(l1,l2);
    System.out.println(l3.head.next.next.coef);
}

}

Согласно моему примеру, строка степени включает 1 и 0, но она суммирует только коэффициент 1. Кроме того, остальная часть сложения также неверна.

Я не вижу, где я ошибаюсь. Также, как я могу распечатать окончательный список дополнений, чтобы я мог проверить, работает ли эта реализация нормально


person clarkson    schedule 24.06.2014    source источник


Ответы (1)


Вот метод добавления, который работает:

public static LinkedPoly add(LinkedPoly list1,LinkedPoly list2){
    LinkedPoly addList=new LinkedPoly();

    Node2 temp1=list1.head;
    Node2 temp3=temp1;
    Node2 temp2=list2.head;
    Node2 temp4=temp2;
    while(temp1.next!=null){
        while(temp2.next!=null){
            if(temp1.exp==temp2.exp){

                addList.createList((temp1.coef+temp2.coef),temp1.exp);
                exponent+=temp1.exp;

            }
            temp2=temp2.next;
        }
        temp1=temp1.next;
        temp2=temp4;
        addList.print();
    }
    String[] array=exponent.split("");


    while(temp3!=null){
        boolean exponentPresent = false;
        for(int i=1;i<array.length;i++){
            if(temp3.exp==Integer.parseInt(array[i])){
                exponentPresent = true;
            }
        }
        if (!exponentPresent) {
            addList.createList(temp3.coef,temp3.exp);
        }
        temp3=temp3.next;
    }
    while(temp4!=null){
        boolean exponentPresent = false;
        for(int i=1;i<array.length;i++){
            if(temp4.exp==Integer.parseInt(array[i])){
                exponentPresent = true;
            }
        }
        if (!exponentPresent) {
            addList.createList(temp4.coef,temp4.exp);
        }
        temp4=temp4.next;
    }


    return addList;
}

А вот метод печати, который вы можете добавить в класс LinkedPoly:

public void print() {
    current = head;
    System.out.print(current.coef + "x^" + current.exp);
    while (current.next != null) {
        current = current.next;
        System.out.print(" + " + current.coef + "x^" + current.exp);
    }
    System.out.println();
}

Было две основные проблемы с вашим методом добавления.

Проблема №1. Во-первых, ваш цикл по массиву уже включенных показателей был вне ваших циклов по узлам полиномиальных связанных списков — он должен быть внутри. Как вы делали это раньше, ваш процесс выглядел следующим образом:

а. Возьмем один из уже включенных показателей из массива b. Перебрать все члены каждого многочлена c. Если какой-либо из этих терминов имеет показатель степени, не соответствующий показателю из части а., добавьте его к результату. д. Повторить с части а., но используя следующий из уже включенных показателей.

Проблема с этим подходом заключается в том, что вы хотите добавить новый термин к результату только в том случае, если его показатель степени не соответствует НИ ОДНОМУ из уже включенных терминов, а не только в том случае, если он не соответствует одному из них. Вот почему в вашем результате были все эти дополнительные члены x ^ 1 - когда ваша программа находилась в «0» элементе массива, она добавляла члены полиномов x ^ 1.

Проблема №2. Вы должны заменить while (temp3.next!= null) или (temp4.next!=null) просто на (temp3!=null) или (temp4!=null). В противном случае ваш код никогда не доберется до последнего узла полинома (он остановится перед последним, потому что проверяет, есть ли «следующий» после последнего). Вот почему в вашем результате не было условий x^3 и x^4 - ваши циклы заканчивались до того, как они достигли этих условий.

Несколько вещей, которые следует учитывать

  1. Вы используете много временных переменных. Попробуйте дать им более описательные имена или, что еще лучше, найдите способ, который не использует так много.
  2. Я не уверен, почему вы добавляете уже использованные показатели степени в строку «показатель степени», которую затем разбиваете на массив с помощью метода split(). Рассмотрим просто добавление в массив с самого начала.
  3. Ваш метод добавления, вероятно, можно было бы реструктурировать, чтобы он был намного чище. Вместо того, чтобы искать общие показатели двух ваших полиномов, разбираться с ними, а затем разбираться с теми, которые не имеют общего, вы можете попробовать следующее: найти самый высокий показатель степени в любом из ваших полиномов. Затем прокрутите все степени экспоненты от 0 до этого числа. В каждом из этих циклов пройдитесь по каждому многочлену и сложите коэффициенты всех многочленов, которые имеют этот показатель. Таким образом, весь ваш код будет в одном большом цикле.
  4. Прямо сейчас ваш код не гарантирует, что полиномы сохраняют свои члены в порядке - нет способа предотвратить появление члена x ^ 2 перед членом x ^ 3, который предшествует члену x ^ 1. Подумайте о том, чтобы добавить метод sort() в свой класс LinkedPoly, добавить некоторый код во время добавления узла, который гарантирует, что полиномы остаются в порядке, или воспользоваться предложением № 3 выше, которое позволит вам сортировать ваш полином суммы по мере его создания. Или, если их порядок не важен, не беспокойтесь :)
person user3771832    schedule 25.06.2014
comment
Большое спасибо за ответ. Я действительно не думал о проблеме № 1. - person clarkson; 25.06.2014