Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C] Inserimento iterativo BST

    Ragazzi stò cercando di utilizzare questa funzione :

    codice:
    // Inserimento in un BST iterativo
    NODO *BST_InsertIter(NODO *root, COMPARE Compare, void *value)
    {
         NODO *New_Node, *curr, *prev;
         curr = root;
         
         // ricerco la posizione
         prev = NULL;
         
         while ( curr != NULL )
         {
               // salvo il nodo precedente prima di scorrere con il corrente
               prev = curr;
               
               if ( Compare ( value, curr->info ) < 0 )
               {
                    // vado verso sinistra
                    curr = curr->sx;
               }
               else 
               if ( Compare ( value, curr->info ) > 0 )
               {
                    // vado verso destra
                    curr = curr->dx;
               }
         }
         
         // creazione del nuovo nodo da inserire
         New_Node=(NODO*)malloc(sizeof(NODO));
         New_Node->sx = NULL;
         New_Node->dx = NULL;
         New_Node->info = value;
         
         /* aggiornamento
          * se il valore è più piccolo del nodo corrente che non ha più figli(nè destro nè sinistro)
          * aggiungo il nodo a sinistra altrimenti a destra
          */
         if ( Compare ( value, curr->info ) < 0 )
            prev->sx = New_Node;
         else if ( Compare ( value, curr->info ) > 0 )
            prev->dx = New_Node;
            
         return root;
    }
    praticamente è l'inserimento in un albero binario di ricerca utilizzando un metodo iterativo.

    nel main ho:

    codice:
     char *stringa;
     NODO *rootString;
    
                    printf("Inserisci la stringa da inserire:\n");
                    stringa = GetInput();
                    rootString = BST_InsertIter(rootString, &CompareString, stringa );

    funzione GetInput
    codice:
    char *GetInput(void)
    {
        char* result=(char*)malloc(10*sizeof(char)),temp,length=0,dim=10;
        while( (temp=getchar())!=10)
        {
            length++;
            if(dim<length)
            {
                dim+=10;
                result=(char*)realloc(result,dim*sizeof(char));
            }
            result[length-1]=temp;
        }
        result[length]='\0';//aggiunge il terminatore stringa 
        
        return result;
    }
    Quando provo a inserire un elemento si blocca il programma eppure non riesco a capire il perchè, qualcuno può aiutarmi?
    Grazie anticipatamente
    Con i sogni possiamo conoscere il futuro...

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

    non è inizializzato.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    prima ho dimenticato di scrivere
    codice:
    NODO *rootString = NULL;
    che comunque dà problemi.
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Cioè ? Quali problemi ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    si blocca il programma con la classica scritta "programma.exe ha smesso di funzionare" (windows 7)
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Semplicemente per il fatto che alla fine del ciclo curr è un puntatore NULL e quindi non puoi accedere ad un suo campo, in realtà devi solo assegrare New_Node a curr ed il gioco è fatto, non servono quei controlli perchè curr è già il luogo giusto, prova a farti uno schema su carta per riflettere, potrei essermi sbagliato, ma credo sia per quello, buona fortuna

  7. #7
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Non è che abbia capito molto da quello che hai scritto
    Con i sogni possiamo conoscere il futuro...

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Alla fine del ciclo while curr = NULL
    Poi tu cerchi di accedere ad un campo della struttura:
    curr->info
    Il puntatore è NULL...

    curr è già il luogo dove devi inserire l'oggetto, quindi ti basta sostituire l'if a fine funzione con
    curr = New_Node;

    Dovrebbe funzionare

  9. #9
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Perfetto ho sostituito tutto l'if alla fine con curr=New_Node. Adesso provo a stampare usando:
    codice:
    /*=======================================
     * Vistita in Order iterativa
     *======================================*/
    void InOrderIter(NODO *root, STAMPAINFO Stampa)
    {
         STACK *pila;
         NODO *curr = root;     
         
         while ( pila != NULL || curr != NULL )
         {
               if ( curr != NULL )
               {
                    pila = push(pila, curr);
                    curr = curr->sx;
               }
               else
               {
                   curr = (NODO*)top(pila);
                   pila = pop(pila);
                   Stampa(curr->info);
                   curr = curr->dx;
               }
         }
    }
    ed ho questo nel main:
    codice:
    InOrderIter(rootString, &StampString);
    StampString mi serve per capire che tipo di info devo stampare nel caso di una stringa ho:
    codice:
    /*===================================
     * Stampo una stringa
     *==================================*/
    void StampString(void *value)
    {
        printf("%s", *((char*)value));
        printf(" ");
    }
    Nella stampa mi da lo stsso errore
    Con i sogni possiamo conoscere il futuro...

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    *((char*)value): c'è un * in più, dovrebbe essere:
    (char*)value
    In quanto in C/C++ le stringhe sono date da un indirizzo di memoria che punta al primo byte di un segmento di memoria sequenziale.
    Con il tuo codice individui appunto questo byte che poi è il primo carattere...
    Prova a vedere se così funziona, premetto che non ho controllato tutto il codice ma ho solo dato un'occhiata...

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.