Ciao a tutti. Ennesimo problema per me, stavolta con gli alberi.
Il concetto generale degli alberi mi è ben chiaro, avendoli già studiati in java.
Tuttavia, ho ancora dei problemi.
Per esempio, in questo problema devo visualizzare in ordine decrescente di frequenza le stringhe dell'albero.
Ogni nodo è così strutturato
L'aggiunta di una parola all'albero riesco a gestirla bene, stessa cosa per quanto riguarda la stampa in ordine lessicografico delle parole. L'albero è fatto in modo che ogni nodo sinistro contiene solo parole lessicograficamente minori del nodo padre ed ogni nodo destro quelle maggiori.codice:struct tnode { char *word; //la parola da memorizzare int count; //il numero di occorrenze della parola struct tnode *left; //un puntatore al nodo figlio sinistro struct tnode *right; //e uno al destro };
Come faccio, a questo punto, a stampare invece non in base all'ordine lessicografico, ma a quello delle occorrenze di una data parola?
Ho provato in vari modi, ma tutti sbagliati :S. Eccone uno; in questo esempio la funzione searchmax cerca il valore massimo nella funzione, treeprintn dovrebbe stampare tutti i valori che hanno n occorrenze, mentre treeprintcount si occupa di passare i giusti valori alla funzione precedente.
Mentre la funzione di ricerca funziona alla perfezione, sulle altre due ho parecchi dubbi; eseguendo il programma, infatti, viene stampato solo il valore massimo.
Ogni sorta di consiglio o suggerimento è sempre ben accettocodice:void treeprintn(struct tnode *p, int n) { if (p != NULL && (p->count) == n) { printf("%3d %s\n", p->count, p->word); treeprintn(p->left, n); treeprintn(p->right, n); } } void treecountprint(struct tnode *p) { int max = searchmax(p, 0); int i = 1; while (i <= max && p != NULL) { treeprintn(p, i); i++; } } int searchmax(struct tnode *p, int max) { if (p != NULL) { if ((p->count) > max) max = p->count; max = searchmax(p->left, max); max = searchmax(p->right, max); } return max; }![]()

Rispondi quotando