Нулевой указатель при использовании двусвязного списка

Я пытаюсь создать двухмерный двусвязный круговой массив, считывая данные из txt-файла и автоматически создавая узлы. Моя программа правильно читает первую строку, но когда она достигает следующей строки и времени для создания следующего узла, возникает нулевой указатель. Я не понимаю, почему это происходит, пожалуйста, помогите мне.

public class project1 {
    public static void main(String[] args) {
        File file = new File("Input0.txt");
        List mList = new List();
        try {

            Scanner sc = new Scanner(file);

            while (sc.hasNextLine()) {
                String line = sc.nextLine();
                Node kNode = new Node(line.charAt(0));
                mList.insertLast(kNode);
                for (int j = 1; j < line.length(); j++) {
                    System.out.println(line.charAt(j));
                }
            }
            sc.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class Node {
    int data = 0;
    char key;
    Node nPrev, nNext, tNode, prev, next;

    Node() {
    }

    Node(char c) {
        key = c;
    }

    Node(Node x, Node p, Node q) {
        tNode = x;
        nPrev = p;
        nNext = q;
    }

    Node(int x, Node p, Node q) {
        data += x;
        prev = p;
        next = q;
    }
}

class List {
    Node head;

    List() {
        head = new Node();
        head.prev = head;
        head.next = head;
    }

    void insertFirst(char x) {
        insertBefore(head.next, x);
    }

    void insertFirst(Node x) {
        insertBefore(head.next, x);
    }

    void insertLast(char x) {
        insertAfter(head.prev, x);
    }

    void insertLast(Node x) {
        insertAfter(head.prev, x);
    }

    void insertAfter(Node pos, int i) {
        Node n = new Node(i, pos, pos.next);
        pos.next.prev = n;
        pos.next = n;
    }

    void insertAfter(Node pos, Node x) {
        Node n = new Node(x, pos, pos.next);
        pos.next.prev = n;
        pos.next = n;
    }

    void insertBefore(Node pos, int i) {
        Node n = new Node(i, pos.prev, pos);
        pos.prev.next = n;
        pos.prev = n;
    }

    void insertBefore(Node pos, Node x) {
        Node n = new Node(x, pos.prev, pos);
        pos.prev.next = n;
        pos.prev = n;
    }
}

это ошибка. Нулевой указатель возникает, когда он пытается создать второй узел. он создает первый узел правильно, а сразу после этого указывает нулевой указатель.

строка 77 = поз. след = н;

строка 69 = вставка после (head.prev, x);

строка 18 = mList.insertLast(kNode);


person TheLunat1c    schedule 20.01.2014    source источник
comment
Не могли бы вы опубликовать полный код. Вы пропустили определение функции insertBefore(node,char).   -  person Aditya    schedule 20.01.2014


Ответы (1)


Вам не хватает для установки указателей для вновь вставленного узла:

 void insertBefore(Node pos, int i) {
    Node n = new Node(i, pos.prev, pos);
    pos.prev.next = n;
    pos.prev = n;
    /** should contain also something similar to: **/
   n.prev = pos;
   n.next = pos;
}

На самом деле то, что вы делаете при вставке первого узла, вы устанавливаете для своего head.prev значение n и для вашего head.next значение n. Таким образом, при следующей вставке вы передаете n (теперь это head.next) и пытаетесь вызвать n.prev.next с n.prev == null и строкой, следующей за n.prev, которая снова имеет значение null.

person Peter    schedule 20.01.2014