Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    5

    problemi con allocazioni di memoria c

    Ciao ragazzi,mi sto trovando in difficoltà con le allocazioni di memoria.
    Non sono molto pratica di c,sto iniziando a studiarlo da poco, e ho notato che bisogna allocare la memoria quando si inizializzano le liste e deallocarla quando si eliminano gli elementi della lista.
    Di solito in java,per svuotare una lista per esempio assegnavo a
    testa= NULL e automaticamente mi svuotava la lista. Con c tutto questo è possibile???

    Ho implementato dei codici per deallocare lo spazio relativo ad un nodo della lista,ma poi il puntatore non mi punta più alla lista ancora piena ma a null e non capisco perchè...


    //mi estrae la testa,e mi restituisce l'attuale testa della lista
    struct nodo_lista_adiacenti *estrai_testa(struct nodo_lista_adiacenti *testa)
    {
    struct nodo_lista_adiacenti *corrente;
    corrente= testa;

    if(corrente != NULL)
    {
    testa= testa->next;
    free(corrente);

    }
    return testa;
    }

    oppure

    struct nodo_lista_adiacenti *elimina_elemento_lista(int n,struct nodo_lista_adiacenti *testa)
    {
    struct nodo_lista_adiacenti *corrente, *precedente;

    for ( corrente = testa , precedente = NULL ;
    corrente != NULL && corrente -> info != n;
    precedente = corrente , corrente = corrente -> next );

    //caso in cui non si trova n e arriviamo alla fine
    if ( corrente == NULL ) return testa ;
    if ( precedente == NULL ) testa = testa -> next ;//n si trova nel primo nodo
    else precedente -> next = corrente -> next ;
    free ( corrente );

    return testa ;

    }

    I codici mi sembrano giusti,senza la deallocazione funziona tutto bene,appena aggiungo la deallocazione ho problemi...

    In particolare dovrei usare una di queste funzioni per esempio nella visita bfs di un grafo:


    struct nodo_lista_adiacenti *bfs(struct vertice *grafo, int i, int dim)
    {
    int confronto;
    //inizializzo la coda vuota
    struct nodo_lista_adiacenti *lista=NULL, *testa, *adiacenti=NULL, *da_restituire=NULL;
    //coloro tutti i vertici di bianco
    vertici_bianchi(grafo, dim);
    // i è l'indice del vertice da cui parte l'esplorazione
    strcpy(grafo[i].colore, "grigio");
    grafo[i].distanza_precedente= 0;
    grafo[i].predecessore= 0;
    //inserisco in coda alla lista i che è un indice
    lista= inserisci_valore_in_coda(i, lista);
    while(lista != NULL)
    {
    testa= visualizza_testa(lista);
    lista=estrai_testa(lista);
    adiacenti= cerca_adiacenti(testa->info, grafo);

    while(adiacenti != NULL)
    {
    if( (confronto= (strcmp(grafo[adiacenti->info].colore, "bianco"))) == 0)
    {
    strcpy(grafo[adiacenti->info].colore, "grigio");
    grafo[adiacenti->info].distanza_precedente= grafo[testa->info].distanza_precedente +1;
    grafo[adiacenti->info].predecessore= testa->info; //attenzione si tratta dell'indice
    lista= inserisci_valore_in_coda(adiacenti->info, lista);
    //in questa lista tengo in memoria gl'indici dei nodi raggiungibili dall'indice i
    da_restituire= inserisci_valore_in_coda(adiacenti->info, da_restituire);
    }
    adiacenti= adiacenti->next;
    }
    strcpy(grafo[testa->info].colore, "nero");

    }
    return da_restituire;
    }

    mi serve il puntatore alla lista per poter usare la lista successivamente...
    Perchè non funziona???
    Grazie....

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: problemi con allocazioni di memoria c

    Originariamente inviato da diantha
    ... Di solito in java ...
    Non fare nessun paragone con altri linguaggi se stai imparando il C. Soprattutto, dimentica Java-

    Ho implementato dei codici per deallocare lo spazio relativo ad un nodo della lista,ma poi il puntatore non mi punta più alla lista ancora piena ma a null e non capisco perchè...
    Di quale linea/funzione parli?

    P.S. Usa i tag CODE sul forum altrimenti il codice non si capisce ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    5
    Questa è la funzione che mi da problemi:

    codice:
    //mi estrae la testa,e mi restituisce l'attuale testa della lista
     struct nodo_lista_adiacenti *estrai_testa(struct nodo_lista_adiacenti *testa)
     {
           struct nodo_lista_adiacenti *corrente; 
    
            corrente= testa;
           if(corrente != NULL)
           { 
                  testa= testa->next;
                   free(corrente);
            } return testa; 
    }
    //chiamata da quest'altra funzione:

    codice:
    struct nodo_lista_adiacenti *bfs(struct vertice *grafo, int i, int dim)
     { 
            int confronto; //inizializzo la coda vuota
            struct nodo_lista_adiacenti *lista=NULL,
            *testa, *adiacenti=NULL,   *da_restituire=NULL;
    
            //coloro tutti i vertici di bianco 
            vertici_bianchi(grafo, dim);
            // i è l'indice del vertice da cui parte l'esplorazione
            strcpy(grafo[i].colore, "grigio"); 
            grafo[i].distanza_precedente= 0;
            grafo[i].predecessore= 0; 
           //inserisco in coda alla lista i che è un indice
            lista= inserisci_valore_in_coda(i, lista);
            
             while(lista != NULL) 
             { 
                     testa= visualizza_testa(lista);
                      lista=estrai_testa(lista); 
                      adiacenti= cerca_adiacenti(testa->info, grafo);
                     
                       while(adiacenti != NULL) 
                       { 
                              if( (confronto= (strcmp(grafo[adiacenti->info].colore, "bianco"))) == 0)      
                               { 
                                     strcpy(grafo[adiacenti->info].colore, "grigio");
                                     grafo[adiacenti->info].distanza_precedente= grafo[testa-  
    >info].distanza_precedente +1; grafo[adiacenti->info].predecessore= testa->info;
                                    lista= inserisci_valore_in_coda(adiacenti->info, lista); 
                                    da_restituire= inserisci_valore_in_coda(adiacenti->info, da_restituire);
                                } 
                                adiacenti= adiacenti->next; 
                        }
                        strcpy(grafo[testa->info].colore, "nero"); 
               } 
               return da_restituire;
     }

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    5
    Penso di aver risolto,dovevo modificare la funzione bsf,perchè il valore testa->info,quando estraggo la testa non sarà più quello di prima,quindi ho inizializzato un'altra variabile intera
    qui:




    codice:
    while(lista != NULL)
     {
             testa= visualizza_testa(lista);
             //qui e successivamente dove trovo testa->info
             val_testa= testa->info;
    
             lista=estrai_testa(lista); 
             adiacenti= cerca_adiacenti(testa->info, grafo);
              while(adiacenti != NULL)
             {
                .........

    grazie cmq, spero di non aver più bisogno anche perchè sto facendo un progetto universitario e devo consegnarlo a breve...
    ciao...

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.