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

    [C] Cancellare un elemento da una lista

    come seguito di questa discussione apro quest'altra

    Dopo la pazienza di oregon nel spiegarmi il metodo piu semplice per creare una lista eccomi di nuovo qui per un nuovo problema....

    cancellare un elemento creato dinamicamente -.-'

    per eliminare un elemento mi serve un puntatore di supporto, che punti all'elemento da eliminare e poi devo far puntare, l'altro puntatore a questo elemento, all'elemento successivo . . . .

    ho provato a scrivere del codice ma mi sono bloccato...

    Codice PHP:

    void elimina
    (int codice){
       
    lista *cursore, *supporto;
       
    cursore testa;
       while(
    cursore->next!=NULL){
                if(
    cursore->codice==codice)/*ho trovato l'elemento da eliminare/
    /*a questo punto dovrei uscire dal while e eliminare il nodo trovato ma come posso fare????*/
       

    struttura a cui faccio riferimento . . . .
    Codice PHP:

    struct nodo
    {
             
    int codice;
             
    char data[50];
             
    struct nodo *next;
           };

    typedef struct nodo lista
    grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Beh, le cose si fanno un pelino piu' complesse ... per fare le cose corrette ho modificato la tua funzione cerca (che, tra l'altro, non funzionava correttamente nel caso di lista vuota ...). La nuova versione cerca l'ho usata anche nella elimina.

    La cerca restituisce il puntatore al nodo cercato (se trovato, altrimenti NULL) e restituisce anche il puntatore al nodo precedente (se il nodo trovato e' quello iniziale, il precedente e' NULL). Per restituire un puntatore tramite un parametro, deve essere passato un puntatore a puntatore (ecco il perche' del ** nell'ultimo parametro della cerca).

    Queste informazioni sono utili alla funzione elimina per ricostruire correttamente la lista, *senza dimenticare* che la memoria allocata con la malloc, deve essere liberata con la free quando il nodo viene eliminato.

    Ovviamente ho adattato il main ...

    Naturalmente avrai qualche problemino ad afferrare tutto immediatamente, ma studia il codice con calma e vedrai che ti sara' chiaro ...

    Codice PHP:
    lista *cerca(int codicelista **prec)

        
    lista *corr testa;
        *
    prec NULL;

        while(
    corr)
        {
            if(
    corr->codice==codice) break;
            *
    prec=corr;
            
    corr=corr->next;
        }
        
        return(
    corr);


    void elimina(int codice)

        
    lista *prec, *el cerca(codice, &prec);
        if(
    el)
        {
            if(!
    prec)
                
    testa=el->next;
            else
                
    prec->next=el->next;

            
    free(el);
        }
    }

    int main(void)

        
    int num
        
    char data[50]; 
        
    printf("\n> Liste - - -\n"); 
        
    printf("codice > "); 
        
    scanf("%d", &num); 
        
    printf("\ttesto >"); 
        
    scanf("%s"data); 
        while(
    num){ 
           
    aggiungiElemento(numdata); 
           
    printf("\ncodice > "); 
           
    scanf("%d", &num); 
           
    printf("\ttesto >"); 
           
    scanf("%s"data); 
        } 
        
    printf("\nImmissione elementi terminata\n"); 
        
    stampa(testa); 

        
    printf("\nElemento da cercare: "); 
        
    scanf("%d", &num);
        
        
    lista *prec, *el cerca(num, &prec); 
        if(
    el)
           
    printf("\nElemento trovato: %s\n"el->data); 
        else
           
    printf("\nElemento non trovato. . .\n");   

        
    elimina(num);
        
    stampa(testa);

        
    system("PAUSE");
        return 
    0


  3. #3
    dopo una buona ora di scervellamento . . . . credo di aver afferrato !

    non e' difficile, ma purtroppo tutto sta a entrare nell'ottica. . . .

    commento il codice. . . .

    Originariamente inviato da oregon

    Codice PHP:
    lista *cerca(int codicelista **prec)

        
    lista *corr testa;/*assegno al puntatore che uso come cursore nella ricerca la testa 
            della lista*/
        
    *prec NULL;/*mentre il puntatore al nodo precedente assegno NULL*/

        
    while(corr)/*finche nn raggiungo la fine della lista*/
        
    {
            if(
    corr->codice==codice) break;/*se il contenuto di codice nel nodo corrispondo 
                                                 al parametro passato esco dal while*/
            
    *prec=corr;/*altrimenti assegno al puntatore che sta una posizione 
                                prima la stessa in cui si trova il cursore che scandisce la lista*/
            
    corr=corr->next;/*e al puntatore "cursore" il nodo successivo puntato 
                                              da next presente nel nodo attuale*/
        
    }
        
        return(
    corr);/*restituisco come da prototipo un puntatore 
                                   fermo nella posizione dell'elemento cercato*/


    void elimina(int codice)/*ricevo il codice contenuto nel nodo da eliminare*/

        
    lista *prec, *el cerca(codice, &prec);/*creo due puntatori di supporto uno 
            alla posizione precedente e uno che punta alla posizione dell'elemento da eliminare*/
        
    if(el)/*se el e' diverso da NULL*/
        
    {
            if(!
    prec)/*se l'elemento da eliminare e' in testa alla lista*/
                
    testa=el->next;
            else
    /*altirmenti collego il puntatore presente nel nodo precedente con 
                           l'elemento successivo a quello da eliminare*/
                
    prec->next=el->next;

            
    free(el);/*rendo nuovamente disponibile l'area puntata da el*/
        
    }/*nel caso el fosse NULL significa che o la lista e' vuota o non c'e
              niente da eliminare*/
    }/*finita la funzione elimina el e prec vanno in pace*/

    int main(void){ 
        
    int num
        
    char data[50]; 
        
    printf("\n> Liste - - -\n"); 
        
    printf("codice > "); 
        
    scanf("%d", &num); 
        
    printf("\ttesto >"); 
        
    scanf("%s"data); 
        while(
    num){ 
           
    aggiungiElemento(numdata); 
           
    printf("\ncodice > "); 
           
    scanf("%d", &num); 
           
    printf("\ttesto >"); 
           
    scanf("%s"data); 
        } 
        
    printf("\nImmissione elementi terminata\n"); 
        
    stampa(testa); 

        
    printf("\nElemento da cercare: "); 
        
    scanf("%d", &num);
        
    /*una volta prelevato da terminale l'elemento da cercare
        creo due puntatori di supporto per trovare l'elemento che mi interessa 
        e poi stampare il campo data se trovato*/
        
    lista *prec, *el cerca(num, &prec); 
        if(
    el)
           
    printf("\nElemento trovato: %s\n"el->data); 
        else
           
    printf("\nElemento non trovato. . .\n");   
        
    /*qui in questo caso elimina l'elemento con lo stesso codice di quello 
        cercato, ovviamente e' possibile sfruttarla diversamente*/
        
    elimina(num);
        
    stampa(testa);

        
    getchar();
        
    getchar();

        return 
    0


  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da donato.sciarra
    dopo una buona ora di scervellamento . . . . credo di aver afferrato !

    non e' difficile, ma purtroppo tutto sta a entrare nell'ottica. . . .

    commento il codice. . . .

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