public class Ex_Confronta2Liste {
  public static void main(String[] args) {
    
    //creo 4 liste
    Lista[] liste = new Lista[4];
    for (int k=0; k<liste.length; k++)
      liste[k] = new Lista();
    
    /*
      riempimento delle liste nel seguente modo:
      liste[0] -> lista con 10 nodi di valori casuali
      liste[1] -> lista con 10 nodi con valori diversi da liste[0]
      liste[2] -> lista con 10 nodi con valori uguali a liste[0]
      liste[3] -> lista con 9 nodi con valori uguali a liste[0]
    */
    int cas;
    for (int k=0; k<10; k++) {
      cas = (int)(Math.random()*50 + 1);
      liste[0].InsertOrdered(cas);
      liste[1].InsertOrdered((int)(Math.random()*50 + 1));
      liste[2].InsertOrdered(cas);
      if (k<9) liste[3].InsertOrdered(cas);
        
    }
    //Stampa i contenuti delle liste
    for (int k=0; k<liste.length; k++)
      Stampa(liste[k]);
    
    /* Confronta le liste in tutte le combinazioni
      N.d.P: la possibilità di usare il codice sottostante
      (cicli annidati per ottenere le combinazioni dei confronti)
      mi ha indotto ad adottare un array di oggetti Lista.
      Risulterà che solo liste[0] e liste[2] sono uguali.
    */
    System.out.println("\nLe liste a confronto...");
    for (int i=0; i<liste.length-1; i++)
      for (int j=i+1; j<liste.length; j++)
        System.out.println("lista " + i + " e' uguale a lista " + j + "? " +
            IsEqual(liste[i], liste[j]));
    
  }
  
  //metodo per la stampa della lista
  public static void Stampa(Lista l) {
    System.out.println("\nLista dei valori contenuti nella lista " + l);
    int count=0;
    l.rewind();
    try {
      for (;;) System.out.println(++count + ") " + l.getNextElem());
    } catch (BottomOfListException e) {
      System.out.println("Fine Lista!!");
    }
  }
  
  /* ******************************************
     ***** Metodo oggetto dell'esercizio ******
     ******************************************
  */
  public static boolean IsEqual(Lista a, Lista b) {
   //restituisce true se le liste a e b contengono gli stessi valori
    //le due liste "riavvolte"
    a.rewind();
    b.rewind();
    
    int i=0, j;
    do {
      try {
        //prendo valore di "a" e lo controllo
        i = a.getNextElem();
      } catch(BottomOfListException e) {
        try {
          //eccezione? (lista "a" finita), allora controllo lista "b"
          j = b.getNextElem();
        } catch(BottomOfListException e1) {
          //eccezione? (anche lista "b" finita): allora le liste sono UGUALI!!
          return true;
        }
      }
      
      //Qui sicuramente un elemento della lista "a" è stato preso!!
      try {
        //prendo valore di "b" e lo controllo
        j = b.getNextElem();
      } catch(BottomOfListException e) {
        //eccezione? (lista "b" finita) allora le liste non sono uguali
        return false;
      }
    } while (i == j);   //"cicla" finchè trovi elementi uguali
    //uscito dal ciclo? allora le liste non sono uguali
    return false;
  }
}