Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
Con Midnight, Blizzard tenta il colpaccio: il player housing sbarca finalmente su Azeroth insieme a una Quel'Thalas ricostruita da zero. Tra il dramma della famiglia Ventolesto e il nuovo Prey System, ecco com'è la nuova espansione di World of Warcraft
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


ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Italia sotto assedio: il settore governa...
Microsoft fa marcia indietro sull'IA: Co...
Windows 11 24H2 e 25H2: bug negli update...
Mac OS X Cheetah gira su Nintendo Wii gr...
Tineco Floor One S9 Artist Steam Pro: la...
Metal Gear Solid, Sony rilancia il film ...
Il robot umanoide Unitree R1 si pu&ograv...
La Francia scarica Windows: Linux divent...
L'Electronic Froniter Foundation via da ...
Death Stranding 2 diventa Steam Deck Ver...
TSMC spinge i chip per smartphone verso ...
OpenAI prepara un modello per la cybersi...
Il CMF Phone 3 Pro sta arrivando: tra le...
Le migliori offerte Amazon di oggi: robo...
Altro che ridimensionamento: OnePlus sta...
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: 12:33.


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