giovedì 29 novembre 2012

Simple linked list o liste concatenate semplici (parte III): stampiamo le liste

Terzo post sull'argomento liste semplici collegate o linked lists. Spero non siate stanchi:)
Forse, se vedessimo insieme qualche funzione di servizio si potrebbe provare a superare la stanchezza?
Io ci provo.
Nei due precedenti post, qui e qui, abbiamo creato e modificato la nostra lista. Ma, come facciamo a vedere quello che c'è dentro la lista? Ovviamente con una funzione che ci stampa a schermo la lista.
Vediamo come:

Riassumendo, avevamo definito i tipi nodeT per l'elemento generico della lista e NodeP per puntare agli elementi della lista nel seguente modo:

1
2
3
4
5
typedef struct node{
 int  payload;            // dato contenuto nel generico nodo della lista
 struct node *next;   // puntatore al prossimo elemento della lista
} nodeT;                         // Tipo del generico nodo della lista
typedef nodeT* nodeP; // Tipo puntatore a lista


Avevamo anche definito due variabili puntatore: firstP, il puntatore all'inizio lista, e lastP, il puntatore all'ultimo elemento della lista così:
1
2
nodeP firstP = NULL;        // puntatore all'inizio della lista
nodeP lastP  = NULL;        // puntatore all'ultimo nodo della lista


La funzione printlist dovrà scandire gli elementi della lista dal primo all'ultimo e stampare il dato contenuto in ogni elemento.
In generale, per scandire una lista semplice collegata  si segue il seguente algoritmo:
Si assegna ad un puntatore temporaneo il puntatore a inizio lista. Poi, se la lista non è vuota, si lavora sul primo elemento. Poi si aggiorna il puntatore temporaneo al successivo elemento e se non siamo a fine lista si lavora sull'elemento puntato. Si continua così fino a quando il puntatore temporaneo non punta a NULL (fine lista!).
In C, la traduzione è la seguente:
1
2
3
4
5
nodeP tempP=firstP;
while (tempP!=NULL) {
//  fai_qualcosa_sull'elemento corrente;
  tempP=tempP->next;
}
Adesso, abbiamo tutti i pezzi del puzzle, ci rimane solo da decidere se stampare la lista orizzontalmente, come nella figura seguente:
Stampa in orizzontale di una lista di tre interi (4,0,4)
o verticalmente:
Stampa in verticale di una lista di tre interi (89876, 4, 345)
La funzione per la stampa orizzontale è la più semplice è quindi la vediamo qui di seguito :). La stampa verticale, con box che si modificano a seconda del numero di cifre da stampare, la lascio a voi come esercizio.
La funzione di stampa orizzontale è la seguente:
1
2
3
4
5
6
7
8
9
10
11
12
void printlisto(nodeP head)
{
  int   datal,i;
  nodeP current;
  current = head;
  printf("\nSTART->");
  while (current!= NULL) {
    printf("[ %d ]->",current->payload); // fai qualcosa sull'elemento :)
    current = current->next;
  };
  printf("NULL\n");
}
Buone stampe a tutti:)

Nessun commento:

Posta un commento