next up previous contents index
Next: Eliminazione in testa e Up: Liste semplici in C++ Previous: Inserzione in testa e   Indice   Indice analitico

Stampa di una lista

Prima di vedere come stampare una lista, forniamo due semplici funzioni che ci permettono di creare delle liste, che saranno comode per i futuri esempi di questo capitolo. La prima di esse semplicemente immette nella lista numeri interi forniti dall'utente, fino a quando non incontra un numero negativo; si utilizza, ovviamente, la funzione di inserzione in coda:

void immettiLista (elem*& lista) {
  int n;
  for ( ; ; ) {  // infinite loop
    cout << "? "; cin >> n;
    if (n < 0 )
      break;
    insCoda (lista, n);
  }
}
L'altra comoda funzione genera invece dei numeri causali7.6 e li inserisce nella lista; in questo caso useremo la funzione di inserzione in testa (tanto i numeri sono casuali...); come argomenti vengono passati, rispettivamente, il massimo numero generato e il numero di elementi che costituiranno la lista:

void generaLista (elem*& lista, int max, int n) {
  srand ( time(0) );
  for (int i = 0; i < n; i++)
    insTesta (lista, rand() % max + 1);
}
Le operazioni compiute all'interno di questa funzione sono molto semplice: si inizializza il generatore dei numeri pseudocasuali, si immette per n volte un numero compreso tra 1 e max in testa alla lista.

Una funzione che ci permette di stampare una lista semplice è la seguente:


void stampa (const elem* lista) {
  // puntatore ausiliario di scorrimento
  const elem* p = lista;
  while ( p != 0) {
    cout << p->info << "\n";
    p = p->next;
  }
}
Si noti innanzitutto che la lista viene passata per puntatore costante, piuttosto che per riferimento a puntatore come nei casi precedenti: il motivo, ovvio, è che la funzione stampa non modifica la lista. Per stampare una lista, basta scorrerla dalla testa alla coda (da sinistra a destra), mano a mano facendo in modo che il puntatore ausiliario p punti all'elemento che lo succede: p = p->next. Vediamo un esempio

// ex7_7_3
// si copino in questo punto le definizioni
// della struttura `elem' e delle funzioni utilizzate
// ATTENZIONE: questa e` l'ultima volta che viene 
// inserito un commento: d'ora in poi si supporra`
// tale avvertimento noto!

void main() {
  elem* lista;
  inizializza (lista);
  immettiLista (lista);
  stampa (lista);
}

esempio di output:
? 4
? 5
? 6
? -1
4
5
6

Come si vede le funzioni fino ad ora create funzionano. C'è un particolare: visto che le nostre liste utilizzano solo numeri interi, perché ``sprecare'' in fase di stampa una intera linea, mentre possiamo effettuare una stampa ``a tabella''; consideriamo la seguente variante di stampa, nella quale passiamo il numero di interi da stampare sulla stessa riga:


void stampa (const elem* lista, int n) {
  int i = 0;  // contatore
  const elem* p = lista;
  while ( p != 0) {
    i++; // incrementa il contatore
    if (i % n == 0)
      cout << p->info << "\n";
    else
      cout << p->info << "\t";
    p = p->next;
  }
}

Vediamo un esempio:


// ex7_7_4
void main() {
  elem* lista;
  inizializza (lista);
  generaLista (lista, 20, 15);
  stampa (lista, 5);
}

esempio di output:
 1 3 20 2 13
 2 11 2 12 4
 17 8 3 6 16

ex-2
si scriva un programma che crei una lista contenente i seguenti dati: 7, 4, -6, 19, 3; si stampi inoltre la lista;
ex-3
si scriva un programma che inserisca in una lista 50 numeri da 1 a 90 e li stampi in 5 colonne;
ex-4
si scriva una funzione che stampi solo gli elementi di indice pari della lista; ad esempio se essa è costituita da 3, 4, 6, -1, 0, 7 la funzione deve stampare 4, -1, 7;


next up previous contents index
Next: Eliminazione in testa e Up: Liste semplici in C++ Previous: Inserzione in testa e   Indice   Indice analitico
Claudio Cicconetti
2000-09-06