Newsgroup: it.comp.java
Titolo: HELP linked list

Ho un problema con questa dannata Linked List : mi da errore sul
nx.setPrev(mid)
nel metodo main ho creato la Linked list ed ho fatto solo questa operazione
:  linkedlist.insert(0,"zero");
Mi da il nullpointerException... eccco la classe col metodo insert...
public class LinkedList implements List{
 private Node head;
 private Node tail;
 private int i;
 public LinkedList(){
  head = new Node(null,null,tail);
  tail = new Node(null,head,null);
  i = 0;
 }
 public int size(){
  return i;
 }
 public boolean isEmpty(){
  if (i==0) return true;
  else return false;
 }
 public void insert(int loc, Object x){
  if (loc>=0 && loc<=i && loc<=i/2){
   Node pr = head;
   for (int n = 0; n < loc; n++){
    pr = pr.getNext();
   }
   Node nx = pr.getNext();                      // se size() = 0 && loc = 0
nx = tail
   Node mid = new Node(x,pr,nx);
   pr.setNext(mid);
   nx.setPrev(mid);                                  //errore qui
   i++;
  }
  else if (loc>=0 && loc<=i && loc>i/2){
   Node nx = tail;
   for (int n = i; n >= i-loc; n--){
    nx = nx.getPrev();
   }
   Node pr = nx.getPrev();
   Node mid = new Node(x,pr,nx);
   pr.setNext(mid);
   nx.setPrev(mid);
   i++;
  }
  else { throw new OutOfBoundException();}
 }
.........

aggiungo la classe Node cosi è tutto + chiaro :
public class Node{
 private Node next;
 private Node prev;
 private Object o;
 public Node(Object x, Node p, Node n){
  prev=p;
  next=n;
  o=x;
 }
 public Node(){
  this(null,null,null);
 }
 public Object getObj(){
  return o;
 }
 public void setObj(Object x){
  o=x;
 }
 public Node getNext(){
  return next;
 }
 public void setNext(Node n){
  next = n;
 }
 public Node getPrev(){
  return prev;
 }
 public void setPrev(Node p){
  prev = p;
 }
}

InuY4sha wrote:
Senti, non c'ho capito molto, però ti propongo queste modifiche:
public class LinkedList implements List{
 private Node head;
 private Node tail;
 private int i;
/*volutamente manca il costruttore, tutti i riferimenti vengono
inizializzati a null e l'int a 0 */
 public int size(){
  return i;
 }
 public boolean isEmpty(){
 /* if (i==0) return true;
  else return false;   
  questo sopra è sinonimo di principiante ;)
  un programmatore scriverebbe:  */
   return i==0;
 }
 public void insert(int loc, Object x){
  //controlliamo l'input
  if(loc < 0)
    throw new IllegalArgumentException("loc negativo!");
  int j=0
  Node temp = head;
  while(temp!=null && j<loc) {
    temp = temp.getNext();
    j++;
  }
  /* possono essere successe due cose:  
     1) temp == null la lista era piu' corta di loc
     2) j == loc siamo arrivati alla posizione che ci serve */
 
  if(temp == null) {
    //bisogna aggiugnere dei nodi
    for(; j<=loc; j++) {
      temp = new Node(null,temp,null);
      i++;
      if(temp.getPrev() != null)
        temp.getPrev().setNext(temp);
      else
        //abbiamo appena creato la testa
        head = temp;
    }
    //temp e' quello in posizione loc
    temp.setObj(x);
    //temp e' la nuova coda
    tail = temp;
  }
  else {
   //temp si trova in posizione loc
   Node pre = temp.getPrev();
   Node post = temp;
   Node nuovo = new Node(x,pre,post);
   //sistemiamo gli altri collegamenti
   pre.setNext(nuovo);
   post.setPrev(nuovo);
   i++;
  } 
}
Spero di non aver scritto grosse vaccate, non l'ho provato.
Un ultima cosa, non mi sembra molto felice la scelta di i come nome di una
variabile di istanza ;)
Ciao
Matteo
--  
chi sono e soprattutto chi non sono:
http://www.ilnomedeldominio.it
un piccolo programma per studenti universitari:
http://inutility.ilnomedeldominio.it

       temp = new Node(null,precedente,null); //cambia questa
Tutto il resto puo' rimandere com'é, ma se vuoi puoi usare precedente al
posto di certi temp.getPrev() e puoi togliere il pre più sotto visto che è
uguale a precedente.
Cmq queste ultime modifiche non sono indispensabili ;)


 }
Ok il piatto forte è ESATTAMENTE SPIACCICATO AL MIO però proprio come il mio
NON FUNZIONA ... l'errore segnalato si trova in
 post.setPrev(nuovo) Prova a controllare il mio codice è pressochè
identico...


 mio NON FUNZIONA ... 
Non so se funziona o no (visto che non l'ho provato) ma di sicuro
post.setPrev(nuovo) non puo' lanciare una NullPointerException visto che
post = temp
e si entra in questo ramo solo se temp!= null
quindi:
post != null
Il che significa che non deve essere proprio uguale uguale a quello che hai
scritto tu. Prova a modificare il mio codice per ottenere quel
comportamento che dici tu (per ora lascia perdere il raggiungere il nodo
dalla coda), cioè in pratica aggiungi un test su loc all'inizio tipo
if(loc>size)
  eccezione
Tenendo presente che loc==size significa che stai per aggiungere un nodo in
coda.


 ha scritto nel messaggio
news:isE8c.9976$jY1....@tornado.fastwebnet.it...


  head = new Node(null,null,tail);
qui, tail ancora non è stato inizializzato quindi imposti null come
successore di head
quindi quando inserisci il primo elemento getNext() su head restituisce null
da cui l'eccezione.
Ti volevo anche dire di cambiare questa riga:
if(loc >=0 && loc <=size && loc<=size/2)
con
if(loc>=0 && loc<=size/2)
visto che (loc<=size/2) ==> (loc<=size)


 if(loc>=0 && loc<=size/2)
Eheh eh si... l'idea dell'eventualità di partire dalla tail mi è venuta a
posteriori quindi ho aggiunto e non mi sono accorto di essere ridondante :)


 da cui l'eccezione.
Non per rompere le uova nel paniere ma
ho provato e non funziona neanche cosi :
public class LinkedList implements List{
   private Node head= new Node(null, null, null);
   private Node tail= new Node(null, null, null);
   private int size;
   public LinkedList(){
       head.setNext(tail);
       tail.setPrev(head);
       size = 0;
   ....
   }
}

Ops mi scuso mi sono accorto ora che l'errore che segnala ora è su una riga
totalmente diversa.. suppongo che il metodo insert sia apposto ora
grazie....

  }
Si può riscrivere semplicemente come:
   public boolean isEmpty(){return i==0;}