04.06.2008 | 22:12:22
immagine
Ing. Emanuele Scapin

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;
            }
            

© Emanuele Scapin 2009-2025

 

Valid HTML 4.01! Valid CSS!