Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2014
    residenza
    Sardegna
    Messaggi
    18

    [C] Usare free() con una lista

    Salve a tutti!

    Sto cercando di capire come usare free() sui nodi di una lista. Il problema però non è su un programma specifico ma è più che altro teorico: come faccio a liberare lo spazio usato una volta che non mi serve più, quando non posso scorrere la lista senza creare errori di segmentation fault?
    Per intenderci, avendo per esempio una lista di 10 nodi e una funzione che assegna un dato casuale, del tipo

    codice:
    //Dichiarazione di cosa contiene il tipo "Node"
    typedef struct Node{
        int data;
        struct Node *next;
        struct Node *prev;
    } Node;
    
    //Funzione che crea il nodo in testa e carica un numero random nel campo "data"
    Node* addN(Node *prevNode){    
    
        Node *newNode = NULL;
    
        newNode = malloc(sizeof(Node));
        if(newNode == NULL){
            printf("Error in memory allocation");
            exit(EXIT_FAILURE);
        }
    
    
        newNode->num = 1 + rand() % 10;;
    
    
        prevNode->next = newNode;
        newNode->next = NULL;
        newNode->prev = prevNode;
    
    
        return newNode;
    }
    come faccio a non causare memory-leak quando ritorno 0 nel main()? Usando free() non potrei più accedere agli altri nodi della lista. Come posso fare?
    Ultima modifica di alemutasa; 16-12-2015 a 17:37

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Nel tuo esempio di codice, a me pare un inserimento in coda, di solito si restituisce il primo nodo della lista, ma se proprio vuoi restituire l'ultimo nodo creato, potresti mettere un if() che valuta !=NULL, restituisce il nodo creato, se ==NULL, restituisce la lista inviata come parametro.
    Per eliminare un nodo della lista con free(), senza perdere il puntatore alla lista, dovrai crearti una funzione apposita, con puntatori temporanei che memorizzano "la lista", se elimini il primo nodo, la funzione restituirà il puntatore al secondo nodo, se elimini un nodo intermedio, la funzione, prima memorizza il puntatore al nodo da eliminare in variabile temporanea, poi collega il puntatore *next che precede il nodo da eliminare, al puntatore del nodo successivo, e infine richiami free() sul puntatore temporaneo che memorizza il nodo da eliminare.

    Trovi esempi li liste online, dove sicuramente c'è un esempio di funzione "EliminaNodo()"
    Tecnologia

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2014
    residenza
    Sardegna
    Messaggi
    18
    Grazie mille per la risposta. Credo che userò l'approccio della variabile di appoggio, mi sento più a mio agio a partire dalla fine della lista. Grazie mille ancora, buona serata

Tag per questa discussione

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.