Torna alla pagina di Algoritmi e strutture dati
:: Algoritmi e strutture dati - Specifiche ::
Liste
Sintassi
- crealiste: () -> lista
Crea ed inizializza una lista ad un particolare valore, di solito la sequenza vuota. - listavuota: (lista) -> booleano
Restituisce vero o falso a seconda che la lista sia vuota o no. - primolista: (lista) -> posizione
Permette di accedere al primo elemento della lista. - ultimolista: (lista) -> posizione
Permette di accedere all'ultimo elemento della lista. - succlista: (posizione, lista) -> posizione
Permette di passare all'elemento successivo della lista rispetto alla posizione indicata. - predlista: (posizione, lista) -> posizione
Permette di passare all'elemento precedente della lista rispetto alla posizione indicata. - finelista: (posizione, lista) -> booleano
Restituisce vero o falso a seconda che la posizione sia o no l'ultima della lista. - leggilista: (posizione, lista) -> tipoelem
Legge il valore dell'elemento nella posizione specificata della lista. - scrivilista: (tipoelem, posizione, lista) -> lista
Cambia il valore dell'elemento nella posizione specificata della lista. - inslista: (tipoelem, posizione, lista) -> lista
Inserisce un nuovo elemento nella lista. - canclista: (posizione, lista) -> lista
Cancella l'elemento nella posizione specificata della lista.
Semantica
- crealista() = L'
Post: L' = Λ - listavuota(L) = b
Post: b = vero, se L = Λ; b = falso altrimenti - primolista(L) = p
Post: p = pos1 - ultimolista(L) = p
Post: p = posn - succlista(p, L) = q
Pre: L = a1, a2, ... , an e p = posi per un i, 1≤i≤n
Post: q = posi+1 - predlista(p, L) = q
Pre: L = a1, a2, ... , an e p = posi per un i, 1≤i≤n
Post: q = posi-1 - finelista(p, L) = b
Pre: L = a1, a2, ... , an e p = posi per un i, 1≤i≤n+1
Post: b = vero, se p = pos0 o p = posn+1 ; b = falso altrimenti - leggilista(p, L) = a
Pre: L = a1, a2, ... , an e p = posi per un i, 1≤i≤n
Post: a = ai - scrivilista(a, p, L) = L'
Pre: L = a1, a2, ... , an e p = posi per un i, 1≤i≤n
Post: L' = a1, a2, ... , ai-1, a, ai+1, ... , an - inslista(a, p, L) = L'
Pre: L = a1, a2, ... , an e p = posi per un i, 1≤i≤n+1
Post: L' = a1, a2, ... , ai-1, a, ai+1, ... , an se 1≤i≤nL' = a1, a2, ... , an, a se i = n + 1L' = a1, a2, ... , an se i = 0 - canclista(p, L) = L'
Pre: L = a1, a2, ... , an e p = posi per un i, 1≤i≤n
Post: L' = a1, a2, ... , ai-1, ai+1, ... , an
Implementazione in C++
Si condidera una lista bidirezionale circolare con sentinella
Realizzazione con puntatori
typedef struct _cella { tipoelem elemento; struct _cella *next, *prev; } cella; typedef cella posizione, lista; typedef short boolean;
- inslista:
void inslista (tipoelem a, posizione *p) { posizione *q; q = malloc (sizeof(cella)); q->elemento = a; q->prev = p->prev; q->next = p; p->prev->next = q; p->prev = q; }
- canclista:
void canclista (posizione **p) { posizione *q; q = *p; q->prev->next = q->next; q->next->prev = q->prev; *p = q->next; free(q); }
Realizzazione con cursori
#define MAXL 100 typedef int lista, posizione; typedef struct _cella { posizione prev, next; tipoelem elemento; } cella; lista listalibera; cella spazio[MAXL];
- inizializzare:
void inizializza () { int i; listalibera = 0; spazio[0].next = 1; spazio[0].prev = MAXL - 1; for (i=1; i<MAXL; i++) { spazio[i].next = (i+1) % MAXL; spazio[i].prev = (i-1) % MAXL; } }
- sposta:
Trasferisce la cella putanta da p nella cella prima di quella puntata da q.void sposta (posizione *p, posizione *q) { posizione t; t = spazio[p].next; spazio[spazio[p].prev].next = spazio[p].next; spazio[spazio[p].next].prev = spazio[p].prev; spazio[p].prev = spazio[q].prev; spazio[spazio[q].prev].next = p; spazio[p].next = q; spazio[q].prev = p; q = p; p = t; }