Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [C] Problema esercizio C sulle liste

    Ciao, tra 8 giorni ho l'esame...inizio a capirci qualcosa ma mi sono impallato con la soluzione di questo esercizio (messa online dal proff ma mi sembra sbagliata ditemi voi)

    L'esercizio chiede di scrivere una funzione che presa in ingresso una lista di char elimini i doppioni e restituisca il puntatore alla lista cos modificata

    Il codice della soluzione è questo (è quella del proff...io ho modificato solo la dichiarazione delle variabili e puntatori perchè mi trovo meglioa dichiararli all'inizio del codice anzichè in mezzo al codice...i commenti invece sono i miei, ditemi se ho sbagliato qualcosa):

    codice:
    /* La funzione  RipulisciStr() prende in input il puntatore al primo nodo di una
       lista di interi, elimina i duplicati ritorna il puntatore al primo nodo della
       lista così ripulita, gli elementi della lista hanno il seguente tipo:
           
           typedef struct SList{
               char *stringa;
               struct SList *next;
           } SList;
    */
    typedef struct SList{
               char *stringa;
               struct SList *next;
           } SList;
    
    SList *RipulisciStr(SList *L){
        
        SList **pL;     /* Dichiaro il doppio puntatore pL che contiene l'indirizzo 
                           della locazione corrente */
        SList *elem;    // Dichiara il puntatore elem
        
        pL = &L;   // Imposta pL con l'indirizzo del primo elemento della lista (?)
        
        while(*pL != NULL){    // Finchè non si è giunti alla fine della lista
               
               elem = *pL;  /* Imposta il valore di elem all'indirizzo del nodo
                               puntato da Pl */
        
               /* Se la funzione TrovaStr restituisce un valore non nullo */                                               
               if(TrovaStr(elem->stringa, elem->next)){
                   
                   *pL = elem->next; /* Imposta il valore puntatoda da pL con
                                        l'indirizzo del campo next puntato da elem*/
                   free(elem->stringa);
                   free(elem);
               }
               /* Se non è stato trovato un doppione nella lista pL contiene
                  l'indirizzo del prossimo elemento rispetto al campo elem */
               else
                 pL = &(elem->next);
        }
        return L;
    }
    
    /* Funzione ausiliaria che determina se la stringa str è presente o meno nella
       lista di stringhe */
    
    short TrovaStr(const char *str, const SList *L){
        
        while(L != NULL && strcmp(str, L->stringa) != NULL)
            L = L->next;
        
        return(L != NULL);
    }
    Ci sono varie cose che non mi tornano:

    1) Ma quando faccio pL = &L vuol dire che metto in pL l'indirizzo del puntatore al primo nodo della lista vero? quindi *pL mi dovrebbe dare l'indirizzo del primo nodo....giusto? e **pL che dovrebbe darmi allora?!?!

    2) Se trova un doppione libera lo spazio del vettore stringa e poi libera il nodo ma non và a rilinkare i nodi della lista una volta eliminato un nodo...mi pare strano !!!

    3) non ho capito bene che restituisce la funzione ausiliaria....

    vi prego aiutatemi...ditemi che non sono completamente demente e che in questa soluzione c'è qualcosa che non torna...

  2. #2
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    1)tu considera la struct (SList)come uno scatolotto formato da un campo carattere e un campo puntatore allo scatolotto stesso.
    Quindi L è un puntatore a questo "scatolotto".
    Quando dichiari SList **pL dichiari un puntatore a puntatore di "scatolotto"(doppio puntatore)
    -quindi quando fai pL = &L assegni a pL l'indirizzo del puntatore allo scatolotto.
    Poichè * è l'operatore indirezione che se viene applicato ad un oggetto puntato restituisce il contenuto dell'oggetto stesso, *pL restituisce il valore del puntatore allo scatolotto cioè l'indirizzo al primo elemento della lista.(che poi naturalmente viene incrementato ).
    **pL è semplicemente l'indirizzo del puntatore a puntatore di "scatolotto"...
    bella "scatolotto" vero???
    2)non è vero quello che dici, infatti c'è l'istruzione *pL = elem->next, cioè il puntatore viene spostato in avanti, poi viene free-ato il valore temporaneo elem.
    3)restituisce uno short int... un intero. infatti fa un controllo.
    se (L != NULL) restituisce 1 altrimenti 0.

    non ho il tempo di provarla ma "purtroppo" a spanne la soluzione funziona...

    ciao ciao
    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

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.