Advertisement
fcamuso

Algoritmi lezione 29 - Liste Concatenate con C++ 2

Jul 2nd, 2024
645
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <memory>
  3. #include <random>
  4. #include <ctime>
  5. #include <chrono>
  6.  
  7. using namespace std;
  8. #include "../../vettori/min_max/utility_vettori.h"
  9.  
  10.  
  11. template <typename T>
  12. class ListaConcatenata {
  13. private:
  14.     // Nodo della lista_numeria
  15.     class Nodo {
  16.     public:
  17.         T dati;
  18.  
  19.         std::unique_ptr<Nodo> successivo = nullptr;
  20.  
  21.       //Nodo(T i_dati) { dati = i_dati;}
  22.         Nodo(T i_dati) : dati(i_dati) {}
  23.     };
  24.  
  25.     std::unique_ptr<Nodo> testa = nullptr;
  26.     Nodo* coda = nullptr;
  27.  
  28. public:
  29.     ListaConcatenata() {}
  30.  
  31.     // Aggiunge un elemento all'inizio della lista
  32.     void inserisci_in_testa(T i_dati) {
  33.         auto nuovo = std::make_unique<Nodo>(i_dati);
  34.         if (!testa) {
  35.             coda = nuovo.get();
  36.         }
  37.  
  38.         //std::cout << "testa PRIMA: " << testa.get() << std::endl;
  39.         nuovo->successivo = std::move(testa);
  40.         //std::cout << "testa DOPO: " << testa.get() << std::endl;
  41.  
  42.         testa = std::move(nuovo);
  43.     }
  44.  
  45.     // Aggiunge un elemento alla fine della lista
  46.     void inserisci_in_coda(T i_dati) {
  47.         auto nuovo = std::make_unique<Nodo>(i_dati);
  48.         if (!coda) {
  49.             testa = std::move(nuovo);
  50.             coda = testa.get();
  51.         } else {
  52.             coda->successivo = std::move(nuovo);
  53.             coda = coda->successivo.get();
  54.         }
  55.     }
  56.  
  57.     // Stampa gli elementi della lista
  58.     void stampa() const {
  59.         Nodo* temp = testa.get();
  60.         while (temp) {
  61.             std::cout << temp->dati << " -> ";
  62.             temp = temp->successivo.get();
  63.         }
  64.         std::cout << "nullptr" << std::endl;
  65.     }
  66.  
  67.     // Rimuove il primo elemento con il i_dati specificati
  68.     void elimina(T i_dati) {
  69.         Nodo* temp = testa.get();
  70.         Nodo* precedente = nullptr;
  71.  
  72.         // Se il nodo da rimuovere รจ la testa
  73.         if (temp && temp->dati == i_dati) {
  74.             testa = std::move(testa->successivo);
  75.             if (!testa) {
  76.                 coda = nullptr;
  77.             }
  78.             return;
  79.         }
  80.  
  81.         // Cerca il nodo da rimuovere
  82.         while (temp && temp->dati != i_dati) {
  83.             precedente = temp;
  84.             temp = temp->successivo.get();
  85.         }
  86.  
  87.         // Se il nodo non รจ stato trovato
  88.         if (!temp) return;
  89.  
  90.         // Rimuove il nodo
  91.         precedente->successivo = std::move(temp->successivo);
  92.         if (!precedente->successivo) {
  93.             coda = precedente;
  94.         }
  95.     }
  96.  
  97.     // Controlla se la lista รจ vuota
  98.     bool vuota() const {
  99.         return !testa;
  100.     }
  101.  
  102.     bool inserisci_alla_posizione(int posizione, T i_dati)
  103.     {
  104.       int conta_nodi = 0;
  105.       Nodo *temp = testa.get();
  106.  
  107.       if (posizione<0) return false;
  108.  
  109.       if (posizione == 0)
  110.       {
  111.         inserisci_in_testa(i_dati);
  112.         return true;
  113.       }
  114.       else
  115.       {
  116.         while (temp && conta_nodi < posizione-1)
  117.         {
  118.           conta_nodi++;
  119.           temp = temp->successivo.get();
  120.         }
  121.  
  122.         if (temp)
  123.         {
  124.           auto nuovo = std::make_unique<Nodo>(i_dati);
  125.           nuovo->successivo = std::move(temp->successivo);
  126.           temp->successivo = std::move(nuovo);
  127.           return true;
  128.         }
  129.         else
  130.           return false;
  131.       }
  132.  
  133.     }
  134.  
  135. };
  136.  
  137.  
  138. int main() {
  139.     ListaConcatenata<unsigned long> lista_numeri;
  140.  
  141.     lista_numeri.inserisci_in_coda(1);
  142.     lista_numeri.inserisci_in_coda(2);
  143.     lista_numeri.inserisci_in_coda(3);
  144.     lista_numeri.inserisci_in_coda(4);
  145.  
  146.  
  147.  
  148.     lista_numeri.elimina(1);
  149.     lista_numeri.elimina(4);
  150.     lista_numeri.elimina(4);
  151.     lista_numeri.elimina(2);
  152.     lista_numeri.elimina(3);
  153.  
  154.     lista_numeri.inserisci_alla_posizione(-9, 999);
  155.     lista_numeri.stampa();
  156.  
  157.  
  158.  
  159.    std::cout << "lista_numeri: ";
  160.     lista_numeri.print_lista_numeri();
  161.  
  162.     return 0;
  163. }
  164.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement