Advertisement
RiccardoMontagnin

Secondo compitino 2015

Jun 26th, 2015
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<iostream>
  2. #include<fstream>
  3. using namespace std;
  4.  
  5. /////////////////////////////////////////////////////////////////////////
  6. ///////////////////////////  FUNZIONI DATE  /////////////////////////////
  7. /////////////////////////////////////////////////////////////////////////
  8.  
  9. struct nodo{
  10.    
  11.     int info;
  12.     nodo* left, *right;
  13.    
  14.     nodo(int a=0, nodo* b=0, nodo*c=0){
  15.        
  16.         info=a;
  17.         left=b;
  18.         right=c;
  19.        
  20.     }
  21.    
  22. };
  23.  
  24. struct innesto{
  25.    
  26.     bool l, r;
  27.     nodo* N;
  28.     innesto* next;
  29.    
  30.     innesto(bool a=false, bool b=false, nodo* c=0, innesto* d=0){
  31.        
  32.         l=a;
  33.         r=b;
  34.         N=c;
  35.         next=d;
  36.        
  37.     }
  38.    
  39. };
  40.  
  41. void stampa_l(nodo *r, ofstream & OUT){
  42.  
  43.     if(r){
  44.      
  45.         OUT<<r->info<<'(';
  46.         stampa_l(r->left,OUT);
  47.         OUT<<',';
  48.         stampa_l(r->right,OUT);
  49.         OUT<<')';
  50.     }
  51.    
  52.     else{
  53.        
  54.         OUT<< '_';
  55.        
  56.     }
  57.    
  58. }
  59.  
  60. int conta_n(nodo*r){
  61.    
  62.     if(!r){
  63.        
  64.         return 0;
  65.        
  66.     }
  67.    
  68.     else{
  69.        
  70.         return conta_n(r->left)+conta_n(r->right)+1;
  71.        
  72.     }
  73.    
  74. }
  75.  
  76. nodo* insert(nodo*r, int y){
  77.    
  78.     if(!r){
  79.        
  80.         return new nodo(y);
  81.        
  82.     }
  83.    
  84.     if(conta_n(r->left)<=conta_n(r->right)){
  85.        
  86.         r->left=insert(r->left,y);
  87.        
  88.     }
  89.    
  90.     else{
  91.        
  92.         r->right=insert(r->right,y);
  93.        
  94.     }
  95.    
  96.     return r;
  97.    
  98. }
  99.  
  100. nodo* rep_ins(nodo*r, int dim, ifstream & INP){
  101.  
  102.     if(dim){
  103.    
  104.         int z;
  105.         INP>>z;
  106.         nodo*x=insert(r,z);
  107.         return rep_ins(x,dim-1,INP);
  108.        
  109.     }
  110.    
  111.     return r;
  112.    
  113. }
  114.  
  115. void stampa(innesto* a, ofstream & OUT){
  116.  
  117.     if(a){
  118.        
  119.         OUT<<"left="<<a->l<<" right="<<a->r<<" nodo="<<a->N->info<<endl;
  120.         stampa(a->next,OUT);
  121.        
  122.     }
  123.    
  124.     else{
  125.    
  126.         OUT<<endl;
  127.        
  128.     }
  129.  
  130. }
  131.  
  132.  
  133. /////////////////////////////////////////////////////////////////////////
  134. /////////////////////////  FUNZIONI CREATE  /////////////////////////////
  135. /////////////////////////////////////////////////////////////////////////
  136.  
  137. //PRE_fine=(lista è lista corretta)
  138. innesto* fine(innesto *lista){
  139.    
  140.     while(lista->next){         //Finchè esiste un nodo successivo
  141.    
  142.      /* R=(mi trovo al nodo lista e il nodo successivo esiste) */
  143.    
  144.         lista=lista->next;          //mi sposto
  145.     }
  146.    
  147.     return lista;               //Ritorno il puntatore all'ultimo nodo
  148.    
  149. }
  150. //POST_fine=(restituisce il puntatore all'ultimo nodo di tipo innesto della lista)
  151.  
  152.  
  153. //PRE=(albero(R) corretto) //// bool l, bool r, nodo N, next
  154. innesto* f0(nodo *R){
  155.    
  156.     if(!R){                         //Se l'albero è vuoto
  157.         return 0;                       //non potrò avere punti di innesto
  158.     }
  159.    
  160.     if(!R->left && !R->right){      //Se mancano entrambi i rami sinistro e destro
  161.         return new innesto(1, 1, R, 0);     //allora questo sarà un punto di innesto con l e r true
  162.     }
  163.    
  164.    
  165.     if(!R->left || !R->right){      //Se manca solo il ramo sinistro o solo quello destro
  166.    
  167.         innesto *lista;                 //Crea una lista
  168.  
  169.         if(R->left){                            //Se manca solo il ramo destro (e quindi è presente quello sinistro)
  170.             lista=f0(R->left);                      //crea una lista cercando nel ramo sinistro
  171.             lista->next = new innesto(0, 1, R, 0);  //completa la lista inserendo le info sul nodo attuale
  172.             return lista;                           //ritorna la lista
  173.         }
  174.        
  175.         if(R->right){                           //Se manca solo il ramo sinistro (e quindi è presente quello destro)
  176.             lista=new innesto(1, 0, R, 0);      //completa la lista inserendo le info sul ramo attuale
  177.             lista->next = f0(R->right);
  178.             return lista;                           //ritorna la lista
  179.         }
  180.        
  181.     }
  182.    
  183.     else{                           //Se ci sono entrambi i rami sinistro e destro
  184.         innesto *listaSx = f0(R->left);     //crea la lista sinistra cercando nel ramo sinistro
  185.         innesto *listaDx = f0(R->right);    //crea la lista destra cercando nel ramo destro
  186.         fine(listaSx)->next = listaDx;      //concatena la lista sinistra con quella destra
  187.         return listaSx;                     //ritorna la lista completa
  188.     }
  189.    
  190. }
  191. //POST=(restituisce la lista dei punti d'innesto di albero(R) in ordine infisso)
  192.  
  193.  
  194. //PRE=(lista(Inn) è corretta, in particolare ciascun nodo punta ad un corrispondente punto d'innesto di un qualche albero, INP contiene m interi seguiti dalla sentinella -2, 0<=m,
  195. //     sia vInn il valore iniziale di lista(Inn))
  196. int f1(innesto *&Inn, ifstream & INP){
  197.    
  198.     if(!Inn){                           //Se non ho alcun punto di innesto
  199.         return 0;                           //non potrò innestare alcun nodo
  200.     }
  201.    
  202.     int x=0, innesti=0;                 //Valore del campo info del nodo da innestare e numero di innesti fatti
  203.    
  204.        
  205.     if(Inn->l){                         //Se posso innestare a sinistra
  206.         INP>>x;                             //leggo il valore del nodo
  207.  
  208.         if(x!=-2){                          //se è diverso da -2
  209.             Inn->N->left=new nodo(x);           //innesto
  210.             innesti++;                          //conto l'innesto
  211.             Inn->l=false;                       //segnalo che non potrò più innestare nello stesso punto
  212.         }
  213.    
  214.         else{                               //altrimenti sono alla fine dell'input
  215.             return innesti;                     //ritorno il numero di innesti fatti
  216.         }
  217.  
  218.     }
  219.  
  220.     if(Inn->r){                         //Se posso innestare a destra
  221.         INP>>x;                             //leggo il valore del nodo
  222.  
  223.         if(x!=-2){                          //se è diverso da -2
  224.             Inn->N->right = new nodo(x);        //innesto
  225.             innesti++;                          //conto l'innesto
  226.             Inn->r=false;                       //segnalo che non potrò più innestare nello stesso punto
  227.         }
  228.    
  229.         else{                               //altrimenti sono alla fine dell'input
  230.             return innesti;                     //ritorno il numero di innesti fatti
  231.         }
  232.    
  233.     }
  234.    
  235.     if(!Inn->l &&  !Inn->r){            //Se ho utilizzato sia il figlio sinistro che destro del nodo non potrò più innestare
  236.         innesto* temp = Inn;                //creo un puntatore temporaneo
  237.         Inn=Inn->next;                      //sposto la lista
  238.         delete temp;                        //elimino il primo nodo inutilizzabile
  239.     }
  240.     return innesti+f1(Inn, INP);        //Ritorno il numero di innesti fatti fin'ora sommati a quelli che verranno fatti nei nodi successivi
  241.  
  242. }
  243. //POST=(se vInn contiene n campi l/r a true, allora vengono letti x=min(m,n) valori da INP e aggiunti x nuovi nodi usando i punti di innesto di vInn in ordine;
  244. //      f1 restituisce il valore di x e, in caso resti una parte di vInn non usata (succede quando n>m), questa lista rimasta deve essere il valore finale del parametro Inn.
  245. //      La parte di vInn che è usata viene deallocata)
  246.  
  247.  
  248.  
  249. main(){
  250.    
  251.     ifstream IN("input");
  252.     ofstream OUT("output");
  253.    
  254.     if(IN && OUT){
  255.        
  256.         int dim;
  257.         IN>>dim;
  258.        
  259.         nodo* R=rep_ins(0,dim,IN);
  260.         stampa_l(R,OUT);
  261.         OUT<<endl;
  262.        
  263.         innesto* x=f0(R);
  264.        
  265.         stampa(x,OUT);
  266.        
  267.         int a=f1(x,IN);
  268.        
  269.         OUT<<"n. innesti="<<a<<endl;
  270.        
  271.         stampa_l(R,OUT);
  272.         OUT<<endl;
  273.         stampa(x,OUT);
  274.    
  275.         IN.close();
  276.         OUT.close();
  277.     }
  278.  
  279.     else{
  280.        
  281.         cout<<"errore con i files";
  282.        
  283.     }
  284.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement