使用java中的链表进行多项式加法

时间:2014-06-24 19:35:38

标签: java linked-list polynomials

这是我使用链接列表添加两个多项式的实现 例如,如果我想添加
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。此外,其余的加法也是错误的。

我无法看到我在哪里错误。我怎样才能打印出最终的addList,以便我可以检查这个实现是否正常

1 个答案:

答案 0 :(得分:3)

这是一个有效的添加方法:

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 。第一个是你通过已包含的指数数组的循环在你的循环之外通过多项式链表的节点 - 它应该在内部。你以前的方式,你的过程是这样的:

一个。从阵列中取一个已包含的指数 湾浏览每个多项式的所有项 C。如果这些术语中的任何一个具有与a部分中的指数不匹配的指数,则将其添加到结果中。 d。从a。部分重复,但使用已包含的指数中的下一个。

这种方法的问题在于,如果其指数与已包含的任何术语不匹配,您只想在结果中添加新术语 - 而不仅仅是它与其中一个匹配。这就是为什么你的结果有所有额外的x ^ 1术语 - 当你的程序在&#34; 0&#34;数组的元素,它添加了多项式的x ^ 1项。

问题#2 。你应该用(temp3!= null)或(temp4!= null)替换while(temp3.next!= null)或(temp4.next!= null)。否则,你的代码永远不会到达多项式的最后一个节点(它在最后一个节点之前停止,因为它要检查是否有&#34;下一个&#34;最后一个节点之后)。这就是为什么你的结果没有x ^ 3和x ^ 4术语 - 你的循环在达到这些术语之前就结束了。

需要考虑的一些事项

  1. 你使用了很多临时变量。尝试给他们提供更具描述性的名称,或者更好的是,找到一种不会使用这么多的方法。
  2. 我不确定为什么要将已使用过的指数添加到&#34; exponent&#34; string,然后使用split()方法分解为数组。考虑从一开始就添加一个数组。
  3. 您的添加方法可能会重新构建为更清洁。不是看到你的两个多项式有哪些共同点,处理那些,然后处理它们没有共同点的那些,你可以尝试这样:找到任何多项式中的最高指数。然后,循环遍历从0到该数字的所有指数度数。在每个周期内,循环通过每个多项式,并将具有该指数的所有多项式的系数相加。这样,你的代码就会在一个大循环中。
  4. 现在,你的代码并没有确保多项式保持它们的条件有序 - 没有办法阻止x ^ 2项在ax ^ 3 term之前出现,这是在ax ^之前出现的1个学期。考虑向LinkedPoly类添加sort()方法,在节点添加期间添加一些代码以确保多项式保持有序,或者使用上面的建议#3,这将允许您在创建它时对求和多项式进行排序。或者,如果将它们按顺序排列并不重要,请不要打扰:)