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