cerca
Algoritmi e strutture dati - Specifiche: Liste
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Algoritmi e strutture dati - Specifiche: Liste

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≤in
    Post: q = posi+1
  • predlista(p, L) = q
    Pre: L = a1, a2, ... , an e p = posi per un i, 1≤in
    Post: q = posi-1
  • finelista(p, L) = b
    Pre: L = a1, a2, ... , an e p = posi per un i, 1≤in+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≤in
    Post: a = ai
  • scrivilista(a, p, L) = L'
    Pre: L = a1, a2, ... , an e p = posi per un i, 1≤in
    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≤in+1
    Post: L' = a1, a2, ... , ai-1, a, ai+1, ... , an se 1≤in
    L' = a1, a2, ... , an, a se i = n + 1
    L' = a1, a2, ... , an se i = 0
  • canclista(p, L) = L'
    Pre: L = a1, a2, ... , an e p = posi per un i, 1≤in
    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;
    }
    

Torna alla pagina di Algoritmi e strutture dati