proverò a correggere..anche se mi sembra che togliendo l'& non mi funzionava piu..cmq provo...
proverò a correggere..anche se mi sembra che togliendo l'& non mi funzionava piu..cmq provo...
è vero ca....!!!!!!![]()
![]()
![]()
stava li l'errore!!
ora infatti l'accesso funziona..
non sai quanto ti sono grato!
non rilsassarti troppo però eh che tra un po t faccio qualche altra domandina![]()
GRAZIE MILLE PER LA PAZIENZA E L'AIUTO
Di nulla ...
Da parte tua, riponi un po' piu' fiducia nei suggerimenti, anche se il codice l'ha impostato il prof ...![]()
tornando al problema originale del post..
ora ho necessità di trovare un nodo in un albero n.ario (composto da nodi, come quelli visti sopra)
il mio schema in pseudocodice è il seguente:
CERCA(nodo radice, nodo chiave)
1- controlla radice. se radice = chiave, return radice
2- se radice ha figli:
- mentre i figli non sono finiti:
- CERCA(figlio_corrente,chiave)
in questo modo prima controllo sempre la radice del nodo attualmente in esame, poi con unciclo while controllo un per uno i figli, chiamando ricorsivamente la funzione sui figli.
procedo inquesto modo perche i nodi non sono collegati fra di loro, nel senso che non esiste il puntatore al fratello, ma ho solo una lista di fgli per ogni nodo.
il problema è che non funziona.. in quanto mi dice sempre che trova l'elemento anche se questo non è nell'albero.. inoltre poi con l'indirizzo che torna genera sempre seg.default
ecco il codice:
da notare che per scorrere le liste dei figli uso degli "iteratori" che sono delle funzioncine pensate (obblgatorie da specifiche) appunto per scorrere una lista.codice:struct node *cerca(struct node *root,struct node *elemento){ // cerca il nodo elemento nell'albero radicato in root printf("nodo in esame: %s\n",root->name); if (strcmp(root->name,elemento->name) == 0) { // controlla radice printf("trovato\n"); return root; } else { if (root->children != NULL) { iterator i = get_iterator(root->children); while (has_next(i)) { struct node *temp = (struct node *)next(i); //if (strcmp(temp->name,elemento->name) == 0) return temp; return cerca(temp,elemento); } } } }
codice:struct iterator { struct NodoLista *pt; }; typedef struct iterator *iterator; iterator get_iterator(list l) { // crea un nuovo iteratore sulla lista l iterator i = (iterator)malloc(sizeof(struct iterator)); if (l == NULL) { i->pt = NULL; return i; } i->pt = l; return i; } int has_next(iterator i) { // se i non è alla fine della lista torna 1, altrimenti 0 if (i->pt == NULL) return 0; else return 1; } void *next(iterator i) { void *prec; if (i->pt != NULL) { prec = (i->pt)->value; i->pt = (i->pt)->next; return prec; } return NULL; }
oregon...confido in te..![]()
intanto continuo a testare..
ho aggiunto un return null:
in questo modo non mi genera piu seg-default.. pero la ricerca termina quando un nodo non ha figli, quindi non torna indietro la chiamata ricorsiva in pratica.codice:struct node *cerca(struct node *root,struct node *elemento){ // cerca il nodo elemento nell'albero radicato in root printf("stiamo cercando il nodo %s nell'albero %s\n",elemento->name,root->name); if (strcmp(root->name,elemento->name) == 0) { // controlla radice printf("trovato\n"); return root; } else { if (root->children != NULL) { iterator i = get_iterator(root->children); while (has_next(i)) { struct node *temp = (struct node *)next(i); printf("nodo in esame: %s\n",temp->name); //if (strcmp(temp->name,elemento->name) == 0) return temp; return cerca(temp,elemento); } } return NULL; } }
cioè quando visita un nodo che non è uguale all'elemento da cercare, invece di risalire e continuare la ricerca, sospende (credo a causa el return NULL che ho messo).
![]()
aiutooo!!![]()
Abbi pazienza... la gente risponde appena può...Originariamente inviato da jacopos81
aiutooo!!![]()
Ciao.![]()
"Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza
ci mancherebbe..Originariamente inviato da LeleFT
Abbi pazienza... la gente risponde appena può...
Ciao.![]()
![]()