Advertisement
Guest User

quarto appellò (filé)

a guest
Nov 24th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.65 KB | None | 0 0
  1. //
  2. //  quarto_appello_soluzione_ufficiale.cpp
  3. //  
  4. //
  5. //  Created by Elisabetta Piombin on 24/11/17.
  6. //
  7. //
  8.  
  9. #include <stdio.h>
  10. #include<iostream>
  11. using namespace std;
  12.  
  13. struct nodo{int num, info; nodo* next; nodo(int a=0,int b=0, nodo* c=0){num=a; info=b; next=c;}}; // nodo di lista
  14. struct FIFO{nodo* primo, *ultimo; FIFO(nodo*a=0, nodo*b=0){primo=a; ultimo=b;}};
  15. struct nodoF{FIFO info; nodoF*next; nodoF(FIFO a=FIFO(),nodoF*b=0){info=a; next=b;}}; //nodo di lista con FIFO
  16.  
  17. FIFO push_end(FIFO a, nodo*b)
  18. {
  19.     b->next=0;
  20.     if(!a.primo)
  21.     {a.primo=a.ultimo=b;}
  22.     else
  23.     {a.ultimo->next=b; a.ultimo=b;}
  24.     return a;
  25. }
  26.  
  27. FIFO push_begin(FIFO a, nodo* b)
  28. {
  29.     if(!a.primo)
  30.     {a.primo=a.ultimo=b; b->next=0; return a;}
  31.     else
  32.     {
  33.         b->next=a.primo;
  34.         a.primo=b;
  35.         return a;
  36.     }
  37. }
  38.  
  39. void stampa_L(nodo*L)
  40. {
  41.     if (L)
  42.     {cout<<'['<<L->num<<','<<L->info<<']'<<' '; stampa_L(L->next);}
  43.     else
  44.         cout<<endl;
  45.    
  46. }
  47. void stampa_F(nodoF* x)
  48. {
  49.     if(x)
  50.     {
  51.         stampa_L(x->info.primo);
  52.         cout<<endl;
  53.         stampa_F(x->next);
  54.     }
  55. }
  56.  
  57. nodo* costruisci(int n, int dim)
  58. {
  59.     if(dim)
  60.     {int x; cin>>x; return new nodo(n,x,costruisci(n+1,dim-1));}
  61.     return 0;
  62. }
  63. nodo* clone(nodo*a)
  64. {
  65.     if(a)
  66.     {return new nodo(a->num, a->info, clone(a->next));}
  67.     return 0;
  68. }
  69.  
  70. /* COSEEEEEEE */
  71. //ricorsiva
  72.  
  73. FIFO eliminaR (nodo*& L, int x) {
  74.     if (!L) return FIFO();
  75.     FIFO b = eliminaR (L->next, x);
  76.     if (L->info == x) {
  77.         nodo* a = L; //mi ricordo il nodo che ha campo info = x
  78.         L = L->next; //lo sgancio
  79.         b = push_begin (b, a); //metto nella nuova struttura fifo il nodo che ho sganciato. si usa push_begin perché stiamo tornando indietro nella ricorsione, e così mi mette tutti i nodi nella fifo nell'ordine originale
  80.     }
  81.     return b;
  82. }
  83.  
  84. nodoF* insR (nodoF* Q, FIFO x) {
  85.     if (!Q || x.primo->info < Q->info.primo->info)
  86.         return new nodoF (x, Q);
  87.     //se non entro nella if significa che la lista non è vuota o non devo mettere il nodo al primo posto
  88.     Q->next = insR (Q->next, x);
  89.     return Q;
  90. }
  91.  
  92. nodoF* tieni_primo_ric(nodo*& L) {
  93.     if (!L) return 0;
  94.     FIFO b = eliminaR (L->next, L->info); //invoco su L->next perché in ogni caso il primo nodo  si tiene
  95.     nodoF* z = tieni_primo_ric(L->next);
  96.     if (b.primo)
  97.         z= insR (z, b);
  98.     return z;
  99. }
  100.  
  101. //iterativa
  102.  
  103. nodoF* insI (nodoF* Q, FIFO x) {
  104.     if (!Q || x.primo->info < Q->info.primo->info)
  105.         return new nodoF (x, Q);
  106.     //ma se non devo inserirlo al primo posto: il primo nodo c'è e ha campo info < di quello che devo inserire. è utile avere il puntatore che punta al nodo prima rispetto a dove devo inserire il nodo
  107.     nodoF* z = Q; //quindi uso z
  108.     while (z->next && z->next->info.primo->info < x.primo->info)
  109.         z = z->next;
  110.     z->next = new nodoF (x, z->next);
  111.     return Q;
  112. }
  113.  
  114. nodoF* tieni_primo_iter (nodo*& L) {
  115.     nodoF* x=0;
  116.     nodo* z = L;
  117.     while (z) {
  118.         FIFO a= eliminaR (z->next, z->info);
  119.         x=insI(x,a);
  120.         z=z->next;
  121.     }
  122.     return x;
  123. }
  124.  
  125.  
  126. main()
  127. {
  128.     int dim;
  129.     cout<<"start"<<endl;
  130.     cin>>dim;
  131.     nodo*C=costruisci(0,dim);
  132.     nodo* D=clone(C);
  133.     cout<<"Lista costruita"<<endl;
  134.     stampa_L(C);
  135.     nodoF* a =tieni_primo_ric(C); //da fare
  136.     cout<<"soluzione ricorsiva"<<endl<<"nodi tolti:"<<endl;
  137.    
  138.     stampa_F(a);
  139.     cout<<"lista rimanente:"<<endl;
  140.     stampa_L(C);
  141.     nodoF* b=tieni_primo_iter(D); //da fare
  142.     cout<<"soluzione iterativa"<<endl<<"nodi tolti:"<<endl;
  143.     stampa_F(b);
  144.     cout<<"lista rimanente:"<<endl;
  145.     stampa_L(D);
  146.     cout<<"end";
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement