PDA

Visualizza la versione completa : [C] Funzione che riceve in ingresso un albero


slashino
03-07-2012, 10:00
Salve a tutti, ho una strutturi BST definita nel modo seguente:


struct SKey{ //CHIAVE
char codice[11];
};
typedef struct SKey TKey;

struct SSat { //SATELLITE
char razza[16];
float peso;
int croccantini;
};
typedef struct SSat TSat;

struct SInfo{ //INFO
TKey key;
TSat satellite;
};

typedef struct SInfo TInfo;

struct SNode { //NODO
TInfo info;
struct SNode *left;
struct SNode *right;
};
typedef struct SNode TNode;
typedef TNode* TTree;

Devo scrivere una funzione che riceve in ingresso l'albero e un array di stringhe e restiuisca l'array riempito con tutte le razze ( ripetute una volta sola ) e il numero delle razze. Il prototipo deve essere il seguente :


int crea_elenco_razze(TTree tree,char elenco [][MAX])
e la funzione che ho scritto io :


int crea_elenco_razze(TTree tree,char elenco [][MAX])
{
if(tree==NULL)
return 0;
else
{
int l,r,c;
if(tree->right!=NULL && tree->left!=NULL)
{
l=crea_elenco_razze(tree->left,elenco);
r=crea_elenco_razze(tree->right,elenco);
c=aggiungi(tree->info.satellite.razza, elenco,l+r);
return c;
}
else
{
if(tree->right!=NULL)
{
r=crea_elenco_razze(tree->right,elenco);
c=aggiungi(tree->info.satellite.razza, elenco,r);
return c;
}
else
{
if(tree->left!=NULL)
{
l=crea_elenco_razze(tree->left,elenco);
c=aggiungi(tree->info.satellite.razza,elenco,l);
return c;
}
else
{
c=aggiungi(tree->info.satellite.razza,elenco,0);
return c;
}
}
}
}
}

dove

int aggiungi(char razza[], char elenco [][MAX], int dim)
{
int i;
for(i=0;i<dim;i++)
{
if(strcmp(razza,elenco[i])==0)
return dim;
}
strcpy(elenco[i],razza);
return dim+1;
}

purtroppo nell'elenco razze c' una riga vuota, e quindi il numero di razze risulta essere pi grande dell'effettivo numero di 1. Qualcuno pu darmi una mano?
La chiamata nel main :

case 2:
n_razze=crea_elenco_razze(tree,elenco);
printf("Il numero delle razze presenti e': %d \n",n_razze);
printf("L'elenco delle razze e' il seguente\n");
stampa_elenco(elenco,n_razze);

slashino
03-07-2012, 17:28
Ho risolto in questa maniera (qualora qualcuno fosse interessato alla soluzione):


int crea_elenco_razze(TTree tree,char elenco [][MAX])
{
if(tree==NULL)
return 0;
else
{
if(tree->right==NULL && tree->left==NULL)
{
int c=aggiungi(tree->info.satellite.razza,elenco,0);
return c;
}
else
{
if(tree->right!=NULL && tree->left==NULL)
{
int c=crea_elenco_razze(tree->right,elenco);
int m= aggiungi(tree->info.satellite.razza,elenco,c);
return m;
}
else
{
if(tree->right==NULL && tree->left!=NULL)
{
int c=crea_elenco_razze(tree->left,elenco);
int m= aggiungi(tree->info.satellite.razza,elenco,c);
return m;
}
else
{
int r=crea_elenco_razze(tree->right,elenco);
int l=crea_elenco_razze(tree->left,elenco);
int m=aggiungi(tree->info.satellite.razza,elenco,r+l);
return m;
}
}
}
}

}

...sbagliavo nell'analizzare i vari casi.

Loading