Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-04-2006, 14:03   #1
TorpedoBlu
Senior Member
 
L'Avatar di TorpedoBlu
 
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
C Albero binario con chiave stringa...come?

ciao ragazzi, ho trovato il codice per l'albero binario in cui la chiave è un Int, sembra banale ma come faccio a modificare le funzioni in modo che tutto funzioni con chiave stringa (con ordine lessicografico)?

ecco il codice:

Codice:
/***************************
*        searchtree.h      *
***************************/

#include <stdio.h>
#include <stdlib.h>

typedef int key;

struct searchtree {
	key v;
	struct searchtree *left, *right, *up;
}; 

typedef struct searchtree searchtree;

searchtree *createsearchtree(void);

void inorder(searchtree *p, void (*op)(searchtree *));

searchtree *search(searchtree *p, key k);

searchtree *search2ndvers(searchtree *p, key k);

searchtree *search3rdvers(searchtree *p, key k);

searchtree *itsearch(searchtree *p, key k);

searchtree *treemin(searchtree *p);

searchtree *treemax(searchtree *p);

searchtree *treesucc(searchtree *q);

searchtree *treepred(searchtree *q);

searchtree *insert(searchtree *p, key k);

searchtree *delete(searchtree *p, searchtree *q);

void destroysearchtree(searchtree *p);

/* End of file searchtree.h */


/*****************************
*         searchtree.c       *
*****************************/

#include "searchtree.h"

searchtree *createsearchtree(void)
{
	return NULL;
}

void inorder(searchtree *p, void (*op)(searchtree *))
{
	if(p) {
        	inorder(p->left,op);
		(*op)(p);
        	inorder(p->right,op);
	}
}

searchtree *search(searchtree *p, key k)
{
	if(!p || k == p->v)
		return p;
	return search(k < p->v ? p->left : p->right, k);
}

searchtree *search2ndvers(searchtree *p, key k)
{
	if(!p || k == p->v)
		return p;
	return k < p->v ? search2ndvers(p->left,k) : search2ndvers(p->right,k);
}

searchtree *search3rdvers(searchtree *p, key k)
{
	if(!p || k == p->v)
		return p;
	if(k < p->v)
		return search3rdvers(p->left,k);
	else
		return search3rdvers(p->right,k);
}

searchtree *itsearch(searchtree *p, key k)
{
	while(p && k != p->v)
		p = k < p->v ? p->left : p->right;
	return p;
}

searchtree *treemin(searchtree *p)
{
	for(;p->left;p = p->left);
	return p;
}

searchtree *treemax(searchtree *p)
{
	for(;p->right;p = p->right);
	return p;
}

searchtree *treesucc(searchtree *q)
{
	searchtree *qq;

	if(q->right)
		return treemin(q->right);
	qq = q->up;	
	while(qq && q == qq->right) {
		q = qq;
		qq = qq->up;
	}
	return qq;
}

searchtree *treepred(searchtree *q)
{
	searchtree *qq;

	if(q->left)
		return treemax(q->left);
	qq = q->up;	
	while(qq && q == qq->left) {
		q = qq;
		qq = qq->up;
	}
	return qq;
}

searchtree *insert(searchtree *p, key k)
{
	searchtree *q = malloc(sizeof(searchtree));
	searchtree *r = p;
	searchtree *s = NULL;

	if(!q) { 
		fprintf(stderr,"Errore di allocazione\n");
        	exit(-1);
	}
	q->v = k;
	q->left = q->right = NULL;
	while(r) {
		s = r;
		r = k < r->v ? r->left : r->right;
	}
	q->up = s;
	if(!s)
		return q;
	if(k < s->v)
		s->left = q;
	else
		s->right = q;
	return p;
}

searchtree *delete(searchtree *p, searchtree *q)
{
	searchtree *r, *s, *t = NULL;

	if(!q->left || !q->right)
		r = q;
	else
		r = treesucc(q);
	s = r->left ? r->left : r->right;
	if(s)
		s->up = r->up;
	if(!r->up)
		t = s;
	else
		if(r == r->up->left)
			r->up->left = s;
		else
			r->up->right = s;
	if(r != q)
		q->v = r->v;
	free(r);
	return t ? t : (p != r ? p : NULL);
}

void destroysearchtree(searchtree *p)
{
	while(p = delete(p,p));
}
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85
TorpedoBlu è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2006, 14:14   #2
TorpedoBlu
Senior Member
 
L'Avatar di TorpedoBlu
 
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
io ci ho provato, ma non va, ho usato al posto di < e > la funzione strcmp()

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 


typedef char key;

struct searchtree {
	key *v;
	struct searchtree *left, *right, *up;
}; 

typedef struct searchtree searchtree;

searchtree *createsearchtree(void);

void inorder(searchtree *p, void (*op)(searchtree *));

searchtree *search(searchtree *p, key *k);

searchtree *search2ndvers(searchtree *p, key *k);

searchtree *search3rdvers(searchtree *p, key *k);

searchtree *itsearch(searchtree *p, key *k);

searchtree *treemin(searchtree *p);

searchtree *treemax(searchtree *p);

searchtree *treesucc(searchtree *q);

searchtree *treepred(searchtree *q);

searchtree *insert(searchtree *p, key *k);

searchtree *delete(searchtree *p, searchtree *q);

void destroysearchtree(searchtree *p);






searchtree *createsearchtree(void)
{
	return NULL;
}

void inorder(searchtree *p, void (*op)(searchtree *))
{
	if(p) {
        	inorder(p->left,op);
		(*op)(p);
        	inorder(p->right,op);
	}
}

searchtree *search(searchtree *p, key *k)
{
	if(!p || strcmp(k,p->v)==0)
		return p;
	return search(strcmp(k, p->v)? p->left : p->right, k);
}


searchtree *treemin(searchtree *p)
{
	for(;p->left;p = p->left);
	return p;
}

searchtree *treemax(searchtree *p)
{
	for(;p->right;p = p->right);
	return p;
}

searchtree *treesucc(searchtree *q)
{
	searchtree *qq;

	if(q->right)
		return treemin(q->right);
	qq = q->up;	
	while(qq && q == qq->right) {
		q = qq;
		qq = qq->up;
	}
	return qq;
}

searchtree *treepred(searchtree *q)
{
	searchtree *qq;

	if(q->left)
		return treemax(q->left);
	qq = q->up;	
	while(qq && q == qq->left) {
		q = qq;
		qq = qq->up;
	}
	return qq;
}

searchtree *insert(searchtree *p, key *k)
{
	searchtree *q = malloc(sizeof(searchtree));
	searchtree *r = p;
	searchtree *s = NULL;

	if(!q) { 
		fprintf(stderr,"Errore di allocazione\n");
        	exit(-1);
	}
	q->v = k;
	q->left = q->right = NULL;
	while(r) {
		s = r;
		r = strcmp(k,r->v) ? r->left : r->right;
	}
	q->up = s;
	if(!s)
		return q;
	if(strcmp(k,s->v))
		s->left = q;
	else
		s->right = q;
	return p;
}

searchtree *delete(searchtree *p, searchtree *q)
{
	searchtree *r, *s, *t = NULL;

	if(!q->left || !q->right)
		r = q;
	else
		r = treesucc(q);
	s = r->left ? r->left : r->right;
	if(s)
		s->up = r->up;
	if(!r->up)
		t = s;
	else
		if(r == r->up->left)
			r->up->left = s;
		else
			r->up->right = s;
	if(r != q)
		q->v = r->v;
	free(r);
	return t ? t : (p != r ? p : NULL);
}

void destroysearchtree(searchtree *p)
{
	while(p = delete(p,p));
}



int main(void){
    searchtree *pippo;
    searchtree *A =createsearchtree();
/*inserisco e contestualmente controllo*/    
    if(insert(A, "pippo")) printf("inserito");
    else printf("errore");
/*cerco il nodo inserito*/    
    pippo=search(A,"pippo");
/*stampo il nome della chiave del nodo trovato*/
    printf("\n\n\n trovato: %s",pippo->v);
    return 0;
    }
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85
TorpedoBlu è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2006, 21:47   #3
mr_hyde
Senior Member
 
Iscritto dal: Oct 2005
Città: Genova
Messaggi: 937
Attento: strcmp restituisce
- un intero < 0
- oppure 0
- oppure un intero > 0

Quindi, la funzione

searchtree *search(searchtree *p, key *k)
{
if(!p || strcmp(k,p->v)==0)
return p;
return search(strcmp(k, p->v)? p->left : p->right, k);
}

_PROBABILMENTE_ dovrebbe essere qualcosa del tipo:

searchtree *search(searchtree *p, key *k)
{
if(!p || strcmp(k,p->v)==0)
return p;
return search((strcmp(k, p->v) < 0) ? p->left : p->right, k);
}

(infatti ricorda che:
- (numero diverso da zero) equivale a TRUE
- 0 equivale a FALSE

Quindi la tua search sarebbe sempre andata a sinistra (meno male che non siamo piu' in periodo elettorale :-) )

Ciao,
Mr Hyde
__________________
MacMini Late 2009/MacMini 2018
mr_hyde è offline   Rispondi citando il messaggio o parte di esso
Old 15-04-2006, 12:24   #4
TorpedoBlu
Senior Member
 
L'Avatar di TorpedoBlu
 
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
giusto! ho modificato sia search che insert e funziona! che cachiata!
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85
TorpedoBlu è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2006, 21:23   #5
TorpedoBlu
Senior Member
 
L'Avatar di TorpedoBlu
 
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
ecco siccome mi serve anche tenere i nodi ordinati in base alla X ho bisogno di una struttura di appoggio (una lista bidirezionale) ma come ordinare in base alla X?

io ho provato
Codice PHP:
#include "progetto.h"

/* crea una lista vuota e ne restituisce il puntatore radice */
intlist *createlist(void)
{
    
intlist *malloc(sizeof(intlist));

    if(!
q) {
        
fprintf(stderr,"Errore di allocazione nella creazione della lista\n");
        exit(-
1);
    };
    
q->next q->prev q;
    return 
q;
}




/* ritorna il numero di elementi nella lista */
int countlist(intlist *p)
{
    
int i;
    
intlist *q;
    
    if(!
|| == p->next)
        return 
0;
    for(
1p->nextq->next != pq->nexti++);
    return 
i;
}

/* inserisce un elemento in testa alla lista */
void insertL(intlist *pint elemsearchtree *nodo)
{
    
intlist *malloc(sizeof(intlist));

    if(!
q) {
        
fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
        exit(-
1);    
    };
    
q->dato elem;
    
q->nodo=nodo;
    
q->next p->next;
    
p->next->prev q;
    
p->next q;
    
q->prev p;
}


/* inserisce un elemento in ordine alla lista */
intlist *insertOrderL(intlist *pint elemsearchtree *nodo)
{
    
intlist *malloc(sizeof(intlist));
 
intlist *p;
    if(!
q) {
        
fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
        exit(-
1);    
    };
    
/*ATTENZIONE NON CICLA BENE NON FUNZIONA, CONTINUA A CICLARE!!!!*/
if(p!=NULL){
     while((
p->next)&&(p->next->dato>elem)){
   
p=p->next
   
printf(".");
   }
}
  
 
    
q->dato elem;
    
q->nodo nodo;
    
q->next p->next;
    
p->next->prev q;
    
p->next q;
    
q->prev p;
    
    return 
s;
}


/* inserisce un elemento in coda alla lista */
void insertatend(intlist *pint elemsearchtree *nodo)
{
    
intlist *malloc(sizeof(intlist));

    if(!
q) {
        
fprintf(stderr,"Errore nell'allocazione del nuovo elemento\n");
        exit(-
1);    
    };
    
q->dato elem;
    
q->nodo=nodo;
    
q->prev p->prev;
    
p->prev->next q;
    
p->prev q;
    
q->next p;
}


/* cancella l'elemento puntato da q dalla lista */
void deleteL(intlist *q)
{
    
q->prev->next q->next;
    
q->next->prev q->prev;
    
free(q);    
}

/* distrugge la lista */
void destroylist(intlist *p)
{
    while(
p->next != p)
        
deleteL(p->next);
    
free(p);

insertOrderL() dovrebbe inserire dopo aver percorso la lista e trovato la posizione giusta.. dite che è meglio implementare una funziona che ordina la lista separatamente? (in caso io modifichi la X di un nodo devo cambiare la sua posizione in lista quindi non mi basta inserirli in ordine)
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85

Ultima modifica di TorpedoBlu : 16-04-2006 alle 21:25.
TorpedoBlu è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2006, 10:25   #6
mr_hyde
Senior Member
 
Iscritto dal: Oct 2005
Città: Genova
Messaggi: 937
Scusa ma, vista la mia immensa ignoranza, visto che non conosco neppure un milionesimo di niente e visto che fatto non fui a viver come bruto ma per seguir virtute e canoscenza mi manca un'informazione basilare: cosa e' la X di un nodo?

Ciao,
Mr Hyde
__________________
MacMini Late 2009/MacMini 2018
mr_hyde è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2006, 08:38   #7
TorpedoBlu
Senior Member
 
L'Avatar di TorpedoBlu
 
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
Quote:
Originariamente inviato da mr_hyde
Scusa ma, vista la mia immensa ignoranza, visto che non conosco neppure un milionesimo di niente e visto che fatto non fui a viver come bruto ma per seguir virtute e canoscenza mi manca un'informazione basilare: cosa e' la X di un nodo?

Ciao,
Mr Hyde

è un intero che mi serve per ordinare i nodi in base alle ascisse.

ho usato un alberoper immagazzinare i dati in base al nome, ma devo avere ordinato anche in base alla x (avendo ogni nodo delle coordinate x,y ed un nome)
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85
TorpedoBlu è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
Il nuovo Snapdragon 8 Elite Gen 5 'for G...
2 Smart TV 4K in super offerta su Amazon...
AMD e Intel celebrano un anno di collabo...
NVIDIA consegna il suo mini supercompute...
La concorrenza cinese si fa sentire: il ...
4 accessori auto da non perdere su Amazo...
Era finito, eccolo ancora: torna il supe...
Game Pass: tutte le novità di nov...
Xiaomi 15T e 15T Pro con fotocamere by L...
3 portatili un super sconto: 355€ con 16...
Il nuovo iPhone pieghevole costerà...
MediaTek Dimensity 9500 sfida lo Snapdra...
Nuovo storico lancio per il razzo spazia...
Elgato Embrace: una sedia ergonomica pro...
Brad Pitt torna in pista: F1 – Il Film a...
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: 09:01.


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