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

Rispondi quotando
