2 lllllt95 lllllt95 于 2014.10.31 18:01 提问

一个简单java程序,用链表实现多项式相加

public class Literal {
private int coefficient;
private int exponent;
Literal next = null;// 默认是null

public Literal() {
    this(0, 0);
}

public Literal(int coefficient, int exponent) {
    setCoe(coefficient);
    setExp(exponent);
    this.next=null;
}

public int getCoe() {
    return coefficient;
}

public int getExp() {
    return exponent;
}

public void setCoe(int coefficient) {
    this.coefficient = coefficient;
}

public void setExp(int exponent) {
    this.exponent = exponent;
}

}

public class Polynomial {
private Literal head;
private Literal current;

public Polynomial() {
    head = new Literal();
    current = head;
}

public void insertTerm(int coefficient, int exponent) {
    Literal node = new Literal(coefficient, exponent);
    current.next = node;// 在现有结点后添加新结点
    current = node;
}

public Polynomial add(Polynomial p) {
    Polynomial result = new Polynomial();
    current = head.next;
    p.current = p.head.next;// 都指向第一个元素

    // 只有都不为空才能比较指数大小
    while (current != null && p.current != null) {
        System.out.println("指数 "+current.getExp()+" "+p.current.getExp());
        // 指数相等时候
        if (current.getExp() == p.current.getExp()) {
            int a = current.getCoe() + p.current.getCoe();
            if (a != 0) {
                result.insertTerm(a, current.getExp());
                current = current.next;
                p.current = p.current.next;
            }
        }

        // 指数不等时候
        if (current.getExp() < p.current.getExp()) {
            result.insertTerm(current.getCoe(), current.getExp());
            current = current.next;
        }
        if (current.getExp() > p.current.getExp()) {
            result.insertTerm(p.current.getCoe(), p.current.getExp());
            p.current = p.current.next;
        }
        result.print();
    }

    // 处理还有剩余项的情况
    while (current != null) {
        result.insertTerm(current.getCoe(), current.getExp());
        current = current.next;
    }
    while (p.current != null) {
        result.insertTerm(p.current.getCoe(), p.current.getExp());
        p.current = p.current.next;
    }

    return result;
}

public void print() {
    String result = "";

    current = head.next;// 指向第一个
    while (current != null) {
        String coe = "";
        String str = "";// 先清空

        if (current.getCoe() != 1)// 系数
            coe += current.getCoe();

        if (current.getExp() == 1) // 指数为1
            str = coe + "x";
        else
            str = coe + "x^" + current.getExp();

        if (current == head.next)
            result += str;
        else
            result += "+" + str;

        current = current.next;
    }
    System.out.println(result);
}

public static void main(String[] args) {
    Polynomial p1 = new Polynomial();
    p1.insertTerm(1, 1);
    p1.insertTerm(2, 2);
    p1.insertTerm(3, 3);
    p1.insertTerm(4, 4);

    Polynomial p2 = new Polynomial();
    p2.insertTerm(2, 3);
    p2.insertTerm(4, 5);

            //模拟实现下面p1,p2相加的过程
    Polynomial polynomial=new Polynomial();
    p2.current=p2.head.next;
    polynomial.insertTerm(p2.current.getCoe(), p2.current.getExp());
    p2.current=p2.current.next;
    polynomial.insertTerm(p2.current.getCoe(), p2.current.getExp());
    polynomial.print();

    Polynomial p = p1.add(p2);
    System.out.print("p1+p2=");
    p.print();
}

}

然后运行结果是
2x^3+4x^5
指数 1 3
x
指数 2 3
Exception in thread "main" java.lang.NullPointerException
at Phlonomial.Polynomial.insertTerm(Polynomial.java:17)
at Phlonomial.Polynomial.add(Polynomial.java:41)
at Phlonomial.Polynomial.main(Polynomial.java:108)

就是说“current.next = node;// 在现有结点后添加新结点”这句空指针报错,可是我看不出来有什么问题啊QAQ
Polynomial result = new Polynomial();
current = head.next;
if (current.getExp() < p.current.getExp()) {
result.insertTerm(current.getCoe(), current.getExp());
current = current.next;
}
和上面的模拟过程应该是类似,求解答!小女子感激不尽~调试好久就是不知道为何报错 T T

1个回答

ChinMint
ChinMint   2016.10.25 11:05

私以为代码有点错误,在那个判断指数相等那里,你只讨论了 a!=0的情况,如果a=0,程序就进行不下去了。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
链表实现两个多项式的加法
最近遇到这样一个题目,使用链表来实现两个多项式的加法,刚开始觉得应该比较简单,也可能是自己基础不扎实吧,这其中也是踩了很多的坑啊,最终还是成功了,特此写博客记录一下。
使用链表实现两个多项式相加和相乘
设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4 3 4 -5 2
链表实现多项式相加
//均已调试通过,编译器为DEV C++ /多项式相加程序,用链表实现 //系数 coefficient  指数exponent   多项式 multinomial  #include  typedef struct Lnode {         int coe;        int exp;        struct Lnode *next;        }Lnode,*LinkLi
用单链表实现一元多项式相加 C++代码
#include using namespace std; /*结点的定义*/ typedef struct LNode { float coef; int exp; struct LNode *next; }LNode; typede
Java链表形式实现多项式相加
直接文件拷贝上来,都做了注释的。 package test2_3; import java.util.Scanner; public class Pol { /** * 节点数据 * @author Administrator * */ class Data{ /** * 指数 */ public int coef; /** * 系数
C语言:用链表实现一元多项式的加法
/* 一元多多项式的加法 1.先创建链表,存储多项式 2.输出多项式 3.两个多项式相加 4.输出多项式 */ # include # include typedef struct dxs //多项式节点 { float coe; //系数 int exp; //指数 struct dxs * pNext; //指针域 }DXS, * PDXS; PDXS c
java数据结构之单链表应用之一元多项式求和
利用java中单链表进行一元多项式求和,下面直接看案例分析: package LinkedList; import LinkedList.Elem.Node; public class LinkedAdd { public Node add(Elem e1,Elem e2){ Node pre=e1.getNode(); Node qre=e2.getNode(); Node p=
一元多项式相加的算法和C++实现
利用顺序表的链式存储实现一元多项式的加法
【数据结构】用链表实现多项式运算
一元多项式的运算包括加法减法和乘法,而多项式的加法和乘法都可以依靠多项式的加法来实现,所以本文仅仅讲解如何用链表实现一元多项式的加法。 数学上的一元多项式的表示是p(x) = p0 + p1 * x + p2 * x^2 + p3 * x^3 + … + pn * x^n; 用链表来表示就是p = (p0, p1, p2, … , pn); 所谓的多项式相加就是同类项的合并,也就是两条链表的
利用单链表实现一元多项式的表示及相加
第一个博客