SamuelKostadinov

Es a tempo 8

Jun 27th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct nodo {
  6.     int info;
  7.     nodo*next;
  8.    
  9.     nodo(int a=0, nodo*b=0) {
  10.         info=a;
  11.         next=b;
  12.     }
  13. };
  14.  
  15. nodo *buildL(int k) {
  16.     if(!k)
  17.         return 0;
  18.    
  19.     int x;
  20.     cin>>x;
  21.     return new nodo(x,buildL(k-1));
  22. }
  23.  
  24. void leggiA(int*A,int k) {
  25.     for(int i=0; i<k; i++)
  26.         cin>>A[i];
  27. }
  28.  
  29. nodo* clone(nodo*L) {
  30.     if(!L)
  31.         return 0;
  32.  
  33.     return new nodo(L->info,clone(L->next));
  34. }
  35.  
  36. void stampa(nodo*L) {
  37.     if(!L)
  38.         cout<<endl;
  39.     else {
  40.         cout<<L->info<<' ';
  41.         stampa(L->next);
  42.     }
  43. }
  44.  
  45.  
  46. void concat(nodo*& L1, nodo* L2){
  47.  
  48.     if(!L1){
  49.         L1 = L2;
  50.     }
  51.     else{
  52.         concat(L1-> next, L2);
  53.     }
  54. }
  55.  
  56. nodo* remove(nodo* &L, int dim) {
  57.     if(!dim){
  58.         return NULL;
  59.     }
  60.    
  61.     if(!L){
  62.         return NULL;
  63.     }
  64.    
  65.     nodo* Remove = L;
  66.     L = L-> next;
  67.     Remove->next = remove(L, dim - 1);
  68.     return Remove;
  69. }
  70.  
  71. /* PRE=(lista(L), lista(L1), e lista(L2) sono ben formate, A contiene dimA elementi non negativi,
  72.     con dimA pari >=0, vL=lista(L),vL1=lista(L1),vL2=lista(L2)) */
  73. void Fric(nodo*L, int*A, int dimA, nodo*&L1, nodo*&L2) {
  74.     // pari --> L1, dispari --> L2
  75.    
  76.     if(!L){
  77.         return;
  78.     }
  79.    
  80.     if(!dimA) {
  81.         concat(L1, L);
  82.         return;
  83.     }
  84.    
  85.     nodo *Concat = remove(L, *A);
  86.     concat(L1, Concat);    
  87.    
  88.     Concat = remove(L, *(A + 1));
  89.    
  90.     concat(L2, Concat);
  91.    
  92.     Fric(L, A + 2, dimA - 2, L1, L2);
  93. }
  94. /* POST=(i nodi di vL sono distribuiti correttamente su 2 liste X1 e X2 secondo i valori di A e L1=vL1@X1 e
  95. L2=vL2@X2) */
  96.  
  97. /*
  98.  
  99.     Caso base 1:
  100.             Se !L allora non ci sono più nodi, quindi è giusto smettere di fare ricorsione, in quanto la lista è finita
  101.     Caso base 2:
  102.             Se dimA == 0 allora è finito l'array e quindi non posso più andare oltre con gli inserimenti quindi è giusto fare un return
  103.    
  104.     Altrimenti metto nella variabile Concat la parte di lista da concatenare e successivamente la concateno alla lista L1 o L2. Alla fine ottengo che:
  105.         L è una lista ben formata in quanto l'ultimo nodo ha il campo nexy che punta sempre a 0
  106.         L1 è una lista ben formata in quanto remove crea solo liste ben formate e queste vengono aggiunte in coda alla lista L1 già presente
  107.         mantenendola quindi ben formata. Un ragionamento analogo si può fare per L2
  108.         A contiene dimA non negativi (dalla PRE) in quanto non viene mai modificato
  109.         dimA è sempre pari in quanto viene sottratto sempre 2 e sempre positivo in quanto se fosse 0 si rientrerebbe in un caso base
  110.        
  111.         quindi pre_ric è rispettata.
  112.         Per ipotesi induttiva assumo che sia verificata anche la post_ric
  113.        
  114.         Se post_ric è verificata si ha che nell'ultimo caso L1 = vL1@X1 e quindi L1 contiene i valori richiesti e vale altrettanto per L2
  115.         Quindi post è rispettata
  116.  
  117. */
  118.  
  119. main() {
  120.   cout<<"start"<<endl;
  121.  
  122.   int n, dimA;
  123.   cin >> n >> dimA;
  124.   int*A=new int[dimA];
  125.   nodo*L=buildL(n);
  126.   stampa(L);
  127.   leggiA(A,dimA);
  128.  
  129.   nodo*L1=0,*L2=0;
  130.   Fric(L,A,dimA,L1,L2);
  131.   stampa(L1);
  132.   stampa(L2);
  133.  
  134.   cout<<"end"<<endl;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment