home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
CataniaB
/
teach-act
/
testi-esami
/
labo-9.00
/
parte4.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-09-20
|
3KB
|
141 lines
#include <stdio.h>
#include <stdlib.h>
#define MAX 30
/* TIPI */
typedef struct nodo *tree;
struct nodo
{
tree dx;
tree sx;
int info;
};
/* PROTOTIPI */
tree empty(void);
void insert( int, tree *);
void print(tree);
void even(tree *,tree *,tree *);
void insert2(tree,tree *);
void even_odd(tree,tree *,tree *);
/* FUNZIONI */
tree empty()
{
return NULL;
}
void insert(int i,tree *t)
{
if(i>=0)
{
if((*t)==empty())
{
(*t)=(tree)malloc(sizeof(struct nodo));
(*t)->info=i;
(*t)->sx=empty();
(*t)->dx=empty();
}
else
if(i<(*t)->info)
insert(i,&((*t)->sx));
else if(i>(*t)->info)
insert(i,&((*t)->dx));
}
}
void insert2(tree t,tree *t1) /* rispetto alla insert, non prende un intero ma un albero, la cui radice rappresenta */
/* il nuovo nodo da inserire in *t1 */
{
if(*t1!=NULL)
{
if(t->info<(*t1)->info)
insert2(t,&((*t1)->sx));
else if(t->info>(*t1)->info)
insert2(t,&((*t1)->dx));
}
if((*t1)==NULL)
{
(*t1)=t;
(*t1)->dx=NULL; /* i sottoalberi sono gia' stati considerati dalla even_odd */
/* quindi annullo i puntatori per ottenere un albero benformato */
(*t1)->sx=NULL;
}
}
void even_odd(tree t,tree *t1,tree *t2)
{
if(t!=NULL)
{
even_odd(t->sx,t1,t2); /* sistemo prima tutti i discendenti del nodo considerato */
even_odd(t->dx,t1,t2);
if((t->info)%2==0)
insert2(t,t1);
else if((t->info)%2)
insert2(t,t2);
}
}
void even(tree *t,tree *t1,tree *t2)
{
*t1 = empty();
*t2 = empty();
even_odd(*t,t1,t2);
*t=empty();
}
void print(tree t)
{
if(t!=empty())
{
print(t->sx);
printf("%d ",t->info);
print(t->dx);
}
}
/* MAIN */
void main()
{
char nome[MAX];
tree t,t1,t2;
int i;
FILE *fd=NULL;
t=empty();
printf("Dammi il nome del file:\n");
scanf("%s",nome);
if(fd=fopen(nome,"r"))
{
while(fscanf(fd,"%d",&i) && i!=-1)
insert(i,&t);
even(&t,&t1,&t2);
printf("\n\nEcco l'albero contenente i numeri pari: \n");
print(t1);
printf("\n\nEcco l'albero contenente i numeri dispari: \n");
print(t2);
printf("\n\nEcco l'albero di partenza: \n");
print(t);
fclose(fd);
}
else
printf("Errore di apertura del file");
}