C, es3, gestione dinamica della memoria, il caso della coda e dello stack (pila).
-
-
Definizione della struct per la coda.
typedef struct libro {
char titolo[20];
char autore[40];
...
struct libro* succ; // puntatore all'elemento successivo
} t_libro;
-
Funzione di inserimento in ultima posizione nella coda.
t_libro* add(t_libro* c, char* titolo, ...) {
// allocazione nuovo elemento
t_libro* n = (t_libro*) malloc(sizeof(t_libro));
strcpy(n->titolo, titolo);
...
n->succ = NULL;
// ricerca ultimo elemento della coda
t_libro* u = last(c);
// inserimento nuovo elemento come ultimo della coda
if (u != NULL) u->succ = n;
else c = n;
return c;
}
-
Funzione che rimuove un elemento dalla testa della coda (rimozione primo elemento della coda).
t_libro* remove(t_libro* c) {
t_libro* p = c;
if (c != NULL) {
c = c->succ;
free(p);
}
return c;
}
-
Definizione della struct per lo stack (pila).
Il puntatore al precedente anziché al successivo agevolerà la gestione dello stack pointer in fase di estrazione (pop).
typedef struct libro {
char titolo[20];
char autore[40];
...
struct libro* prec; // puntatore all'elemento precedente
} t_libro;
// definizione di due variabili globali
t_libro* sp = NULL; // stack pointer
t_libro* bp = NULL; // base pointer
-
Procedura per l'inserimento in testa (PUSH).
void push(char* titolo, ...) {
t_libro* n = (t_libro*) malloc(sizeof(t_libro));
strcpy(n->titolo, titolo);
...
n->prec = NULL;
if ((bp == NULL) && (sp == NULL)) {
// lo stack è vuoto
bp = n;
sp = n;
}
else {
// lo stack non è vuoto
n->prec = sp;
sp = n;
}
}
-
Funzione per estrazione dalla testa (POP).
t_libro* pop() {
t_libro* ret = NULL;
if ((bp != NULL) && (sp != NULL)) {
if (bp == sp) {
ret = sp;
// stack rimane vuoto
sp = NULL;
bp = NULL;
}
else {
ret = sp;
// lo stack non rimane vuoto
sp = sp->prec
}
}
return ret;
}