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 |