package coda;

class Nodo {
  public Object info;
  public Nodo next;
}

public class Coda {

  //rappresentazione degli oggetti

  private Nodo nodotesta;
  private Nodo nodocoda;
  
  //realizzazione delle funzioni del tipo astratto

  public Coda() { // realizza codaVuota 
    nodotesta = null;
    nodocoda = null;
  }

  public boolean estVuota() { 
    return nodotesta==null; 
  }

  public void inCoda (Object o) { 
    Nodo aux = new Nodo(); 
    aux.info = o; 
    aux.next = null;
    if (nodotesta == null) { 
      nodotesta = aux;
      nodocoda = aux;
    }
    else { 
      nodocoda.next = aux;
      nodocoda = aux;
    }
  }

  public void outCoda() { 
    if (estVuota()) 
      throw new RuntimeException(
        "Coda: outCoda applicato ad una coda vuota");
    else { 
      nodotesta = nodotesta.next;
      if (nodotesta == null)
        nodocoda = null;
    } 
  }

  public Object primo() { 
    if (estVuota()) 
      throw new RuntimeException(
        "Coda: primo applicato ad una coda vuota");
    else return nodotesta.info; 
  }

}
