Advertisement
RiccardoMontagnin

Esame 31 Marzo 2013

Jun 22nd, 2015
329
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 info1, info2;
  12.     nodo* next;
  13.    
  14.     nodo(int a=0, int c=0, nodo* b=0){
  15.        
  16.         info1=a;
  17.         info2=c;
  18.         next=b;
  19.        
  20.     }
  21.    
  22. };
  23.  
  24. nodo* copia(nodo* X){
  25.  
  26.     if(X){
  27.        
  28.         return new nodo(X->info1, X->info2, copia(X->next));
  29.        
  30.     }
  31.    
  32.     return 0;
  33.  
  34. }
  35.  
  36. void crea(nodo* &L, int dim, ifstream & INP, int n){
  37.  
  38.     int x;
  39.    
  40.     if(n<dim){
  41.      
  42.         INP>>x;
  43.         L=new nodo(x,n,0);
  44.         crea(L->next, dim,INP,n+1);
  45.     }
  46.    
  47.     else{
  48.        
  49.         L=0;
  50.        
  51.     }
  52.    
  53. }
  54.  
  55. void crea1(nodo*&L, int dim, ifstream & INP, int n){
  56.    
  57.     int x,y;
  58.  
  59.     if(n<dim){
  60.      
  61.         INP>>x>>y;
  62.         L=new nodo(x,y,0);
  63.         crea1(L->next, dim,INP,n+1);
  64.      
  65.     }
  66.    
  67.     else{
  68.        
  69.         L=0;
  70.        
  71.     }
  72. }
  73.  
  74. void stampa(nodo* x, ofstream & OUT){
  75.    
  76.     if(x){
  77.      
  78.         OUT<<'('<< x->info1<<','<<x->info2<<')';
  79.         if(x->next)
  80.         OUT<<"->";
  81.         stampa(x->next, OUT);
  82.        
  83.     }
  84.    
  85.     else{
  86.        
  87.         OUT<<endl;
  88.        
  89.     }
  90.    
  91. }
  92.  
  93.  
  94. /////////////////////////////////////////////////////////////////////////
  95. /////////////////////////  FUNZIONI CREATE  /////////////////////////////
  96. /////////////////////////////////////////////////////////////////////////
  97.  
  98. //PRE_startmatch=(T è lista corretta, indiceP>=0, indiceT>=0)
  99. int startMatch(nodo* T, int *P, int indiceP, int indiceT){
  100.    
  101.     nodo *punt = T;
  102.    
  103.     for(int i=0; i<indiceT; i++){   //Vado all'indice di T che mi serve per iniziare il match
  104.        
  105.         if(punt->next){                 //Se esiste il successivo...
  106.             punt = punt->next;              //...mi muovo
  107.         }
  108.        
  109.         else{                           //Altrimentri...
  110.             return -1;                      //...ritorno -1
  111.         }
  112.        
  113.     }
  114.    
  115.     for(int i=0; true; ){           //Inizio il controllo
  116.        
  117.         if(punt->info1==P[indiceP]){    //Se il campo info1 è uguale a P[indiceP]
  118.             return punt->info2;             //la ricerca si ferma
  119.         }
  120.      
  121.         else{                           //Altrimenti
  122.            
  123.             if(punt->next){                 //se esiste un prossimo
  124.                 punt=punt->next;                //mi sposto sul prossimo
  125.                 i++;                            //e continuo la ricerca
  126.             }
  127.            
  128.             else{                           //se non esiste
  129.                 return -1;                      //non ho trovato il match
  130.             }
  131.            
  132.         }
  133.        
  134.     }
  135.    
  136.     return -1;
  137.    
  138. }
  139. //POST_checklung=(restituisce con il return l'indice di T che ha campo info1 uguale a P[indiceP]) && (restituisce -1 se non esiste tale campo)
  140.  
  141. //POST_checklung=(T è lista corretta, P contiene dimP elementi, dimP >= 0 e indiceT>=0)
  142. int checkLung(nodo* T, int *P, int indiceP, int indiceT, int dimP){
  143.    
  144.     if(indiceT == -1){
  145.        
  146.         return 0;
  147.        
  148.     }
  149.    
  150.     nodo *punt = T;
  151.    
  152.     for(int i=0; i<indiceT; i++){   //Vado all'indice di T che mi serve per iniziare il match
  153.        
  154.         if(punt->next){                 //Se esiste il successivo...
  155.             punt = punt->next;              //...mi muovo
  156.         }
  157.        
  158.         else{                           //Altrimentri...
  159.             return 0;                      //...ritorno -1
  160.         }
  161.        
  162.     }
  163.    
  164.     for(int i=0; true; ){     //Controllo quanto è lungo il match
  165.        
  166.         if(P[indiceP+i]==punt->info1){  //Se trovo un match tra il campo info1 di T e P[i]
  167.             i++;                            //cerco il prossimo
  168.            
  169.             if(i==dimP){                        //se ho trovato tutto il match
  170.                 return i;                           //ritorno la lunghezza
  171.             }
  172.            
  173.             if(punt->next){
  174.                 punt = punt->next;
  175.             }
  176.            
  177.             else{
  178.                 return i;
  179.             }
  180.            
  181.         }
  182.        
  183.         else{                           //Se non trovo match
  184.             return i;                       //ritorno la lunghezza fin'ora trovata
  185.         }
  186.        
  187.     }
  188.    
  189.     return 0;
  190.    
  191. }
  192. //POST_checklung=(resistuisce con il return la lunghezza del match di P[indiceP..dimP-1] in T a partire dal nodo T(x, indiceT))
  193.  
  194. //PRE_M1=(T lista corretta, dimP>=0)
  195. nodo* M1(nodo* T, int *P, int dimP){
  196.    
  197.     if(!T){                                     //Se ho una lista vuota
  198.         return 0;                                   //non potrà esserci alcun match
  199.     }
  200.    
  201.     int indiceT=-1, lung=0;                     //Variabili per il controllo dell'indice di T dove inizia il match di P[ ] e la lunghezza del match stesso
  202.     nodo *lista;                                //Lista che descrive il match
  203.    
  204.     indiceT = startMatch(T, P, 0, 0);           //Cerca l'indice di T dal quale inizia il match di P
  205.     lung = checkLung(T, P, 0, indiceT, dimP);   //Cerca la lunghezza del match di P[0..dimP-1] dal nodo T(x, indiceT)
  206.    
  207.     if(indiceT == -1 || !lung){                 //Se il match iniziale non esiste
  208.         return 0;                                   //ritorna la lista vuota
  209.     }
  210.    
  211.     else{                                       //Se il match iniziale
  212.         lista = new nodo(indiceT, lung);            //costruisci il primo nodo
  213.     }
  214.    
  215.     int ultimoT = indiceT + lung;               //Nodo di T dal quale partire per continuare a cercare il match
  216.     nodo *pros = lista;                         //Puntatore di riferimento
  217.    
  218.     while(indiceT!= -1 && lung!=0){             //Se il match esistere
  219.    
  220.         /* R = (il match di P[lung..dimP-1] esiste e inizia in un nodo di T definito <=> indiceT!=-1 && lung!=0) */
  221.        
  222.         indiceT = startMatch(T, P, lung, ultimoT);      //calcola l'indice di T dal quale partire
  223.         lung = checkLung(T, P, lung, indiceT, dimP);    //calcola la lunghezza del match
  224.  
  225.         if(indiceT!= -1 && lung!= 0){                       //se il match esiste
  226.            
  227.             pros->next = new nodo(indiceT-ultimoT, lung, 0);    //aggiungi un nodo
  228.             pros = pros->next;                                  //sposta il puntatore
  229.             ultimoT = indiceT + lung;                           //modifica l'indice di T dal quale partirà il prossimo match
  230.             lung += lung;                                       //modifica l'indice di P dal quale partirà il prossimo match
  231.  
  232.         }
  233.        
  234.     }
  235.  
  236.     return lista;
  237.    
  238. }
  239. //POST_M1=(restituisce col return la lista del match di P in T)
  240.  
  241. //PRE_saltaNodi=(T è una lista corretta non vuota, info1 è un intero >=0)
  242. nodo *&saltaNodi(nodo *&T, int info1){
  243.     if(T && info1)
  244.         return saltaNodi(T->next,info1-1);
  245.     //o è finita la lista o T è il puntatore al info1-esimo nodo
  246.     return T;
  247. }//POST_saltaNodi=(se all'invocazione la lista aveva nodi sufficienti il puntatore T iniziale punta all'info1-esimo nodo successivo; altrimenti punta al nodo successivo all'ultimo della lista)
  248.  
  249. //PRE_togliNodi=(T è una lista corretta non vuota, info2 è un intero >0)
  250. nodo *togliNodi(nodo *&T, int info2){
  251.     if(!T || !info2)
  252.         return T;
  253.     nodo *aux=T; //mi ricordo il puntatore per deallocare il nodo
  254.     T=T->next;
  255.     delete aux;
  256.     return togliNodi(T,info2-1);
  257. }//POST_togliNodi=(se all'invocazione T era vuota o info2=0 allora ritorna T (che è vuoto o altrimenti non ci siamo spostati); altrimenti se all'invocazione la lista aveva nodi sufficienti il nodo successivo al puntatore T iniziale punta all'info2-esimo nodo successivo (o a quello successivo all'ultimo della lista) e i nodi tolti sono deallocati)
  258.  
  259. //PRE_TB=(T e X sono liste corrette, i campi info1 e info2 dei nodi di X (se ci sono nodi) sono tutti maggiori o uguali a 0, T=vT)
  260. void TB(nodo*&T, nodo*X){
  261.  
  262.     if(!T || !X)
  263.         return ;
  264.     nodo *&aux1=saltaNodi(T,X->info1);
  265.     if(aux1){ //risparmio una chiamata di funzione
  266.         nodo *aux2=togliNodi(aux1,X->info2);
  267.         aux1=aux2; //aux1 è uno dei nodi da togliere!
  268.         if(X->next) //risparmio una chiamata di funzione
  269.             TB(aux1,X->next);
  270.     }
  271.  
  272. }//POST_TB=(T=(vT-X), i nodi di (X di vT) sono deallocati)
  273.  
  274. //PRE_TC=(T e X sono liste corrette, i campi info1 e info2 dei nodi di X (se ci sono nodi) sono tutti maggiori o uguali a 0, T=vT)
  275. nodo* TC(nodo*&T, nodo*X){
  276.     if(!T || !X)
  277.         return 0;
  278.     if(X->info1){ //salto i nodi
  279.         X->info1--;
  280.         return TC(T->next,X);
  281.     }else{ //stacco i nodi
  282.         if(X->info2){
  283.             X->info2--;
  284.             nodo *aux=T;
  285.             T=T->next;
  286.             return new nodo(aux->info1,aux->info2,TC(T,X));
  287.             delete aux; //pulizia
  288.         }else return TC(T,X->next);
  289.     }
  290. }//POST_TC=( T=(vT-X), e restituisce (X di vT) con il return)
  291.  
  292.  
  293. main(){
  294.    
  295.     try{
  296.        
  297.         ifstream INP("input");
  298.         ofstream OUT("output");
  299.        
  300.         if(!INP){
  301.            
  302.             throw(0);
  303.            
  304.         }
  305.        
  306.         if(!OUT){
  307.            
  308.             throw(1);
  309.            
  310.         }
  311.        
  312.         int P[100], dim, dimP, dimX;
  313.         INP>>dim>>dimP>>dimX;
  314.  
  315.         nodo*L=0;
  316.         crea(L,dim,INP,0);
  317.  
  318.         for(int i=0;i<dimP ; i++){
  319.            
  320.             INP>>P[i];
  321.            
  322.         }
  323.        
  324.         nodo *z = M1(L, P,dimP);
  325.      
  326.         if(!z){
  327.            
  328.             OUT<<"nessun match"<<endl;
  329.            
  330.         }
  331.        
  332.         else{
  333.            
  334.             stampa(z,OUT);
  335.            
  336.         }
  337.  
  338.         OUT<<endl;
  339.         nodo* X=0;
  340.         crea1(X,dimX,INP,0);
  341.         nodo*L1=copia(L);
  342.         TB(L1,X);               //da fare
  343.         nodo* z1=TC(L,X);       //da fare
  344.         stampa(L,OUT);
  345.         stampa(z1,OUT);
  346.        
  347.     }
  348.    
  349.     catch(int x){
  350.        
  351.         switch(x){
  352.            
  353.             case 0: cout<<"problemi con input"<<endl; break;
  354.             case 1: cout<<"problemi con output"<<endl; break;
  355.            
  356.         }
  357.        
  358.     }
  359.    
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement