Definizione
La Lista Lineare é una struttura estremamente flessibile, il numero dei nodi componenti può essere modificato dinamicamente.
La Lista si può identificare con un elenco, di cui è possibile variare sia la lunghezza che l’ordine.
Nella lista lineare l’ordinamento logico dei nodi non necessariamente corrisponde a quello fisico.
Ogni nodo della struttura è una coppia:
( informazione, puntatore )
Fisicamente una lista è una successione di nodi che occupano in memoria posizioni generiche.
L’accesso ad un nodo può avvenire solo per scansione dell’intera lista, poiché non può essere noto a priori il suo indirizzo.
Si osservi ad esempio che in un array, invece, ogni componente è accessibile direttamente perché identificato univocamente all’indice.
L’accesso al primo nodo della lista avviene attraverso un puntatore p0. L’ultimo nodo ha un simbolo speciale, nel campo indirizzo, di solito lo zero, per indicare la fine della lista.
Una lista può essere definita attraverso una struttura di tipo nodo come segue;
typedef struct nodo *nod_punt;
struct nodo{
real data;
nod_punt next;
}
Per creare un nodo bisogna allocare memoria attaverso l’utilizzo di funzioni create allo scopo.
nod_punt crea_nodo(real valore){
nod_punt new_punt;
new_punt=(nod_punt)malloc(sizeof(struct nodo));
If (new_punt != NULL){
new_punt->data = valore;
new_punt->next = NULL;
}
return new_punt; }
In figura viene mostrata una procedura per la rimozione di un nodo da una lista. Per eliminare un nodo un nodo bisogna allocare memoria attraverso l’utilizzo di funzioni create allo scopo.
nod_punt elimina_nodo(nod_punt pnt);
{
If (pnt != NULL)
{ pnt = pnt->next;
}
return pnt; }
Si osservi che:
In figura viene mostrata l’ eliminazione del nodo contenente “B” LIST2 in una lista di alfanumerici. Viene modificato solo il valore del puntatore del primo nodo. Si osservi che Il nodo contenente “B” non viene eliminato fisicamente.
In figura viene mostrata l’inserimento di un nodo al secondo posto di LIST: lista lineare di reali. Sono modificati i valori dei puntatori del primo nodoche adesso punterà al nodo inserito e di quest’ultimo che conterrà il vecchio indirizzo del primo nodo.
La pila: funzioni principali
int size(TipoStack *s)
, ritorna la lunghezza della pila.destroy(TipoStack *s)
, distrugge la la memoria allocata per la pilavoid deleteElement(TipoStack *s, tipoElemento data)
, elimina un elemento della pila medinante la definizione delle operazioni ammesse per una pila: inserimento e prelievo dei dati solo dalla cima (top) della strutturaEsempio
Nel seguito si implementa un programma in Linguaggio C per la gestione delle pile utilizzando elementi di una LISTA dinamica.
La definizione di un elemento della PILA avviene mediante una dichiarazione del tipo:
struct ele{
int data;
struct ele *next; };
Mentre lo Stack si definisce come:
typedef struct{
int count;
elem *top;
}stack;
Esempio
Esempio
Il programma principale è strutturato in diversi moduli che di seguito verranno analizzati.
void show(stack vstack)
, mostra gli elementi nello stack.void push(stack * vstack)
, inserisce gli elementi nello stackvoid pop(stack * vstack)
, elimina un elemento dallo Stack.Esempio
Il programma principale è strutturato in diversi moduli che di seguito verranno analizzati.
void delete(stack * vstack)
, cancella elementi dallo stack liberando memoria.void top(stack vstack)
, restituisce la cima dello Stack.void isempty(stack vstack)
, verifica se lo Stack è vuoto.1. Prolusione
2. Sistemi Operativi – parte prima
3. Sistemi Operativi – parte seconda
6. Il linguaggio C – parte prima
8. Il linguaggio C – funzioni e puntatori
10. Il linguaggio C – parte terza
11. La documentazione del software
12. Dati strutturati
13. Esercizi sui dati strutturati
14. Approfondimenti di C, Stringhe e file
15. Esercizi su stringhe e file
16. La ricorsione
17. Il linguaggio c++ parte prima
18. Il linguaggio C++ - parte seconda
19. Strutture dati di tipo astratto
Donald Knuth. The Art of Computer Programming, Volume 1: Fundamental Algorithms, Third Edition.
Addison-Wesley, 1997. ISBN 0-201-89683-4. Section 2.2.1: Stacks, Queues, and Deques, pp. 238--243.
salvatore-cuomo-4608-20-esercizi.zip