Fatto:
Codice:
struct list {
int info;
struct list *next;
};
typedef struct list lista;
struct alb {
int info;
struct alb *sx;
struct alb *dx;
};
typedef struct alb albero;
struct list_alb {
albero *corrente;
int visitato;
int alt;
struct list_alb *sx;
struct list_alb *dx;
struct list_alb *prev;
};
typedef struct list_alb lista_alb;
/*ritorna 1 se č minore, 0 altrimenti*/
int confronta(albero *a, lista *l)
{
int lun_lista = 1;
int lun_albero = 1;
lista_alb *la;
lista_alb *cur;
lista_alb *tmp;
if(!a && l) return 1;
if(a && !l) return 0;
while(l->next)
{
l = l->next;
lun_lista++;
}
cur = la = (lista_alb *)malloc(sizeof(lista_alb));
cur->prev = cur->dx = cur->sx = NULL;
cur->corrente = a;
cur->alt = 1;
cur->visitato = 0;
do {
if((!cur->corrente->dx && !cur->corrente->sx) || cur->visitato == 2)
{
cur->visitato = 2;
if(cur->alt > lun_albero)
lun_albero = cur->alt;
if(cur->prev)
{
tmp = cur;
cur = cur->prev;
cur->visitato++;
free(tmp);
}
continue;
}
switch(cur->visitato)
{
case 0:
if(cur->corrente->sx)
{
tmp = (lista_alb *)malloc(sizeof(lista_alb));
tmp->alt = cur->alt + 1;
tmp->visitato = 0;
tmp->prev = cur;
tmp->corrente = cur->corrente->sx;
tmp->sx = tmp->dx = NULL;
cur->sx = tmp;
}
if(cur->corrente->dx)
{
tmp = (lista_alb *)malloc(sizeof(lista_alb));
tmp->alt = cur->alt + 1;
tmp->visitato = 0;
tmp->prev = cur;
tmp->corrente = cur->corrente->dx;
tmp->sx = tmp->dx = NULL;
cur->dx = tmp;
}
if(!cur->corrente->dx)
{
cur->visitato++;
cur = cur->sx;
}
else
cur = cur->dx;
break;
case 1:
if(cur->sx) cur = cur->sx;
else cur->visitato++;
break;
}
} while(la->visitato < 2);
free(la);
return (lun_albero < lun_lista) ? 1 : 0;
}