|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
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 |
![]() |
![]() |
![]() |
#2 |
Senior Member
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 |
![]() |
![]() |
![]() |
#3 |
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 |
![]() |
![]() |
![]() |
#4 |
Senior Member
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 |
![]() |
![]() |
![]() |
#5 |
Senior Member
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:
__________________
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. |
![]() |
![]() |
![]() |
#6 |
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 |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
Quote:
è 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 |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:01.