iterate.c

In questo esempio si mostra come creare una lista a partire da un vettore di ElemType e come iterare gli elementi di una lista esistente utilizzando i ciclo for e while facendo o meno uso delle funzioni primitive.

#include "doublelist.h"
#include <stdlib.h>
Item *DListCreateFromVector(const ElemType *v, size_t v_size) {
for (size_t i = 0; i < v_size; ++i) {
list = DListInsertBack(list, &v[i]);
}
return list;
}
int main(void) {
ElemType v[] = { 1,2,3,4,5,6,7,8,9 };
size_t v_size = sizeof(v) / sizeof(ElemType);
Item *list = DListCreateFromVector(v, v_size);
// Iterazione con il for usando le primitive:
for (Item *tmp = list; !DListIsEmpty(tmp); tmp = DListGetTail(tmp)) {
// Prendo il valore dell'elemento corrente della lista.
const ElemType *e = DListGetHeadValue(tmp);
// Se volessi un elemento modificabile potrei fare:
// ElemType e = ElemCopy(DListGetHeadValue(tmp));
// E lo uso
// ...
}
// Iterazione con il for senza la primitive:
for (Item *tmp = list; tmp; tmp = tmp->next) {
ElemType e = tmp->value;
// Cose ...
}
// Iterazione con il while usando le primitive:
Item *tmp = list;
while (!DListIsEmpty(tmp)) {
const ElemType *e = DListGetHeadValue(tmp);
// Cose ...
tmp = DListGetTail(tmp);
}
// Iterazione con il while senza le primitive:
/*Item**/ tmp = list;
while (tmp) {
ElemType e = tmp->value;
// Cose ...
tmp = tmp->next;
}
// Esempio di uso del puntatote al precedente. Itero fino all'ultimo elemento non NULL
// e poi torno indietro fino al primo non NULL (la testa della lista). Implementazione
// che fa uso delle primitive.
/*Item**/ tmp = list;
while (!DListIsEmpty(DListGetTail(tmp))) {
const ElemType e = DListGetHeadValue(tmp);
// Cose ...
tmp = DListGetTail(tmp);
}
while (!DListIsEmpty(DListGetPrev(tmp))) {
const ElemType e = DListGetHeadValue(tmp);
// Cose ...
tmp = DListGetPrev(tmp);
}
// Esempio di uso del puntatote al precedente. Itero fino all'ultimo elemento non NULL
// e poi torno indietro fino al primo non NULL (la testa della lista). Implementazione
// senza primitive.
/*Item**/ tmp = list;
while (tmp->next) {
ElemType e = tmp->value;
// Cose ...
tmp = tmp->next;
}
while (tmp->prev) {
ElemType e = tmp->value;
// Cose ...
tmp = tmp->prev;
}
DListDelete(list);
return EXIT_SUCCESS;
}
ElemType
int ElemType
Definizione di struct ElemType.
Definition: elemtype.h:13
Item::prev
struct Item * prev
Definition: doublelist.h:23
DListInsertBack
Item * DListInsertBack(Item *i, const ElemType *e)
La funzione DListInsertBack() aggiunge un elemento in coda ad una lista (anche vuota) e ritorna la li...
Definition: doublelist.c:60
DListGetTail
Item * DListGetTail(const Item *i)
La funzione DListGetTail() ritorna la lista privata dell'elemento in testa. La funzione NON dealloca ...
Definition: doublelist.c:40
DListIsEmpty
bool DListIsEmpty(const Item *i)
La funzione DListIsEmpty() verifica se una lista รจ vuota.
Definition: doublelist.c:26
doublelist.h
Item::value
ElemType value
Definition: doublelist.h:21
DListDelete
void DListDelete(Item *i)
La funzione ListDelete() libera la memoria occupata da tutti gli elementi di una lista,...
Definition: doublelist.c:90
DListCreateEmpty
Item * DListCreateEmpty(void)
La funzione DListCreateEmpty() crea e ritorna una lista vuota, ovvero NULL.
Definition: doublelist.c:11
DListGetPrev
Item * DListGetPrev(const Item *i)
La funzione DListGetPrev() ritorna il puntatore all'elemento precedente.
Definition: doublelist.c:50
Item
Definizione del tipo struct Item.
Definition: doublelist.h:20
Item::next
struct Item * next
Definition: doublelist.h:22
DListGetHeadValue
const ElemType * DListGetHeadValue(const Item *i)
La funzione DListGetHead() ritorna un puntatore all'elemento in testa alla lista, senza rimuoverlo.
Definition: doublelist.c:30