Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    135

    [c] cancellazione ricorsiva di una lista

    come faccio a cancellare definitivamente, in modo ricorsivo, il contenuto di una lista?
    io ho provato cosi:

    codice:
    void 
    list_free(list_t *p){ 	
    list_t *temp;  	
    while(p){ 		
    temp=p->next; 		
    free(p); 		
    p=temp; 	
    } 
    }
    pero se poi provo a stampare mi stampa ugualmente alcuni elementi della lista non cancellandola definitivamente... come posso risolvere?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Forse questa discussione molto simile ti può servire.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    135
    non riesco ugualmente...

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    135
    che faccio?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Bastava riadattare la funzione proposta in quel thread verso la fine.

    Qui c'è un esempio di utilizzo "brutale", la printf() aggiunta nella funzione di deallocazione serve solo a mostrarne il funzionamento ma ovviamente può essere eliminata.

    codice:
    #include <stdio.h>
    
    typedef struct _node {
        int data;
        struct _node *next;
    } node;
    
    typedef node * node_ptr;
    
    node_ptr erase(node_ptr head)
    {
        node_ptr temp;
    
        /* caso base: fine lista */
        if (head == NULL) {
            return NULL;
        }
    
        /* caso generico */
        if (head -> next != NULL) {
            head -> next = erase(head -> next);
        }
    
        temp = head -> next;
        printf("Deallocazione del nodo con dato: %d\n", head -> data);
        free(head);
        return temp;
    }
    
    void print_list(node_ptr head)
    {
        while (head != NULL) {
            printf("%d ---> ", head -> data);
            head = head -> next;
        }
    
        printf("NULL\n");
    }
    
    int main(void)
    {
        node_ptr one, two, three, four, five;
    
        one = (node_ptr) malloc(sizeof(node));
        two = (node_ptr) malloc(sizeof(node));
        three = (node_ptr) malloc(sizeof(node));
        four = (node_ptr) malloc(sizeof(node));
        five = (node_ptr) malloc(sizeof(node));
    
        one -> data = 1;
        one -> next = two;
    
        two -> data = 2;
        two -> next = three;
    
        three -> data = 3;
        three -> next = four;
    
        four -> data = 4;
        four -> next = five;
    
        five -> data = 5;
        five -> next = NULL;
    
        printf("Prima stampa:\n");
        print_list(one);
    
        /* cancellazione: la funzione restituisce il puntatore alla nuova testa della lista */
        one = erase(one);
    
        printf("Seconda stampa:\n");
        print_list(one);
    
        return 0;
    }
    every day above ground is a good one

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    135
    grazie mille YuYevon! avrei un altra domanda da porvi, e vorrei evitare di aprire un altro post. come faccio a fare la deallocazione di una lista con i puntatori a funzione?
    scusate se faccio tutte queste domande ma a breve avro un esame...

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Matrix90
    come faccio a fare la deallocazione di una lista con i puntatori a funzione?
    Che intendi? Una lista i cui nodi hanno, tra le altre cose, puntatori a funzione o proprio la deallocazione della lista ricorrendo ad una funzione invocata tramite puntatore? Spiega meglio, e comunque se il problema è diverso non esitare ad aprire nuovi thread: gli OT sono contro il regolamento, i nuovi topic no (ammesso che siano aperti rispettando le regole).
    every day above ground is a good one

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    135
    intendo dire la deallocazione tramite puntatori a funzione...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non ci vedo nulla di difficile se sai come dichiarare un puntatore a funzione... basta modificare il main() del programma precedente (a proposito, va incluso anche stdlib.h):

    codice:
    int main(void)
    {
        node_ptr one, two, three, four, five;
        /*
           dichiarazione di un puntatore a funzione che accetta un argomento
           di tipo "node_ptr" e restituisce un valore dello stesso tipo
        */
        node_ptr (*function_ptr)(node_ptr);
    
        /* assegnamo a questo puntatore l'indirizzo della funzione erase() */
        function_ptr = erase;
    
        ...
    
        /* richiamiamo la funzione erase() tramite il puntatore appena definito */
        one = function_ptr(one);
    
        ...
    every day above ground is a good one

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    135
    e nel mio caso ke creo tutto in maniera ricorsiva, faccio un ciclo?

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 © 2026 vBulletin Solutions, Inc. All rights reserved.