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 >
C/C++ Source or Header  |  2000-09-20  |  3KB  |  141 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX 30
  5.  
  6. /* TIPI */
  7.  
  8. typedef struct nodo *tree;
  9. struct nodo
  10. {
  11.     tree dx;
  12.     tree sx;
  13.     int info;
  14. };
  15.  
  16.  
  17. /* PROTOTIPI */
  18.  
  19. tree empty(void);
  20. void insert( int, tree *);
  21. void print(tree);
  22. void even(tree *,tree *,tree *);
  23. void insert2(tree,tree *);
  24. void even_odd(tree,tree *,tree *);
  25.  
  26. /* FUNZIONI */
  27.  
  28. tree empty()
  29. {
  30.     return NULL;
  31. }
  32.  
  33. void insert(int i,tree *t)
  34. {
  35.     if(i>=0)
  36.     {
  37.     
  38.     if((*t)==empty())
  39.     {
  40.         (*t)=(tree)malloc(sizeof(struct nodo));
  41.         (*t)->info=i;
  42.         (*t)->sx=empty();
  43.         (*t)->dx=empty();
  44.     }
  45.     else 
  46.      if(i<(*t)->info)
  47.         insert(i,&((*t)->sx));
  48.      else if(i>(*t)->info)
  49.         insert(i,&((*t)->dx));
  50. }
  51. }
  52.  
  53.  
  54. void insert2(tree t,tree *t1) /* rispetto alla insert, non prende un intero ma un albero, la cui radice rappresenta */
  55.                              /*    il nuovo nodo da inserire in *t1 */   
  56. {
  57.     if(*t1!=NULL)
  58.     {
  59.     if(t->info<(*t1)->info)
  60.       insert2(t,&((*t1)->sx));
  61.     else if(t->info>(*t1)->info)
  62.        insert2(t,&((*t1)->dx));
  63.     }
  64.     if((*t1)==NULL)
  65.     {
  66.         (*t1)=t;
  67.         (*t1)->dx=NULL;          /* i sottoalberi sono gia' stati considerati dalla even_odd */
  68.                                   /*  quindi annullo i puntatori per ottenere un albero benformato */                   
  69.         (*t1)->sx=NULL;
  70.     }
  71.     
  72.  
  73. }
  74.  
  75. void even_odd(tree t,tree *t1,tree *t2)
  76.  
  77. {
  78.     if(t!=NULL)
  79.     {
  80.             even_odd(t->sx,t1,t2);  /* sistemo prima tutti i discendenti del nodo considerato */
  81.             even_odd(t->dx,t1,t2);
  82.             if((t->info)%2==0)
  83.                 insert2(t,t1);
  84.             else if((t->info)%2)
  85.                 insert2(t,t2);    
  86.     }
  87.     
  88.     
  89.  
  90.     
  91.     
  92. }
  93. void even(tree *t,tree *t1,tree *t2)
  94. {
  95.     *t1 = empty();
  96.     *t2 = empty();
  97.     even_odd(*t,t1,t2);
  98.     *t=empty();
  99. }
  100.  
  101. void print(tree t)
  102. {
  103.     if(t!=empty())
  104.     {
  105.         print(t->sx);
  106.         printf("%d  ",t->info);
  107.         print(t->dx);
  108.  
  109.     }
  110. }
  111.  
  112. /* MAIN */
  113.  
  114. void main()
  115. {
  116.     char nome[MAX];
  117.     tree t,t1,t2;
  118.     int i;
  119.     FILE *fd=NULL;
  120.     t=empty();
  121.     
  122.     printf("Dammi il nome del file:\n");
  123.     scanf("%s",nome);
  124.  
  125.     if(fd=fopen(nome,"r"))
  126.     {
  127.         while(fscanf(fd,"%d",&i) && i!=-1)
  128.             insert(i,&t);
  129.         even(&t,&t1,&t2);
  130.         printf("\n\nEcco l'albero contenente i numeri pari: \n");
  131.         print(t1);
  132.         printf("\n\nEcco l'albero contenente i numeri dispari: \n");
  133.         print(t2);
  134.         printf("\n\nEcco l'albero di partenza: \n");
  135.         print(t);
  136.         fclose(fd);
  137.     }
  138.     else
  139.         printf("Errore di apertura del file");
  140. }
  141.