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

    [C] Programma con alberi binari di ricerca

    Salve sono nuovo del forum ^^
    Il compito del mio programma è quello di acquisire diverse stringhe e caricarle in un albero binario di ricerca, so che l'errore è in questo stralcio di codice:
    codice:
               for (succ = padre = p; 
               ((succ != NULL) && (strcmp(succ->inf, codice) != 0)); 
               padre = succ,            
               succ = (strcmp(codice, succ->inf) < 0)? succ->pun_sx : succ->pun_dx);                                         
                         {
                         nuovo = (ptrnodo)malloc(sizeof(nodo));
                         for (i=0; i < 12; i++)
                             codice[i] = codice[i] + '0';
                         strcpy(nuovo->inf, codice);
                         nuovo->pun_sx = nuovo->pun_dx = NULL;
                         if (p == NULL)
                            p = nuovo;
                         else
                             if (strcmp(codice, padre->inf) < 0)   
                                padre->pun_sx = nuovo;
                             else
                                padre->pun_dx = nuovo;                           
                         }
    Ovvero la costruzione e l'inserimento, di volta in volta (questo for è a sua volta all'interno di un ciclo while), dei diversi codici acquisiti all'interno dell'albero.
    Il problema è che per qualche motivo sembra che tutti i codici che dovrebbero andare nel sottoalbero destro, vengono scritti sempre nello stesso nodo, così che alla fine, oltre alla radice, mi rimane solo l'ultimo (ad esempio, se i miei codici sono 0, 2, e 4 alla fine l'albero mi stamperà solo lo 0 e il 4).

    Qualcuno può aiutarmi? Grazie anticipatamente per la disponibilità!

    (succ è il puntatore al nodo, p alla radice)

    Questo comunque è l'intero codice:

    codice:
    /*Inclusione librerie*/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    /*Definizione della struttura dei nodi di un albero*/
    
    typedef struct nodo_bin{
                char inf[13];
                struct nodo_bin *pun_dx, *pun_sx; 
              }nodo;
    
    typedef nodo *ptrnodo;
    
    /*Dichiarazione funzioni*/
    void trova(ptrnodo);
    void rimozione(ptrnodo);
    
    /*Definizione della funzione main*/
    int main()
    {    
    /*Dichiarazione di variabili, stringhe e puntatori*/   
        int i, j, chk, a, u, scelta;
        char codice[13], ris[4], risposta;
        ptrnodo p, succ, padre, nuovo;
        
        p = NULL; 
          
        /*Do while: permette all'utente di inserire piu' di un codice,  
        qualora alla richesta di inserire nuovi codici l'utente risponda 'n', 
        il ciclo terminerebbe*/
        
        do
        {
          printf("Inserisci codice: ");
          scanf("%13s", codice);
          /*For: gli elementi di tipo char della stringa vengono convertiti in int
          cosi' da permettere le operazioni future*/
          for (i=0; i < 12; i++)
               codice[i] = codice[i] - '0';
          a =(codice[0] + codice[2] + codice[4] + codice[6] 
              + codice[8]+ codice[10])* 3;
          a = a + (codice[1]+codice[3]+codice[5]
              + codice[7] + codice[9] + codice[11]);
          /*conversione della variabile a in stringa di char*/
          sprintf(ris, "%d", a);  
          
          for(j=0; ris[j]!= '\0'; j++)   
               u = ris[j] - '0';
          /*Confronto del check digit con l'ultima cifra del codice*/
          if(u == 0)
               chk = 0;
          else
               chk = 10 - u;     
          if(chk == codice[11] && codice[12]=='\0')  
               {
               printf("Codice corretto");
          /*Creazione albero binario di ricerca e inserimento del codice in esso*/
    
               for (succ = padre = p; 
               ((succ != NULL) && (strcmp(succ->inf, codice) != 0)); 
               padre = succ,            
               succ = (strcmp(codice, succ->inf) < 0)? succ->pun_sx : succ->pun_dx);                                         
                         {
                         nuovo = (ptrnodo)malloc(sizeof(nodo));
                         for (i=0; i < 12; i++)
                             codice[i] = codice[i] + '0';
                         strcpy(nuovo->inf, codice);
                         nuovo->pun_sx = nuovo->pun_dx = NULL;
                         if (p == NULL)
                            p = nuovo;
                         else
                             if (strcmp(codice, padre->inf) < 0)   
                                padre->pun_sx = nuovo;
                             else
                                padre->pun_dx = nuovo;                           
                         }
                          
    }
          else
              printf("Codice errato");
          printf("\nInserire un altro codice? (y/n)");
          scanf("%2s", &risposta); 
          if(risposta == 'n' && p==NULL)
              printf("L'albero e' vuoto, non e' possibile svolgere operazioni\n\n");                     
        }
        while ((risposta == 'y') || (p == NULL));
        /*Ciclo di scansione dell'albero*/ 
        
        printf("\n\nAlbero---> ");
        succ = p;
        while(succ!=NULL)
            {
            printf("%s", succ->inf);
            printf("---> ");
            succ = succ->pun_sx;
            }
        succ = p;
        succ = succ->pun_dx;
        while(succ!=NULL)
            {
            printf("%s", succ->inf);
            printf("---> ");
            succ = succ->pun_dx;
            }
            printf("NULL\n\n");
        
        /*Creazione del menu' per la scelta di ricerca o 
        rimozione di un elemento dell'albero*/
        do
        {
           printf("Scegliere una delle 3 opzioni" 
                  "(digitare la cifra corrispondente alla selezione):" 
                  "\n1 Ricerca codice \n2 Rimozione codice \n3 EXIT\n");
           scanf("%d", &scelta);
           if(scelta==1)
           {         
                 trova(p);   
           }
           else if (scelta==2)
           {
                 rimozione(p);  
           }    
           else if (scelta!=1 && scelta!=2 && scelta!=3)
                  printf("Scelta sbagliata\n\n");
        }
        while(scelta!=3);
        
        getch();
        return(0);
    }
    
    /*Definizione della funzione trova*/
    void trova(ptrnodo p)
    {
         char ricerca[13];
         ptrnodo succ;
    
         printf("Inserire il codice da ricercare: ");
         scanf("%13s", ricerca);
         /*Algoritmo di ricerca per elementi di liste*/
         for(succ = p; ((succ != NULL) && (strcmp(succ->inf, ricerca) != 0)); 
             succ = (strcmp(ricerca, succ->inf) < 0) ? succ->pun_sx : succ->pun_dx)
             {
             }
         
         if (succ == NULL)
             printf("L'elemento non e' stato trovato\n");
         else
             printf("L'elemento e' stato trovato: %s\n\n", succ->inf);            
    }
    
    /*Definizione della funzione rimozione*/
    void rimozione(ptrnodo p)
    {
         char ricerca[13];
         ptrnodo padre, succ, sost;
         
         printf("Inserire il codice da eliminare dall'albero: ");
         scanf("%13s", ricerca);
         /*Algoritmo di rimozione per elementi di liste*/
         for(succ = padre = p;((succ != NULL) && (strcmp(succ->inf, ricerca) != 0)); 
             padre = succ, 
             succ = (strcmp(ricerca, succ->inf) < 0) ? succ->pun_sx : succ->pun_dx)
             {
             }
         if(succ == NULL)
                 printf("\nL'elemento non esiste\n\n");
         else
         {
                 if (succ->pun_sx == NULL)
                    {
                    if (succ == p)
                       p = succ->pun_dx;
                    else
                        {
                        if (strcmp(ricerca, padre->inf) < 0)
                           padre->pun_sx = succ->pun_dx;
                        else
                           padre->pun_dx = succ->pun_dx;
                        }
                    }
                 else
                     if (succ->pun_dx == NULL)
                     {
                        if (succ == p)
                           p = succ->pun_sx;
                        else
                           {
                           if (strcmp(ricerca, padre->inf) < 0)
                              padre->pun_sx = succ->pun_sx;
                           else
                              padre->pun_dx = succ->pun_sx;
                           }
                      }
                      else
                          {
                          sost = succ;
                          for (padre = sost, succ = sost->pun_sx;
                              (succ->pun_dx != NULL);
                              padre = succ, succ = succ->pun_dx);
                                    strcpy(sost->inf, succ->inf);
                          if (padre == sost)
                              padre->pun_sx = succ->pun_sx;
                          else
                              padre->pun_dx = succ->pun_sx;
                          }
                 free(succ);
                 printf("\nL'elemento e' stato rimosso\n\n");
                 printf("\n\nAlbero---> ");
                 succ = p;
                 while(succ!=NULL)
                 {
                   printf("%s", succ->inf);
                   printf("---> ");
                   succ = succ->pun_sx;
                 }
                 succ = p;
                 if(p != NULL)  
                    succ = succ->pun_dx;
                 while(succ!=NULL)
                 {
                    printf("%s", succ->inf);
                    printf("---> ");
                    succ = succ->pun_dx;
                 }
                 printf("NULL\n\n");  
         }
    }

  2. #2
    Utente di HTML.it L'avatar di gorn
    Registrato dal
    Jun 2010
    Messaggi
    91
    ciao...
    con gli alberi sono negato ma questa istruzione for (succ = padre = p;
    sei sicuro che sia corretta????
    Il problema non è la caduta, ma l'atterraggio (Cit.)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    2
    Si si è corretta, grazie comunque per la risposta.
    Comunque ho trovato l'errore, usavo la condizione

    codice:
    strcmp(codice, succ->inf) < 0
    senza prima aver convertito la stringa di caratteri "codice" in array.

    In compenso ho scoperto che era sbagliata pure la stampa dell'albero

    codice:
    *Ciclo di scansione dell'albero*/ 
        
        printf("\n\nAlbero---> ");
        succ = p;
        while(succ!=NULL)
            {
            printf("%s", succ->inf);
            printf("---> ");
            succ = succ->pun_sx;
            }
        succ = p;
        succ = succ->pun_dx;
        while(succ!=NULL)
            {
            printf("%s", succ->inf);
            printf("---> ");
            succ = succ->pun_dx;
            }
            printf("NULL\n\n");

  4. #4
    Utente di HTML.it L'avatar di gorn
    Registrato dal
    Jun 2010
    Messaggi
    91
    bene... lieto di non esserti stato di aiuto
    Il problema non è la caduta, ma l'atterraggio (Cit.)

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.