Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] Implementazione LIFO tramite lista doppia

    Devo implementare una LIFO in C tramite una lista doppia. Ho creato un stack.c e un stack.h che mi gestiscono le operazioni sullo stack. C'è anche un item.c e un item.h che mi gestiscono delle operazioni sul nuovo tipo da me definito item come la stampa e l'acquisizione (in questo caso item è un int per semplicità).

    Il programma sembra funzionare fino a quando non elimino dallo stack un elemento. Se dopo l'eliminazione provo a stampare, il programma smette di funzionare. Se invece dopo l'eliminazione inserisco un nuovo dato nello stack e stampo allora tutto fila liscio.
    Sapete darmi una mano?

    In stack.h ho definito struck stack come stack_t attraverso una typedef.
    Nel main userò stack_t* in modo da creare un ADT.
    Vi posto di seguito lo stack.c

    codice:
    typedef struct nodo nodo_t;
    
    struct nodo{
        item val;
        nodo_t *next;
        nodo_t *prev;
    };
    
    struct stack {
        nodo_t *head;
        nodo_t *tail;
        int num;
    };
    codice:
    stack_t* stack_alloc()
    {
        stack_t* st;
        st = malloc(sizeof(*st));
    
        if (st == NULL){
            return 0;
        }
    
        st->head = NULL;
        st->tail = NULL;
        st->num = 0;
    
        return st;
    }
    codice:
    int stack_put(stack_t* st, item d)
    {
        nodo_t* nodo;
    
        if (st == NULL){
            return 1;
        }
    
        nodo = malloc(sizeof(*nodo));
        nodo->val = d;
        nodo->next = NULL;
    
        if (st->head == NULL){
            st->head = nodo;
            nodo->prev = NULL;
        }
        else{
            nodo->prev = st->tail;
            st->tail->next = nodo;
        }
    
        st->tail = nodo;
        (st->num)++;
    
        return 0;
    }
    codice:
    int stack_get(stack_t* st, item* delete_d)
    {
        nodo_t* nodo;
    
        nodo = st->tail;
        if (nodo == NULL)
            return 1;
    
        *delete_d = nodo->val;
        st->tail = /*st->tail->prev*/ nodo->prev;
    
        if (st->tail == NULL)
            st->head = NULL;
    
        free(nodo);
        (st->num)--;
    
        return 0;
    }
    codice:
    void stack_print(stack_t* st)
    {
        nodo_t* nodo;
    
        if ((st == NULL) || (st->num == 0))
            printf ("Nessun dato da stampare\n\n");
    
        else{
            printf ("ELENCO DEI DATI IN CODA:\n");
    
            nodo = st->head;
            while (nodo != NULL) {
                stampa_item (nodo->val);
                nodo = nodo->next;
            }
        }
    
        return;
    }
    codice:
    void stack_free(stack_t* st)
    {
        nodo_t* nodo;
        nodo_t* head;
    
        if (st == NULL)
            return;
    
        head = st->head;
        while (head != NULL) {
            nodo = head;
            head = head->next;
            free(nodo);
        }
    
        free(st);
    
        return;
    }

  2. #2
    Utente di HTML.it L'avatar di ybla82
    Registrato dal
    Jan 2009
    Messaggi
    92
    nella funzione stack_get,
    devi aggiungere questo:

    st->tail->next = NULL;

    In questo modo togli il legame tra il nuovo tail e il nodo che hai rimosso.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.