Negative_creep
15-12-2010, 20:21
Ciao a tutti, ho bisogno di un vostro parere nonchč aiuto sugli alberi binari di ricerca: volevo fare un semplice programma che mi inserisca in un albero binario degli studenti (con matricola,nome ed etā) ordinati in base all'etā solo che non riesco a cancellare dall'albero binario i nodi. Posto quello che ho fatto, mi raccomando non esitate a correggermi :stordita:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct n {
struct n* padre;
struct n* figlio_sx;
struct n* figlio_dx;
char nome[500];
int anni;
int matricola;
} *Nodo,dim;
/* CREAZIONE DI UN NODO DELL'ALBERO */
Nodo CreaAlbero(char* nom,int age,int matr,Nodo t1,Nodo t2){
Nodo t0= (Nodo)malloc(sizeof(dim));
t0->figlio_sx = t1;
t0->figlio_dx = t2;
strcpy(t0->nome,nom);
t0->anni=age;
t0->matricola=matr;
return(t0);
}
int isEmpty(Nodo t){ /* verifico che un albero sia vuoto */
if (t == NULL)
return (true);
else return (false);
}
char* nomePersona(Nodo x) {
return x->nome;
}
int anniPersona(Nodo x) {
return x->anni;
}
int matrPersona(Nodo x) {
return x->matricola;
}
Nodo Figliosx(Nodo x){ /* restituisce il figlio sinistro */
return x->figlio_sx;
}
Nodo Figliodx(Nodo x){ /* restituisce il figlio destro */
return x->figlio_dx;
}
Nodo CreaNodo(char* nom,int matr,int age,Nodo t1,Nodo t2) {
return CreaAlbero(nom,matr,age,NULL,NULL);
}
/* INSERIMENTO DI UN NODO */
Nodo Inserisci(char* nom,int age,int matr,Nodo x){
if(isEmpty(x)) /* se l'albero e' vuoto, allora verrā creato un nuovo nodo*/
return CreaNodo(nom,age,matr,NULL,NULL);
if(anniPersona(x)>= age )
return CreaAlbero(nomePersona(x),anniPersona(x),matrPersona(x),Inserisci(nom,age,matr,Figliosx(x)),Figliodx(x));
if(anniPersona(x)< age)
return CreaAlbero(nomePersona(x),anniPersona(x),matrPersona(x),Figliosx(x),Inserisci(nom,age,matr,Figliodx(x)));
else return x;
}
Nodo* Cerca(Nodo x, int age) {
if (x==NULL){
printf("La persona non esiste!");
return NULL;
}
if ( (x)->anni == age){
return &x;
}
if ( age<(x)->anni) {
return Cerca(x->figlio_sx,age);
}
else {
return Cerca(x->figlio_dx,age);
}
}
void CancellaNodo(Nodo* t1,int eta) { /* CASO SEMPLICE */
Nodo tmp =*t1;
Nodo *tmp2 = Cerca(tmp,eta);
Nodo v;
if((*tmp2)->figlio_sx == NULL && (*tmp2)->figlio_dx == NULL ) {
t1 =tmp2;
free(t1);
}
else{
return ;
}
}
int main(void) {
Nodo t1=NULL;
Nodo* trova=NULL;
int age1=4;
int age2=10;
int age3=2;
int matricola1=444;
int matricola2=666;
int matricola3=888;
char* nome1="Marco";
char* nome2="Giorgio";
char* nome3="Luca";
t1=Inserisci(nome1,age1,matricola1,t1);
t1=Inserisci(nome2,age2,matricola2,t1);
t1=Inserisci(nome3,age3,matricola3,t1);
CancellaNodo(&t1,10);
printf(" %s %d %d ",t1->figlio_dx->nome,t1->figlio_dx->anni, t1->figlio_dx->matricola);
system("PAUSE");
}
Della procedura Cancella() ho implementato solo il caso in cui voglio eliminare una foglia (giā non mi esce quello figuriamoci gli altri 2) scusate la banalitā del main ma č solo per rendere chiari gli elementi inseriti, quando faccio alla fine la printf() mi stampa ancora "GIORGIO 10 666" quindi non me lo ha eliminato dall'albero T1.
Grazie per l'eventuale aiuto! :)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct n {
struct n* padre;
struct n* figlio_sx;
struct n* figlio_dx;
char nome[500];
int anni;
int matricola;
} *Nodo,dim;
/* CREAZIONE DI UN NODO DELL'ALBERO */
Nodo CreaAlbero(char* nom,int age,int matr,Nodo t1,Nodo t2){
Nodo t0= (Nodo)malloc(sizeof(dim));
t0->figlio_sx = t1;
t0->figlio_dx = t2;
strcpy(t0->nome,nom);
t0->anni=age;
t0->matricola=matr;
return(t0);
}
int isEmpty(Nodo t){ /* verifico che un albero sia vuoto */
if (t == NULL)
return (true);
else return (false);
}
char* nomePersona(Nodo x) {
return x->nome;
}
int anniPersona(Nodo x) {
return x->anni;
}
int matrPersona(Nodo x) {
return x->matricola;
}
Nodo Figliosx(Nodo x){ /* restituisce il figlio sinistro */
return x->figlio_sx;
}
Nodo Figliodx(Nodo x){ /* restituisce il figlio destro */
return x->figlio_dx;
}
Nodo CreaNodo(char* nom,int matr,int age,Nodo t1,Nodo t2) {
return CreaAlbero(nom,matr,age,NULL,NULL);
}
/* INSERIMENTO DI UN NODO */
Nodo Inserisci(char* nom,int age,int matr,Nodo x){
if(isEmpty(x)) /* se l'albero e' vuoto, allora verrā creato un nuovo nodo*/
return CreaNodo(nom,age,matr,NULL,NULL);
if(anniPersona(x)>= age )
return CreaAlbero(nomePersona(x),anniPersona(x),matrPersona(x),Inserisci(nom,age,matr,Figliosx(x)),Figliodx(x));
if(anniPersona(x)< age)
return CreaAlbero(nomePersona(x),anniPersona(x),matrPersona(x),Figliosx(x),Inserisci(nom,age,matr,Figliodx(x)));
else return x;
}
Nodo* Cerca(Nodo x, int age) {
if (x==NULL){
printf("La persona non esiste!");
return NULL;
}
if ( (x)->anni == age){
return &x;
}
if ( age<(x)->anni) {
return Cerca(x->figlio_sx,age);
}
else {
return Cerca(x->figlio_dx,age);
}
}
void CancellaNodo(Nodo* t1,int eta) { /* CASO SEMPLICE */
Nodo tmp =*t1;
Nodo *tmp2 = Cerca(tmp,eta);
Nodo v;
if((*tmp2)->figlio_sx == NULL && (*tmp2)->figlio_dx == NULL ) {
t1 =tmp2;
free(t1);
}
else{
return ;
}
}
int main(void) {
Nodo t1=NULL;
Nodo* trova=NULL;
int age1=4;
int age2=10;
int age3=2;
int matricola1=444;
int matricola2=666;
int matricola3=888;
char* nome1="Marco";
char* nome2="Giorgio";
char* nome3="Luca";
t1=Inserisci(nome1,age1,matricola1,t1);
t1=Inserisci(nome2,age2,matricola2,t1);
t1=Inserisci(nome3,age3,matricola3,t1);
CancellaNodo(&t1,10);
printf(" %s %d %d ",t1->figlio_dx->nome,t1->figlio_dx->anni, t1->figlio_dx->matricola);
system("PAUSE");
}
Della procedura Cancella() ho implementato solo il caso in cui voglio eliminare una foglia (giā non mi esce quello figuriamoci gli altri 2) scusate la banalitā del main ma č solo per rendere chiari gli elementi inseriti, quando faccio alla fine la printf() mi stampa ancora "GIORGIO 10 666" quindi non me lo ha eliminato dall'albero T1.
Grazie per l'eventuale aiuto! :)