codice:
/*
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.