Torna indietro   Hardware Upgrade Forum > Software > Programmazione

AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria
A Las Vegas AMD ha svelato i dettagli architetturali delle CPU EPYC di sesta generazione, note con il nome in codice Venice. Nuovi core Zen 6 e Zen 6c costruiti a 2 nanometri, fino a 256 core per socket, 16 canali di memoria, interfaccia PCI Express 6.0 e un'intera famiglia di proposte che va da Venice SP7 a Verano. Senza dimenticare la memoria, oggi la voce di costo più pesante in un server: AMD risponde con CXL 3.1 e con la tecnologia software MEXT, che porta la memoria flash dentro la gerarchia della DRAM.
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro
HONOR Pad X9 Max mette un pannello IPS da 13 pollici con risoluzione 2,5K e refresh a 120 Hz davanti a una batteria da 10.100 mAh e a quattro altoparlanti. Il listino parte da 399,90 euro, per un progetto molto chiaro e ambizioso: schermo ampio, buon audio e giornate lontano dalla presa, a un prezzo che non pesa sul portafoglio
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Con la quattordicesima generazione Lenovo ridisegna il suo ThinkPad più iconico attorno al nuovo Space Frame e ai processori Intel Core Ultra Series 3. Resta sotto 1Kg, è molto più semplice da riparare e si rivolge al professionista che lavora in mobilità, con un prezzo da prodotto di vertice.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-05-2008, 22:19   #1
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
[C] Alberi Binari Di Ricerca - Inserimento Di Un Elemento

Dov'è l'errore? Non capisco bene cosa inserire nella malloc..


Codice HTML:
struct nodo
{
    int DATO;
	struct nodo *DX; //PUNTATORE AL SOTTOALBERO DESTRO
	struct nodo *SX; //PUNTATORE AL SOTTOALBERO SINISTRO
}NODO;

typedef struct nodo* tree;
Codice HTML:
tree InserimentoDiUnElemento(tree T, int e)
{
    if(T==NULL)
    {
        tree new=NULL;
        new=(nodo)malloc(sizeof(*tree));
        new->DATO=e;
        new->SX=NULL;
        new->DX=NULL;
    }

    if(T->DATO==e)
    {
        printf("    ERRORE  \n");
        return NULL;
    }

    if(T->DATO>e)
    {
        InserimentoDiUnElemento(T->SX,e);
    }else
    {
        InserimentoDiUnElemento(T->DX,e);
    }
}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 00:25   #2
wisher
Senior Member
 
L'Avatar di wisher
 
Iscritto dal: Aug 2005
Messaggi: 2755
Perchè allochi un *tree e non un tree?
Lo spazio che devi allocare è per un nodo, non per un puntatore ad un nodo.
__________________
wisher è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 09:31   #3
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
mi da ancora questi errori

error: expected identifier before '=' token


error: no matching function for call to `nodo::nodo(void*)'
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 10:04   #4
xsatellitex
Member
 
L'Avatar di xsatellitex
 
Iscritto dal: Dec 2007
Messaggi: 190
malloc restituisce un puntatore *void

Codice:
#include <stdio.h>

main(){
struct nodo
{
    int DATO;
	struct nodo *DX; //PUNTATORE AL SOTTOALBERO DESTRO
	struct nodo *SX; //PUNTATORE AL SOTTOALBERO SINISTRO
}NODO;

typedef struct nodo* tree;

tree InserimentoDiUnElemento(tree T, int e)
{
    if(T==NULL)
    {
        tree new=NULL;
        new=(void *)malloc(sizeof(tree));
        new->DATO=e;
        new->SX=NULL;
        new->DX=NULL;
    }

    if(T->DATO==e)
    {
        printf("    ERRORE  \n");
        return NULL;
    }

    if(T->DATO>e)
    {
        InserimentoDiUnElemento(T->SX,e);
    }else
    {
        InserimentoDiUnElemento(T->DX,e);
    }
}
}

Ultima modifica di xsatellitex : 02-05-2008 alle 10:40.
xsatellitex è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 10:33   #5
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
come a char????
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 10:36   #6
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
comq sbagliavo ad utilizzare la parola new che nel c non si può usare, però se metto char nella malloc da errore lo stesso
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 10:41   #7
xsatellitex
Member
 
L'Avatar di xsatellitex
 
Iscritto dal: Dec 2007
Messaggi: 190
scusami volevo dire void ... ho corretto sopra
xsatellitex è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 10:44   #8
xsatellitex
Member
 
L'Avatar di xsatellitex
 
Iscritto dal: Dec 2007
Messaggi: 190
in C la keyword new non esiste... è come una qualsiasi altra parola...
tu la stai utilizzando come puntatore quindi va bene
xsatellitex è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 10:49   #9
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
mi da quest'altro errore ora
error: void value not ignored as it ought to be



Codice HTML:
tree InserimentoDiUnElemento(tree T, int e)
{
    if(T==NULL)
    {
        tree nuo=NULL;
        nuo=(void)malloc(sizeof(tree));
        nuo->DATO=e;
        nuo->SX=NULL;
        nuo->DX=NULL;
    }

    if(T->DATO==e)
    {
        printf("    ERRORE  \n");
        return NULL;
    }

    if(T->DATO>e)
    {
        InserimentoDiUnElemento(T->SX,e);
    }else
    {
        InserimentoDiUnElemento(T->DX,e);
    }
}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 10:52   #10
xsatellitex
Member
 
L'Avatar di xsatellitex
 
Iscritto dal: Dec 2007
Messaggi: 190
devi mettere l'asterisco dopo void come ho scritto sopra...
malloc ritorna un puntatore all'area di memoria allocata...
il puntatore restituito è di tipo void..

xsatellitex è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 11:08   #11
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
niente, non va..puoi trovarmi tu l'errore? ti incollo tutto il file magari sbaglio in qualche altro punto..la zona che mi interessa sta in basso, senza che leggi tutte le funzioni

Codice HTML:
#include <iostream>
#include <stdlib.h>

using namespace std;

struct nodo
{
    int DATO;
	struct nodo *DX; //PUNTATORE AL SOTTOALBERO DESTRO
	struct nodo *SX; //PUNTATORE AL SOTTOALBERO SINISTRO
}NODO;

typedef struct nodo* tree;

bool Is_Empty(tree RADICE)
//RESTITUISCE TRUE SE L'ALBERO E' VUOTO, ALTRIMENTI RESTITUISCE FALSE
{
	return(RADICE==NULL);
}

tree Albero_Vuoto(void)
//COSTRUISCE UN ALBERO VUOTO
{
	return NULL;
}

int Valore_Etichetta(tree RADICE)
//RESTITUISCE IL VALORE (O ETICHETTA) DEL NODO
{
	if (Is_Empty(RADICE)) abort();
	else return(RADICE->DATO);
}

tree Sinistro(tree RADICE)
//RESTITUISCE IL PUNTATORE AL SOTTOALBERO SINISTRO
{
	if (Is_Empty(RADICE)) return NULL;
	else return(RADICE->SX);
}

tree Destro(tree RADICE)
//RESTITUISCE IL PUNTATORE AL SOTTOALBERO DESTRO
{
	if (Is_Empty(RADICE)) return(NULL);
	else return(RADICE->DX);
}

tree Costruisci_Albero(int ETICHETTA,tree S,tree D)
//COSTRUISCE UN ALBERO BINARIO NON ORDINATO
{
	tree RADICE;
	RADICE = (nodo *) malloc(sizeof(NODO));
	RADICE->DATO = ETICHETTA;
	RADICE->SX = S;
	RADICE->DX = D;
	return (RADICE);
}

void Inorder(tree RADICE)
//STAMPA INORDER DELL'ALBERO
{
	if (!(Is_Empty(RADICE))) {
		Inorder(Sinistro(RADICE));
		cout<<Valore_Etichetta(RADICE)<<"  ";
		Inorder(Destro(RADICE));
		}
}


void Preorder(tree RADICE)
//STAMPA PREORDER DELL'ALBERO
{
	if (!(Is_Empty(RADICE))) {
		cout<<Valore_Etichetta(RADICE)<<"  ";
		Preorder(Sinistro(RADICE));
		Preorder(Destro(RADICE));
		}
}


void Postorder(tree RADICE)
//STAMPA POSTORDER DELL'ALBERO
{
	if (!(Is_Empty(RADICE))) {
		Postorder(Sinistro(RADICE));
		Postorder(Destro(RADICE));
		cout<<Valore_Etichetta(RADICE)<<"  ";
		}
}


int ContaNodi(tree RADICE)
//RESTITUISCE IL NUMERO DEI NODI DELL'ALBERO
{
	if(Is_Empty(RADICE)) return 0;
	else return(1 + ContaNodi(Sinistro(RADICE)) + ContaNodi(Destro(RADICE)));
}

int ContaFoglie(tree RADICE)
//RESTITUISCE IL NUMERO DELLE FOGLIE DELL'ALBERO
{
	if(Is_Empty(RADICE))
		return(0);
	else {
		if ((Sinistro(RADICE)==NULL) && (Destro(RADICE)==NULL))
			return(1);
		else return( ContaFoglie(Sinistro(RADICE)) + ContaFoglie(Destro(RADICE)) );
	}
}

bool Perf_Bil(tree RADICE)
//Restituisce TRUE se l'albero è perfettamente bilanciato
{
	if (Is_Empty(RADICE)) return(true);	//Oppure ERROR, secondo la definizione
	else {
		if ((Sinistro(RADICE)==NULL) && (Destro(RADICE)==NULL))	//Praticamente: se il nodo è una foglia..
			return(true);
		else {
			if ((Sinistro(RADICE)!=NULL) && (Destro(RADICE)!=NULL))	//Se il nodo ha tutti e due i figli..
				return( Perf_Bil(Sinistro(RADICE)) && Perf_Bil(Destro(RADICE)) );
			else return(false);
		}
	}
}


bool Ricerca(tree RADICE,int X)
//RICERCA UN VALORE X IN UN ALBERO PUNTATO DA RADICE
{
	if (Is_Empty(RADICE))
		return(false);
	else {
		if (X==Valore_Etichetta(RADICE))
			return(true);
		else
			return(Ricerca(Sinistro(RADICE),X) || Ricerca(Destro(RADICE),X));
	}
}


int Altezza_Nodo(tree N)	//Restituisce l'altezza di un nodo (vedere definizione di altezza)
{
  int ALTD=0,ALTS=0;
	if (Is_Empty(N)) return(-1);
	else {
		ALTS=Altezza_Nodo(Sinistro(N));
		ALTD=Altezza_Nodo(Destro(N));
		if (ALTS>ALTD) return(ALTS+1);
		else return(ALTD+1);
	}
}

tree Ins_Ord(int E,tree RADICE)
//Costruisce un albero binario di ricerca (un albero "ordinato")
{
	if (Is_Empty(RADICE)) {
		RADICE=(tree)malloc(sizeof(NODO)); //chiede l'indirizzo di una cella di memoria libera
		RADICE->DATO=E;
		RADICE->SX=NULL;
		RADICE->DX=NULL;
		return RADICE;
	}
	else {
		if(E<Valore_Etichetta(RADICE)) {
			RADICE->SX=Ins_Ord(E,Sinistro(RADICE));
			return RADICE;
		}
		else {
			RADICE->DX=Ins_Ord(E,Destro(RADICE));
			return RADICE;
		}
	}
}


bool RicercaBinaria(int X,tree RADICE)
//Ricerca dicotomica (o binaria) per alberi binari di ricerca (ordinati)
{
	if (Is_Empty(RADICE)) return(false);
	else {
		if (X==Valore_Etichetta(RADICE)) return(true);
		else {
			if (X < Valore_Etichetta(RADICE))
				return( RicercaBinaria(X,Sinistro(RADICE)) );
			else
				return( RicercaBinaria(X,Destro(RADICE)) );
		}
	}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////

tree InserimentoDiUnElemento(tree T, int e)
{
    if(T==NULL)
    {
        tree nuo=NULL;
        nuo=(void*)malloc(sizeof(tree));
        nuo->DATO=e;
        nuo->SX=NULL;
        nuo->DX=NULL;
    }

    if(T->DATO==e)
    {
        printf("    ERRORE  \n");
        return NULL;
    }

    if(T->DATO>e)
    {
        InserimentoDiUnElemento(T->SX,e);
    }else
    {
        InserimentoDiUnElemento(T->DX,e);
    }
}

int main(void)
{
    tree t1,t2,t3,t4,t5,t6,t7;

    t4=Costruisci_Albero(3,Albero_Vuoto(),Albero_Vuoto());
    t5=Costruisci_Albero(6,Albero_Vuoto(),Albero_Vuoto());
    t6=Costruisci_Albero(22,Albero_Vuoto(),Albero_Vuoto());
    t7=Costruisci_Albero(26,Albero_Vuoto(),Albero_Vuoto());
    t2=Costruisci_Albero(5,t4,t5);
    t3=Costruisci_Albero(24,t6,t7);
    t1=Costruisci_Albero(10,t2,t3);

    t1=InserimentoDiUnElemento(t1,7);
    Inorder(t1);




}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 11:32   #12
xsatellitex
Member
 
L'Avatar di xsatellitex
 
Iscritto dal: Dec 2007
Messaggi: 190
hai dimenticato di nuovo il void in costruisci albero...
che errore ti da?
xsatellitex è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 11:39   #13
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
error: invalid conversion from `void*' to `nodo*'

comq penso che l'errore sia solo nella funzione InserimentoDiUnElemento, perchè tutto il resto funziona, gia ho provato...
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 11:46   #14
xsatellitex
Member
 
L'Avatar di xsatellitex
 
Iscritto dal: Dec 2007
Messaggi: 190
main()
tree Albero_Vuoto()

al posto di

int main(void)
tree Albero_Vuoto(void)


fammi sapere
p.s. inserimentodiunelemento io ho compilato quello che ti ho scritto prima e va!

Ultima modifica di xsatellitex : 02-05-2008 alle 11:51.
xsatellitex è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 12:07   #15
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
non va, ma com'è possibile...
mi mandi quello che a te compila?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 12:12   #16
xsatellitex
Member
 
L'Avatar di xsatellitex
 
Iscritto dal: Dec 2007
Messaggi: 190
quello che a me compila l ho scritto sopra.

ti da ancora errore col void? ti dice anche a che riga ?
xsatellitex è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 12:14   #17
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
si errore con void, riga 198, io devo scappare a pranzo torno dopo, se scopri qualcosa lascia un messaggio comq, grazie


Codice HTML:
#include <iostream>
#include <stdlib.h>

using namespace std;

struct nodo
{
    int DATO;
	struct nodo *DX; //PUNTATORE AL SOTTOALBERO DESTRO
	struct nodo *SX; //PUNTATORE AL SOTTOALBERO SINISTRO
}NODO;

typedef struct nodo* tree;

bool Is_Empty(tree RADICE)
//RESTITUISCE TRUE SE L'ALBERO E' VUOTO, ALTRIMENTI RESTITUISCE FALSE
{
	return(RADICE==NULL);
}

tree Albero_Vuoto(void)
//COSTRUISCE UN ALBERO VUOTO
{
	return NULL;
}

int Valore_Etichetta(tree RADICE)
//RESTITUISCE IL VALORE (O ETICHETTA) DEL NODO
{
	if (Is_Empty(RADICE)) abort();
	else return(RADICE->DATO);
}

tree Sinistro(tree RADICE)
//RESTITUISCE IL PUNTATORE AL SOTTOALBERO SINISTRO
{
	if (Is_Empty(RADICE)) return NULL;
	else return(RADICE->SX);
}

tree Destro(tree RADICE)
//RESTITUISCE IL PUNTATORE AL SOTTOALBERO DESTRO
{
	if (Is_Empty(RADICE)) return(NULL);
	else return(RADICE->DX);
}

tree Costruisci_Albero(int ETICHETTA,tree S,tree D)
//COSTRUISCE UN ALBERO BINARIO NON ORDINATO
{
	tree RADICE;
	RADICE = (nodo *) malloc(sizeof(NODO));
	RADICE->DATO = ETICHETTA;
	RADICE->SX = S;
	RADICE->DX = D;
	return (RADICE);
}

void Inorder(tree RADICE)
//STAMPA INORDER DELL'ALBERO
{
	if (!(Is_Empty(RADICE))) {
		Inorder(Sinistro(RADICE));
		cout<<Valore_Etichetta(RADICE)<<"  ";
		Inorder(Destro(RADICE));
		}
}


void Preorder(tree RADICE)
//STAMPA PREORDER DELL'ALBERO
{
	if (!(Is_Empty(RADICE))) {
		cout<<Valore_Etichetta(RADICE)<<"  ";
		Preorder(Sinistro(RADICE));
		Preorder(Destro(RADICE));
		}
}


void Postorder(tree RADICE)
//STAMPA POSTORDER DELL'ALBERO
{
	if (!(Is_Empty(RADICE))) {
		Postorder(Sinistro(RADICE));
		Postorder(Destro(RADICE));
		cout<<Valore_Etichetta(RADICE)<<"  ";
		}
}


int ContaNodi(tree RADICE)
//RESTITUISCE IL NUMERO DEI NODI DELL'ALBERO
{
	if(Is_Empty(RADICE)) return 0;
	else return(1 + ContaNodi(Sinistro(RADICE)) + ContaNodi(Destro(RADICE)));
}

int ContaFoglie(tree RADICE)
//RESTITUISCE IL NUMERO DELLE FOGLIE DELL'ALBERO
{
	if(Is_Empty(RADICE))
		return(0);
	else {
		if ((Sinistro(RADICE)==NULL) && (Destro(RADICE)==NULL))
			return(1);
		else return( ContaFoglie(Sinistro(RADICE)) + ContaFoglie(Destro(RADICE)) );
	}
}

bool Perf_Bil(tree RADICE)
//Restituisce TRUE se l'albero è perfettamente bilanciato
{
	if (Is_Empty(RADICE)) return(true);	//Oppure ERROR, secondo la definizione
	else {
		if ((Sinistro(RADICE)==NULL) && (Destro(RADICE)==NULL))	//Praticamente: se il nodo è una foglia..
			return(true);
		else {
			if ((Sinistro(RADICE)!=NULL) && (Destro(RADICE)!=NULL))	//Se il nodo ha tutti e due i figli..
				return( Perf_Bil(Sinistro(RADICE)) && Perf_Bil(Destro(RADICE)) );
			else return(false);
		}
	}
}


bool Ricerca(tree RADICE,int X)
//RICERCA UN VALORE X IN UN ALBERO PUNTATO DA RADICE
{
	if (Is_Empty(RADICE))
		return(false);
	else {
		if (X==Valore_Etichetta(RADICE))
			return(true);
		else
			return(Ricerca(Sinistro(RADICE),X) || Ricerca(Destro(RADICE),X));
	}
}


int Altezza_Nodo(tree N)	//Restituisce l'altezza di un nodo (vedere definizione di altezza)
{
  int ALTD=0,ALTS=0;
	if (Is_Empty(N)) return(-1);
	else {
		ALTS=Altezza_Nodo(Sinistro(N));
		ALTD=Altezza_Nodo(Destro(N));
		if (ALTS>ALTD) return(ALTS+1);
		else return(ALTD+1);
	}
}

tree Ins_Ord(int E,tree RADICE)
//Costruisce un albero binario di ricerca (un albero "ordinato")
{
	if (Is_Empty(RADICE)) {
		RADICE=(tree)malloc(sizeof(NODO)); //chiede l'indirizzo di una cella di memoria libera
		RADICE->DATO=E;
		RADICE->SX=NULL;
		RADICE->DX=NULL;
		return RADICE;
	}
	else {
		if(E<Valore_Etichetta(RADICE)) {
			RADICE->SX=Ins_Ord(E,Sinistro(RADICE));
			return RADICE;
		}
		else {
			RADICE->DX=Ins_Ord(E,Destro(RADICE));
			return RADICE;
		}
	}
}


bool RicercaBinaria(int X,tree RADICE)
//Ricerca dicotomica (o binaria) per alberi binari di ricerca (ordinati)
{
	if (Is_Empty(RADICE)) return(false);
	else {
		if (X==Valore_Etichetta(RADICE)) return(true);
		else {
			if (X < Valore_Etichetta(RADICE))
				return( RicercaBinaria(X,Sinistro(RADICE)) );
			else
				return( RicercaBinaria(X,Destro(RADICE)) );
		}
	}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////

tree InserimentoDiUnElemento(tree T, int e)
{
    if(T==NULL)
    {
        tree nuo=NULL;
        nuo=(void*)malloc(sizeof(tree));
        nuo->DATO=e;
        nuo->SX=NULL;
        nuo->DX=NULL;
    }

    if(T->DATO==e)
    {
        printf("    ERRORE  \n");
        return NULL;
    }

    if(T->DATO>e)
    {
        InserimentoDiUnElemento(T->SX,e);
    }else
    {
        InserimentoDiUnElemento(T->DX,e);
    }
}

int main()
{
    tree t1,t2,t3,t4,t5,t6,t7;

    t4=Costruisci_Albero(3,Albero_Vuoto(),Albero_Vuoto());
    t5=Costruisci_Albero(6,Albero_Vuoto(),Albero_Vuoto());
    t6=Costruisci_Albero(22,Albero_Vuoto(),Albero_Vuoto());
    t7=Costruisci_Albero(26,Albero_Vuoto(),Albero_Vuoto());
    t2=Costruisci_Albero(5,t4,t5);
    t3=Costruisci_Albero(24,t6,t7);
    t1=Costruisci_Albero(10,t2,t3);

    t1=InserimentoDiUnElemento(t1,7);
    Inorder(t1);




}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 13:08   #18
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2795
Provo a dare la soluzione
Ogni volta che fai la malloc quello che allochi è un nodo, giusto? Quindi alla sizeof dovresti passargli NODO. Con tree non dovrebbe funzionare (o meglio non dovrebbe fare quello che vuoi tu) perché tree non è di tipo NODO ma di tipo puntatore a NODO.
Inoltre la malloc ti restituisce un puntatore a void, quindi devi fare un casting al tipo desiderato, in questo caso un puntatore a nodo, quindi tree, o se preferisci *NODO.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 13:12   #19
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ho corretto come dici tu però quando compilo mi da il classico errore "non inviare..." puoi provarlo un attimo tu?

Codice HTML:
#include <iostream>
#include <stdlib.h>

using namespace std;

struct nodo
{
    int DATO;
	struct nodo *DX; //PUNTATORE AL SOTTOALBERO DESTRO
	struct nodo *SX; //PUNTATORE AL SOTTOALBERO SINISTRO
}NODO;

typedef struct nodo* tree;

bool Is_Empty(tree RADICE)
//RESTITUISCE TRUE SE L'ALBERO E' VUOTO, ALTRIMENTI RESTITUISCE FALSE
{
	return(RADICE==NULL);
}

tree Albero_Vuoto(void)
//COSTRUISCE UN ALBERO VUOTO
{
	return NULL;
}

int Valore_Etichetta(tree RADICE)
//RESTITUISCE IL VALORE (O ETICHETTA) DEL NODO
{
	if (Is_Empty(RADICE)) abort();
	else return(RADICE->DATO);
}

tree Sinistro(tree RADICE)
//RESTITUISCE IL PUNTATORE AL SOTTOALBERO SINISTRO
{
	if (Is_Empty(RADICE)) return NULL;
	else return(RADICE->SX);
}

tree Destro(tree RADICE)
//RESTITUISCE IL PUNTATORE AL SOTTOALBERO DESTRO
{
	if (Is_Empty(RADICE)) return(NULL);
	else return(RADICE->DX);
}

tree Costruisci_Albero(int ETICHETTA,tree S,tree D)
//COSTRUISCE UN ALBERO BINARIO NON ORDINATO
{
	tree RADICE;
	RADICE = (nodo *) malloc(sizeof(NODO));
	RADICE->DATO = ETICHETTA;
	RADICE->SX = S;
	RADICE->DX = D;
	return (RADICE);
}

void Inorder(tree RADICE)
//STAMPA INORDER DELL'ALBERO
{
	if (!(Is_Empty(RADICE))) {
		Inorder(Sinistro(RADICE));
		cout<<Valore_Etichetta(RADICE)<<"  ";
		Inorder(Destro(RADICE));
		}
}


void Preorder(tree RADICE)
//STAMPA PREORDER DELL'ALBERO
{
	if (!(Is_Empty(RADICE))) {
		cout<<Valore_Etichetta(RADICE)<<"  ";
		Preorder(Sinistro(RADICE));
		Preorder(Destro(RADICE));
		}
}


void Postorder(tree RADICE)
//STAMPA POSTORDER DELL'ALBERO
{
	if (!(Is_Empty(RADICE))) {
		Postorder(Sinistro(RADICE));
		Postorder(Destro(RADICE));
		cout<<Valore_Etichetta(RADICE)<<"  ";
		}
}


int ContaNodi(tree RADICE)
//RESTITUISCE IL NUMERO DEI NODI DELL'ALBERO
{
	if(Is_Empty(RADICE)) return 0;
	else return(1 + ContaNodi(Sinistro(RADICE)) + ContaNodi(Destro(RADICE)));
}

int ContaFoglie(tree RADICE)
//RESTITUISCE IL NUMERO DELLE FOGLIE DELL'ALBERO
{
	if(Is_Empty(RADICE))
		return(0);
	else {
		if ((Sinistro(RADICE)==NULL) && (Destro(RADICE)==NULL))
			return(1);
		else return( ContaFoglie(Sinistro(RADICE)) + ContaFoglie(Destro(RADICE)) );
	}
}

bool Perf_Bil(tree RADICE)
//Restituisce TRUE se l'albero è perfettamente bilanciato
{
	if (Is_Empty(RADICE)) return(true);	//Oppure ERROR, secondo la definizione
	else {
		if ((Sinistro(RADICE)==NULL) && (Destro(RADICE)==NULL))	//Praticamente: se il nodo è una foglia..
			return(true);
		else {
			if ((Sinistro(RADICE)!=NULL) && (Destro(RADICE)!=NULL))	//Se il nodo ha tutti e due i figli..
				return( Perf_Bil(Sinistro(RADICE)) && Perf_Bil(Destro(RADICE)) );
			else return(false);
		}
	}
}


bool Ricerca(tree RADICE,int X)
//RICERCA UN VALORE X IN UN ALBERO PUNTATO DA RADICE
{
	if (Is_Empty(RADICE))
		return(false);
	else {
		if (X==Valore_Etichetta(RADICE))
			return(true);
		else
			return(Ricerca(Sinistro(RADICE),X) || Ricerca(Destro(RADICE),X));
	}
}


int Altezza_Nodo(tree N)	//Restituisce l'altezza di un nodo (vedere definizione di altezza)
{
  int ALTD=0,ALTS=0;
	if (Is_Empty(N)) return(-1);
	else {
		ALTS=Altezza_Nodo(Sinistro(N));
		ALTD=Altezza_Nodo(Destro(N));
		if (ALTS>ALTD) return(ALTS+1);
		else return(ALTD+1);
	}
}

tree Ins_Ord(int E,tree RADICE)
//Costruisce un albero binario di ricerca (un albero "ordinato")
{
	if (Is_Empty(RADICE)) {
		RADICE=(tree)malloc(sizeof(NODO)); //chiede l'indirizzo di una cella di memoria libera
		RADICE->DATO=E;
		RADICE->SX=NULL;
		RADICE->DX=NULL;
		return RADICE;
	}
	else {
		if(E<Valore_Etichetta(RADICE)) {
			RADICE->SX=Ins_Ord(E,Sinistro(RADICE));
			return RADICE;
		}
		else {
			RADICE->DX=Ins_Ord(E,Destro(RADICE));
			return RADICE;
		}
	}
}


bool RicercaBinaria(int X,tree RADICE)
//Ricerca dicotomica (o binaria) per alberi binari di ricerca (ordinati)
{
	if (Is_Empty(RADICE)) return(false);
	else {
		if (X==Valore_Etichetta(RADICE)) return(true);
		else {
			if (X < Valore_Etichetta(RADICE))
				return( RicercaBinaria(X,Sinistro(RADICE)) );
			else
				return( RicercaBinaria(X,Destro(RADICE)) );
		}
	}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////

tree InserimentoDiUnElemento(tree T, int e)
{
    if(T==NULL)
    {
        tree nuovo;
        nuovo=(tree)malloc(sizeof(NODO));
        nuovo->DATO=e;
        nuovo->SX=NULL;
        nuovo->DX=NULL;
    }

    if(T->DATO==e)
    {
        printf("    ERRORE  \n");
        return NULL;
    }

    if(T->DATO>e)
    {
        InserimentoDiUnElemento(T->SX,e);
    }else
    {
        InserimentoDiUnElemento(T->DX,e);
    }
}

int main()
{
    tree t1,t2,t3,t4,t5,t6,t7;

    t4=Costruisci_Albero(3,Albero_Vuoto(),Albero_Vuoto());
    t5=Costruisci_Albero(6,Albero_Vuoto(),Albero_Vuoto());
    t6=Costruisci_Albero(22,Albero_Vuoto(),Albero_Vuoto());
    t7=Costruisci_Albero(26,Albero_Vuoto(),Albero_Vuoto());
    t2=Costruisci_Albero(5,t4,t5);
    t3=Costruisci_Albero(24,t6,t7);
    t1=Costruisci_Albero(10,t2,t3);

    t1=InserimentoDiUnElemento(t1,7);
    Inorder(t1);

}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 02-05-2008, 14:52   #20
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2795
Codice:
void InserimentoDiUnElemento(tree T, int e)
{
    if(T==NULL)
    {
        tree nuovo;
        nuovo=(tree)malloc(sizeof(NODO));
        nuovo->DATO=e;
        nuovo->SX=NULL;
        nuovo->DX=NULL;
    }
    //Ho creato una catena di else if
    else if(T->DATO==e)
    {
        printf("    ERRORE  \n");
        //Ho tolto il return
    }

    else if(T->DATO>e)
    {
        InserimentoDiUnElemento(T->SX,e);
    }else
    {
        InserimentoDiUnElemento(T->DX,e);
    }
}

int main()
{
    tree t1,t2,t3,t4,t5,t6,t7;

    t4=Costruisci_Albero(3,Albero_Vuoto(),Albero_Vuoto());
    t5=Costruisci_Albero(6,Albero_Vuoto(),Albero_Vuoto());
    t6=Costruisci_Albero(22,Albero_Vuoto(),Albero_Vuoto());
    t7=Costruisci_Albero(26,Albero_Vuoto(),Albero_Vuoto());
    t2=Costruisci_Albero(5,t4,t5);
    t3=Costruisci_Albero(24,t6,t7);
    t1=Costruisci_Albero(10,t2,t3);

    /*Ho tolto l'assegnamento*/InserimentoDiUnElemento(t1,7);
    Inorder(t1);
    system("pause");
}
Comunque stai mischiando C con C++, iostream è una libreria C++
wingman87 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


AMD EPYC Venice: dentro Zen 6, i SoC a 256 core e la sfida al costo della memoria AMD EPYC Venice: dentro Zen 6, i SoC a 256 core ...
HONOR Pad X9 Max recensione, schermo ultra large a meno di 400 euro HONOR Pad X9 Max recensione, schermo ultra large...
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
GTA 6 su Xbox Cloud Gaming: niente strea...
NZXT presenta i nuovi H7 e H5, arrivano ...
Apple prepara un'app per trasformare i M...
C'è ancora vita per il Tesla Cybe...
Black Friday in anticipo e offerte a tem...
Mac mini M6 a 899€, Mac Studio M5 Max co...
Steam svela gli FPS dei giochi su Deck (...
Non solo Siri: l'intelligenza artificial...
La nuova mossa di Instagram: i filtri de...
RTX 5080 da 3.000 dollari e niente versi...
Amazon taglia i prezzi dei nuovi POCO: X...
Claude ora partecipa alle riunioni e pre...
Android Auto: addio ad Android 9 e 10, o...
Reddit lancia Reddit Reviews: recensioni...
NVIDIA dice di aver progettato Vera per ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:26.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v