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");  
     }
}