Advertisement
fcamuso

Algoritmi lezione 30 - liste concatenate VS array

Jul 6th, 2024
902
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.88 KB | None | 0 0
  1. //LINK a utility_vettori.h (le funzioni di supporto usate spesso nel sorgente principale)
  2. // https://pastebin.com/jxsd1vSt (è la parte all'inizio)
  3.  
  4.  
  5.  
  6. #include <iostream>
  7. #include <memory>
  8. #include <random>
  9. #include <ctime>
  10. #include <chrono>
  11.  
  12. using namespace std;
  13. #include "../../vettori/min_max/utility_vettori.h"
  14.  
  15.  
  16. template <typename T>
  17. class ListaConcatenata {
  18. private:
  19.     // Nodo della lista_numeri
  20.     class Nodo {
  21.     public:
  22.         T dati;
  23.  
  24.         std::unique_ptr<Nodo> successivo = nullptr;
  25.  
  26.       //Nodo(T i_dati) { dati = i_dati;}
  27.         Nodo(T i_dati) : dati(i_dati) {}
  28.     };
  29.  
  30.     std::unique_ptr<Nodo> testa = nullptr;
  31.     Nodo* coda = nullptr;
  32.  
  33. public:
  34.     ListaConcatenata() {}
  35.  
  36.     // Aggiunge un elemento all'inizio della lista
  37.     void inserisci_in_testa(T i_dati) {
  38.         auto nuovo = std::make_unique<Nodo>(i_dati);
  39.         if (!testa) {
  40.             coda = nuovo.get();
  41.         }
  42.  
  43.         //std::cout << "testa PRIMA: " << testa.get() << std::endl;
  44.         nuovo->successivo = std::move(testa);
  45.         //std::cout << "testa DOPO: " << testa.get() << std::endl;
  46.  
  47.         testa = std::move(nuovo);
  48.     }
  49.  
  50.     // Aggiunge un elemento alla fine della lista
  51.     void inserisci_in_coda(T i_dati) {
  52.         auto nuovo = std::make_unique<Nodo>(i_dati);
  53.         if (!coda) {
  54.             testa = std::move(nuovo);
  55.             coda = testa.get();
  56.         } else {
  57.             coda->successivo = std::move(nuovo);
  58.             coda = coda->successivo.get();
  59.         }
  60.     }
  61.  
  62.     // Stampa gli elementi della lista
  63.     void stampa() const {
  64.         Nodo* temp = testa.get();
  65.         while (temp) {
  66.             std::cout << temp->dati << " -> ";
  67.             temp = temp->successivo.get();
  68.         }
  69.         std::cout << "nullptr" << std::endl;
  70.     }
  71.  
  72.     // Stampa gli elementi della lista
  73.     int conta() const {
  74.         int cont = 0;
  75.  
  76.         Nodo* temp = testa.get();
  77.         while (temp) {
  78.             cont++;
  79.             temp = temp->successivo.get();
  80.         }
  81.         return cont;
  82.     }
  83.  
  84.  
  85.     // Rimuove il primo elemento con il i_dati specificati
  86.     void elimina(T i_dati) {
  87.         Nodo* temp = testa.get();
  88.         Nodo* precedente = nullptr;
  89.  
  90.         // Se il nodo da rimuovere è la testa
  91.         if (temp && temp->dati == i_dati) {
  92.             testa = std::move(testa->successivo);
  93.             if (!testa) {
  94.                 coda = nullptr;
  95.             }
  96.             return;
  97.         }
  98.  
  99.         // Cerca il nodo da rimuovere
  100.         while (temp && temp->dati != i_dati) {
  101.             precedente = temp;
  102.             temp = temp->successivo.get();
  103.         }
  104.  
  105.         // Se il nodo non è stato trovato
  106.         if (!temp) return;
  107.  
  108.         // Rimuove il nodo
  109.         precedente->successivo = std::move(temp->successivo);
  110.         if (!precedente->successivo) {
  111.             coda = precedente;
  112.         }
  113.     }
  114.  
  115.     // Controlla se la lista è vuota
  116.     bool vuota() const {
  117.         return !testa;
  118.     }
  119.  
  120.     bool inserisci_alla_posizione(int posizione, T i_dati)
  121.     {
  122.       int conta_nodi = 0;
  123.       Nodo *temp = testa.get();
  124.  
  125.       if (posizione<0) return false;
  126.  
  127.       if (posizione == 0)
  128.       {
  129.         inserisci_in_testa(i_dati);
  130.         return true;
  131.       }
  132.       else
  133.       {
  134.         while (temp && conta_nodi < posizione-1)
  135.         {
  136.           conta_nodi++;
  137.           temp = temp->successivo.get();
  138.         }
  139.  
  140.         if (temp)
  141.         {
  142.           auto nuovo = std::make_unique<Nodo>(i_dati);
  143.           nuovo->successivo = std::move(temp->successivo);
  144.           temp->successivo = std::move(nuovo);
  145.           return true;
  146.         }
  147.         else
  148.           return false;
  149.       }
  150.  
  151.     }
  152.  
  153. };
  154.  
  155. //   struct Dati {
  156. //      double * v;
  157. //
  158. //      Dati() { v = new double[50000];}
  159. //   };
  160.  
  161. //   struct Dati {
  162. //      double v[100];
  163. //   };
  164.  
  165.  
  166.     const long NUM_ELEMENTI = 1000;
  167.     unsigned long v[NUM_ELEMENTI*2];
  168.  
  169.     //Dati vDati[NUM_ELEMENTI * 2];
  170.  
  171.  
  172.  
  173.  
  174. int main() {
  175.     ListaConcatenata<unsigned long> lista_numeri;
  176.  
  177. //    lista_numeri.inserisci_in_coda(1);
  178. //    lista_numeri.inserisci_in_coda(2);
  179. //    lista_numeri.inserisci_in_coda(3);
  180. //    lista_numeri.inserisci_in_coda(4);
  181. ////
  182. //    std::cout << "lista_numeri: ";
  183. //
  184. //    lista_numeri.elimina(1);
  185. //    lista_numeri.elimina(4);
  186. //    lista_numeri.elimina(4);
  187. //    lista_numeri.elimina(2);
  188. //    lista_numeri.elimina(3);
  189. //
  190. //
  191. //
  192. //
  193. //    lista_numeri.inserisci_alla_posizione(-9, 999);
  194. //    lista_numeri.stampa(); return 0;
  195. //
  196.  
  197.  
  198.  
  199.     //carico metà vettore
  200.     carica_vettore_interi(v, NUM_ELEMENTI);
  201.     long inseriti = NUM_ELEMENTI;
  202.  
  203.  
  204.     //creo una lista con gli stessi elementi
  205.     for (int i=0; i<NUM_ELEMENTI; i++)
  206.        lista_numeri.inserisci_in_coda(v[i]);
  207.  
  208.       //stampa_vettore_interi(v, inseriti);
  209.       //cout << endl;
  210.       //lista_numeri.stampa();
  211.       //cout << endl << endl;
  212.  
  213.     int punto_inserimento = 0;
  214. //    Dati da_inserire;
  215. //    da_inserire.v[0] = 999;
  216.  
  217.     srand(5);
  218.  
  219.     Cronometro(Stato::START);
  220.     for (int i=0; i<NUM_ELEMENTI; i++)
  221.     {
  222.       punto_inserimento = rand()%inseriti;
  223.       //shift per inserire in punto_inserimento
  224.       for (int j = inseriti; j>punto_inserimento; j--)
  225.         v[j] = v[j-1];
  226.  
  227.       v[punto_inserimento] = 999; //da_inserire;  //999;
  228.       inseriti ++;
  229.     }
  230.     //stampa_vettore_interi(v, inseriti);
  231.     cout << endl;
  232.  
  233.  
  234.     cout << "Tempo impiegato con vettore: " << Cronometro(Stato::STOP) << endl;
  235.  
  236.     //stesse operazioni con lista
  237.     srand(5);
  238.     inseriti = NUM_ELEMENTI;
  239.  
  240.     Cronometro(Stato::START);
  241.     for (int i=0; i<NUM_ELEMENTI; i++)
  242.     {
  243.       punto_inserimento = rand()%inseriti;
  244.       lista_numeri.inserisci_alla_posizione(punto_inserimento, 999);
  245.       inseriti++;
  246.     }
  247.  
  248.     cout << "Tempo impiegato con lista: " << Cronometro(Stato::STOP) << endl;
  249.  
  250.     //lista_numeri.stampa();
  251.  
  252.     return 0;
  253. }
  254.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement