Advertisement
Guest User

quarto appello (filè)

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