// Classe lista: listc.cpp
#include "listc.h"

/* Metodo ricorsivo che ritorna un puntatore all' i-esimo
 * elemento della lista. Richiede di sapere quale elemento
 * e' questo nella lista (curr).
 * Ritorna un puntatore all'elemento o NULL se non ce ne sono
 * abbastanza */
list_base *list_base::index (int i, int curr)
{
  if (i == curr)                       // Se 'io' (curr) son quello richiesto
    return this;                       // ritorno un puntatore a me stesso
  else if (next)                       // Altrimenti, se c'e' un prossimo elemento
    return next -> index (i,curr + 1); // va a cercare al prossimo (dicendogli che e' il prossimo - curr+1)
  else
    return 0;                          // Se non c'e' neanche il prossimo, ritorna 'NULL' = non trovato
}

/* concat : Aggiunge la lista che comincia con 'add'
 * in coda alla lista di cui fa parte questo emelento */
void list_base::concat (list_base *add)
{
  if (next)                    // Se c'e' un prossimo elemento
    next -> concat (add); // Lo appendo in fondo alla sual lista chiamando l'operatore per nome
  else
    next = add;                // Altrimenti (sono l'ultimo), lo appendo qui
}

/* Elimina quest'oggetto dalla lista <base>
 */
void list_base::remove_base (list_base **base)
{
list_base *b;
  if (*base == this) // Se la lista inizia con questo emento
    *base = next;    // La fa iniziare con il prossimo
  else {             // Altrimenti
    for (b = *base;b -> next; b = b -> next) // Scandisce la lista
      if (b -> next == this)                 // Quando trova l'elemento che mi precede
      {
        b -> next = next;                    // Gli collega il prossimo
        break;                               // e termina la scansione
      }
   }
   next = 0;        // Per finire, mi indica come terminatore della mia lista
}