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
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
};
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.
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.
codice:
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;
}
Ogni sorta di consiglio o suggerimento è sempre ben accetto