TorpedoBlu
14-04-2006, 15:03
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:
/***************************
* 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));
}
ecco il 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));
}