// File: Scaletta.java
// Time-stamp: "2003-04-07 18:22:28 calvanes"
// Scopo: esame del 25/03/2003 - compito C - domanda 1

class Nodo {
  public String titolo;
  public String dedica;
  public Nodo next;
}

public class Scaletta {

  // rappresentazione degli oggetti
  private String puntata;
  private Nodo primo;   // riferimento al primo elemento della coda
  private Nodo ultimo;  // riferimento all'ultimo elemento della coda

  // metodi pubblici

  public Scaletta(String puntata) {   // realizza la funzionalita' crea
    this.puntata = puntata;
    primo = null;
  }

  // metodo non richiesto all'esame
  public String puntata() {
    return puntata;
  }

  public void aggiungiBrano(String titolo, String dedica) {
    Nodo p = new Nodo();
    p.titolo = titolo;
    p.dedica = dedica;
    p.next = null;
    if (primo == null) {
      primo = p;
      ultimo = p;
    } else {
      ultimo.next = p;
      ultimo = p;
    }
  }

  public void estraiVisita() {
    if (primo == null)
      throw new RuntimeException("Scalette vuota");
    else {
      primo = primo.next;
      if (primo == null)
        ultimo = null;  // permette al garbage collector di liberare la memoria
    }
  }

  public int numBrani() {
    int cont = 0;
    Nodo p = primo;
    while (p != null) {
      cont++;
      p = p.next;
    }
    return cont;
  }

  public String titoloBrano(int numero) {
    Nodo p = trovaBrano(numero);
    if (p == null)
      throw new RuntimeException("Numero d'ordine non valido");
    else
      return p.titolo;
  }

  public String dedicaBrano(int numero) {
    Nodo p = trovaBrano(numero);
    if (p == null)
      throw new RuntimeException("Numero d'ordine non valido");
    else
      return p.dedica;
  }

  public int numBrani(String titolo) {
    int cont = 0;
    Nodo p = primo;
    while (p != null) {
      if (p.titolo.equals(titolo))
        cont++;
      p = p.next;
    }
    return cont;
  }

  public int[] posizioniBrano(String titolo) {
    int[] ris = new int[numBrani(titolo)];
    int i = 0;
    int cont = 0;
    Nodo p = primo;
    while (p != null) {
      if (p.titolo.equals(titolo)) {
        ris[cont] = i;
        cont++;
      }
      i++;
      p = p.next;
    }
    return ris;
  }

  // metodi ausiliari

  private Nodo trovaBrano(int numero) {
    if (numero < 0)
      return null;
    else {
      Nodo p = primo;
      for (int i = 0; i < numero && p != null; i++)
        p = p.next;
      return p;
    }
  }

}
