这是我使用链接列表添加两个多项式的实现
例如,如果我想添加
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,以便我可以检查这个实现是否正常
答案 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术语 - 你的循环在达到这些术语之前就结束了。
需要考虑的一些事项