Advertisement
RiccardoMontagnin

Esame 30 Giugno 2015

Jul 1st, 2015
324
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. struct nodo{int info; nodo* next; nodo(int a=0, nodo* b=0){info=a; next=b;}};
  6. struct FIFO{nodo* primo, *fine; FIFO(nodo*a=0, nodo*b=0){primo=a; fine=b;}};
  7.  
  8. void stampa_L(nodo* x,ofstream& OUT)
  9. {
  10.   if(x)
  11.   {OUT<<x->info<<' '; stampa_L(x->next,OUT);}
  12.   else
  13.    OUT<<endl;
  14. }
  15.  
  16. nodo* costruisci(int dim, ifstream & IN)
  17. {
  18.   if(dim)
  19.   {
  20.     int x;
  21.     IN>>x;
  22.     return new nodo(x,costruisci(dim-1,IN));
  23.  
  24.   }
  25.  else
  26.   return 0;
  27. }
  28.  
  29. //##############################
  30.  
  31. //PRE_metti_fondo=(a lista corretta, b nodo definito)
  32. FIFO metti_fondo(FIFO a, nodo *b){
  33.  
  34.     if(!a.primo){
  35.         a.fine = b;
  36.         a.primo = a.fine;
  37.         return a;
  38.     }
  39.  
  40.     else{
  41.         a.fine = b;
  42.         return a;
  43.     }
  44. }
  45. //POST_metti_fondo=(la lista a avra' come puntatore fine il nodo b)
  46.  
  47. //PRE_togli=(lista(C) è corretta e y è definito)
  48. nodo* togli(nodo *C, int y){
  49.  
  50.     if(!C){         //Se la lista e' vuota
  51.         return 0;       //non potranno esserci ripetizioni
  52.     }
  53.  
  54.     nodo* punt = C;
  55.  
  56.     while(punt){
  57.  
  58.         if(punt->next && punt->next->info == y){
  59.             nodo *puntnext = punt->next->next;  //Prossimo nodo
  60.             nodo *daElim = punt->next;          //Non da eliminare
  61.             punt->next = puntnext;              //Collego
  62.             delete daElim;                      //Elimino
  63.         }
  64.  
  65.         else{
  66.  
  67.             if(punt -> info == y){
  68.                 nodo *daElim = punt;            //Calcolo nodo da eliminare
  69.                 punt = punt->next;              //Sposto il puntatore corrente
  70.                 delete daElim;                  //Elimino il nodo
  71.             }
  72.  
  73.             else{
  74.                 punt = punt->next;              //Se non ho da eliminare sposto solo
  75.             }
  76.         }
  77.     }
  78.  
  79.  
  80.     return C;
  81.  
  82. }
  83.  
  84. //POST_togli=(restituisce la lista che resta eliminando da C i nodi con campo info=y che vengono deallocati. Nessun nodo nuovo rispetto a C è allocato)
  85.  
  86. //PRE_no_rip=(lista(C) è corretta)
  87. nodo* no_rip(nodo*C){
  88.  
  89.     if(!C){             //Se lista vuota non posso togliere nulla
  90.         return 0;           //non posso togliere nulla
  91.     }
  92.  
  93.     if(!C->next){       //Se il successivo non esiste
  94.         return 0;           //non posso togliere nulla
  95.     }
  96.  
  97.     C->next= togli(C->next, C->info);   //Calcolo la lista partendo dal prossimo nodo senza ripetizioni di valori uguali al campo info del nodo attuale
  98.     C->next= no_rip(C->next);           //Dalla lista rimanente tolgo le ripetizioni del nodo successivo
  99.     return C;
  100. }
  101.  
  102. //POST_no_rip=( restituisce quello che resta di C mantenendo solo il primo nodo con un dato campo info ed eliminando i nodi successivi con lo stesso campo info.
  103. //       I nodi tolti da C sono deallocati. Nessun nuovo nodo rispetto a C è allocato)
  104.  
  105.  
  106. /*
  107.  
  108.     Dimostrazione induttiva della correttezza di no_rip.
  109.  
  110.     1. Caso base (lista vuota).
  111.        Essendo L una lista vuota, da essa non si potra' togliere alcun nodo, quindi viene restituita la stessa lista vuota => vale POST
  112.  
  113.     2. Caso induttivo (lista non vuota)
  114.        Essendo L una lista non vuota, viene prima invocata togli che permette di togliere, a partire dal successivo nodo della lista, tutti i nodi con campo info
  115.        uguale al campo info del nodo attuale => C->next = vC dove vC contiene tutti i nodi di C tranne quelli con campo info uguale a C stesso => vale POST
  116.  
  117. */
  118.  
  119.  
  120. //PRE_elim=(T e C liste corrette)
  121. void elim(nodo*&T, nodo*C){
  122.  
  123.     if(!T || !C){           //Se una delle due liste e' vuota
  124.         return;                 //non posso fare nulla
  125.     }
  126.  
  127.     nodo* punt = C;
  128.  
  129.     while(punt){
  130.         togli(T, punt->info);   //Tolgo tutti i nodi con campo pari al campo info del puntatore
  131.         punt = punt->next;      //Sposto il puntatore al prossimo nodo di C
  132.     }
  133.  
  134.     return;
  135.  
  136. }
  137. //POST_elim=(da T vengono tolti tutti i nodi con campo info uguali ai campi info dei nodi di C)
  138.  
  139. main()
  140. {
  141.   ifstream IN("input");
  142.   ofstream OUT("output");
  143.   if(IN && OUT)
  144.   {
  145.    int dimT, dimC;
  146.    IN>>dimC;
  147.    nodo*C=costruisci(dimC,IN);
  148.    stampa_L(C,OUT);
  149.  
  150.    nodo*Y=no_rip(C);
  151.  
  152.    stampa_L(Y,OUT);
  153.    IN>>dimT;
  154.    nodo* T=costruisci(dimT,IN);
  155.    stampa_L(T,OUT);
  156.    
  157.    elim(T,Y);
  158.    
  159.    stampa_L(T,OUT);
  160.    IN.close(); OUT.close();
  161.   }
  162.   else
  163.    cout<<"errore con i files";
  164.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement