PDA

Visualizza la versione completa : [C++] Generare Casualmente un albero di nomi


Skull260287
03-06-2008, 15:51
Ciao a tutti, sto affrontando il problema di scrivere una funzione che mi permetta di generare alberi non ordinati di nomi in maniera casuale, le funzioni che ho scritto sono indicate dal commento //Generazione Alberi Casuali NN Ord. Queste non funzionano perchè il codice che da un array di stringhe mi va a creare in maniera random un array di caratteri, poi utilizzato in tutto il resto del programma non funziona. Più specificatamento, con qualche cout ho notato che la generazione di nomi casuali( o meglio pseudocasuali) funziona, ma poi nella parte di codice che vi evidenzio non viene riportato come dovrebbe e sul monitor compaiono caratteri indecifrabili.




/*
Nome del programma: AlberiCaratteri.cpp
*/

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <math.h>
#include <time.h> //Genera Numeri Casuali Tutti Diversi
#include <string>

struct Anodo{
char key[20];
Anodo *left,*right;
};

typedef Anodo *PAnodo;


using namespace std;

void CreaAlberoDaFile(PAnodo &);
PAnodo InsertA(char [] ,PAnodo ,PAnodo );
PAnodo InsertSort(char [],PAnodo );
void InsertSort2( PAnodo &,char [], bool &);
int Altezza(PAnodo );
void StampaBST(PAnodo ,int );
void pfileorder(PAnodo );
PAnodo Insert(char [], PAnodo , PAnodo ); //Generazione Alberi Casuali NN Ord
PAnodo AlberoCasuale(int ); //Generazione Alberi Casuali NN Ord


int main(){

PAnodo A;

//CreaAlberoDaFile(A);
A=AlberoCasuale(3);
StampaBST(A,0);

cout<<endl;

system("pause");
return 0;

}

PAnodo Insert(char info1[], PAnodo As, PAnodo Ad) {
// PER INSERIRE UNA FOGLIA SI CHIAMA CON Insert(Numero,NULL,NULL)
PAnodo A2;
A2= new Anodo;
strcpy(A2->key,info1);
A2->left=As;
A2->right=Ad;
return A2;
}

string v[10]={"Marco","Giulio","Rocco","Vincenzo","Andrea","Giulietta",
"Alfa","Romeo","Domenico","Francesco"};

void copiastingachar(char *mioArray){

srand ( time ( NULL ) );
string att=v[rand()%10];
cout<<att<<endl;
system("pause");
int quantiElementi=att.size();
int i; // Indice per scorrere l'array
// Alloco il mio array:
mioArray = (char *) malloc(quantiElementi * sizeof(char));

// Lo riempio:
for(i=0; i<quantiElementi; i++) mioArray[i] = att[i];

}


PAnodo AlberoCasuale(int n)
{
//Dato un intero n restituisce un albero di interi di altezza n NON ORDINATO
if (n==0) {
char *vett;
copiastingachar(vett);

return Insert(vett,NULL,NULL);
}

else{
char vett[20];
copiastingachar(vett);
return Insert(vett,AlberoCasuale(n-1),AlberoCasuale(n-1));
}
}

int Altezza(PAnodo A)
{ // CALCOLA L’ALTEZZA DELL’ALBERO A
int Hs, Hd;
if (A==NULL)
return -1;
else {
Hs=Altezza(A->left); Hd=Altezza(A->right);
if (Hs > Hd)
return ++Hs;
else
return ++Hd;
}
}

/*
* Visita Ricorsivamente l'albero e salva i valori dei nodi che si trovano
* al livello specificato
*/


void visita(PAnodo a, int livello, int i, ofstream &outlista) {

// Check Livello
if (i == livello) {
outlista<<a->key<<"\t";
return;
}
// Incrementa contatore livello
i++;
// Visita Nodo Sinistro
if (a->left != NULL)
visita(a->left, livello, i,outlista);
// Visita Nodo Destro
if (a->right != NULL)
visita(a->right, livello, i,outlista);
}


void pfileorder(PAnodo Tree){

char* num;
//cout<<"Salva Albero su FILE:"<<endl;
string NomeLn,NomeOut;
ifstream filista;
ofstream outlista;
NomeOut="alberocar.txt";
outlista.open(NomeOut.c_str());
if(!outlista){
cerr<<"Non si puo' aprire il file!"<<endl;
system("pause");
}

for(int k=0;k<=Altezza(Tree);k++)
visita(Tree,k,0,outlista);

outlista.close();
}


void CreaAlberoDaFile(PAnodo &Tree){
char num[20];
cout<<"Crea Albero da FILE:"<<endl;
Tree=NULL;
string NomeLn,NomeOut;
ifstream filista;
ofstream outlista;
NomeLn="alberocar.txt";
filista.open(NomeLn.c_str());
if(!filista){
cerr<<"Non si puo' aprire il file!"<<endl;
system("pause");
}
filista>>num;
while (!filista.eof()) {
bool temp=false;
InsertSort2( Tree, num, temp);
if (temp==false) cout<<"Numero preesistente ="<<num<<endl;
else cout<<" Inserito numero= "<<num<<endl;
filista>>num;;
}
system("pause");
filista.close();
}

void InsertSort2( PAnodo &A,char m[], bool &inserito) { //OK
if(A==NULL) {
A=new Anodo;
strcpy(A->key,m);
A->left=NULL;
A->right=NULL;
inserito=true;
}
else if(A->key<m) InsertSort2(A->right,m,inserito);
else if(A->key>m) InsertSort2(A->left,m,inserito);
else inserito=false;
}

PAnodo InsertA(char* key1,PAnodo TreeS,PAnodo TreeD){
PAnodo A2;
A2=new Anodo;
strcpy(A2->key,key1);
A2->left=TreeS;
A2->right=TreeD;
return A2;
}
void StampaBST(PAnodo Tree,int i){
if(Tree!=NULL){
StampaBST(Tree->right,i+1);
for(int j=1;j<=i;j++)
cout<<" ";
cout<<Tree->key;
cout<<endl;
StampaBST(Tree->left,i+1);
}
}


Se esiste un codice migliore segnalatemelo, vi ringrazio.

wgd-developer
03-06-2008, 17:47
ciao
ti posto il codice per creare un albero casuale di interi

Tnodo AlberoCasuale(int n) {
//Dato un intero n restituisce un albero di interi di altezza n NON ORDINATO
if (n==0)
return Insert(rand()%100,NULL,NULL);
else
return Insert(rand()%100,AlberoCasuale(n-1),AlberoCasuale(n-1));
}

Skull260287
03-06-2008, 18:18
Originariamente inviato da wgd-developer
ciao
ti posto il codice per creare un albero casuale di interi

Tnodo AlberoCasuale(int n) {
//Dato un intero n restituisce un albero di interi di altezza n NON ORDINATO
if (n==0)
return Insert(rand()%100,NULL,NULL);
else
return Insert(rand()%100,AlberoCasuale(n-1),AlberoCasuale(n-1));
}


Questo lo conosco anche io, ma non sono riuscito ad adattarlo per la creazione di un albero casuale di Nomi.

Skull260287
04-06-2008, 12:44
Nessuno conosce un codice per fare questo?

:ciauz:

menphisx
04-06-2008, 14:44
PAnodo AlberoCasuale(int n) {

const char *v[10]={
"Marco",
"Giulio",
"Rocco",
"Vincenzo",
"Andrea",
"Giulietta",
"Alfa",
"Romeo",
"Domenico",
"Francesco"
};

if (n==0)
return Insert(v[rand() % 10], NULL, NULL);
else
return Insert(v[rand() % 10], AlberoCasuale(n-1), AlberoCasuale(n-1));

}


:ciauz:

Skull260287
04-06-2008, 15:43
Originariamente inviato da menphisx


PAnodo AlberoCasuale(int n) {

const char *v[10]={
"Marco",
"Giulio",
"Rocco",
"Vincenzo",
"Andrea",
"Giulietta",
"Alfa",
"Romeo",
"Domenico",
"Francesco"
};

if (n==0)
return Insert(v[rand() % 10], NULL, NULL);
else
return Insert(v[rand() % 10], AlberoCasuale(n-1), AlberoCasuale(n-1));

}


:ciauz:

Gentilissimo, grazie mille :zizi:

Loading