Advertisement
Guest User

Untitled

a guest
Dec 14th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.29 KB | None | 0 0
  1. #ifndef LISTA_H
  2. #define LISTA_H
  3.  
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. typedef int T;
  9.  
  10. struct Nodo{
  11.     T elemento;
  12.     Nodo * next;
  13. };
  14.  
  15. class Lista{
  16.     friend ostream & operator<<(ostream &, const Lista &);
  17.    
  18.     private:
  19.         Nodo * testa;
  20.         void clear();
  21.         bool find(const T &, Nodo * &)const;
  22.         bool push(const T &);
  23.         bool pop(T &);
  24.        
  25.     public:
  26.         Lista() {testa = 0;} //start
  27.         bool empty()const;
  28.         bool full()const {return false;}
  29.         bool inList(const T &)const;
  30.         int getCount()const;
  31.         bool Insert(const T &);    
  32.         bool Delete(const T &);
  33.         ~Lista() {clear();}
  34. };    
  35.  
  36. #endif
  37.  
  38. //ti ho messo tutto in un file perchè mi scocciavo di mandarne due, ma su dev chiaramente li devi separare
  39.  
  40. #include "Lista.h"
  41.  
  42.  
  43.  
  44. bool Lista::empty()const
  45. {
  46.     if(testa == 0)
  47.         return true;
  48.        
  49.     return false;
  50. }//fine empty
  51.  
  52. //------------------------------------------------------------------------------
  53.  
  54. bool Lista::inList(const T & e)const
  55. {
  56.     if(empty())
  57.         return false;
  58.        
  59.     Nodo * temp = testa;
  60.     bool trovato = false;
  61.     while(temp && !trovato)
  62.     {
  63.         if(temp->elemento == e)
  64.             trovato = true;
  65.            
  66.         else
  67.             temp = temp->next;
  68.     }//fine while
  69.    
  70.     return trovato;
  71. }//fine inList
  72.  
  73. //------------------------------------------------------------------------------
  74.  
  75. bool Lista::find(const T & e, Nodo * & pos)const
  76. {
  77.     if(empty())
  78.         return false;
  79.        
  80.     Nodo * temp = testa;
  81.     bool trovato = false;
  82.     while(temp && !trovato)
  83.     {
  84.         if(temp->elemento == e)
  85.             trovato = true;
  86.            
  87.         else
  88.         {
  89.             pos = temp;
  90.             temp = temp->next;
  91.         }//fine else    
  92.     }//fine while
  93.    
  94.     return trovato;
  95. }//fine find
  96.  
  97. //------------------------------------------------------------------------------
  98.  
  99. bool Lista::push(const T & e)
  100. {
  101.     if(full())
  102.         return false;
  103.        
  104.     Nodo * q;
  105.     q = new Nodo;
  106.     q->elemento = e;
  107.     q->next = testa;
  108.     testa = q;
  109.     return true;
  110. }//fine push
  111.  
  112. //------------------------------------------------------------------------------
  113.  
  114. bool Lista::Insert(const T & e)
  115. {
  116.     if(full())
  117.         return false;
  118.        
  119.     else if((testa == 0) || (testa->elemento > e)) //l'elemento va inserito in testa
  120.         push(e);
  121.        
  122.     else //altrimenti l'elemento va inserito al centro o in coda
  123.     {
  124.         Nodo * prec = testa;
  125.         Nodo * succ;
  126.         Nodo * q; //allocazione e inizializzazione di un nuovo non da inserire
  127.         q = new Nodo;
  128.         q->elemento = e;
  129.         q->next = 0;
  130.         while((prec->next) && (prec->next->elemento < e))  //si scorre l'intera lista (prec->next)
  131.              prec = prec->next;                        //fin quando gli elementi sono minori di quello da inserire(prec->next->elemento < e)
  132.         succ = prec->next; //succ rappresenta la posizione in cui deve avvenire l'inserimento del nuovo Nodo
  133.         q->next = succ; //queste due righe permettono di collegare il nuovo nodo al resto della lista
  134.         prec->next = q;    
  135.         return true;
  136.     }//fine else
  137.  
  138. }//fine Insert
  139.  
  140. //------------------------------------------------------------------------------
  141.  
  142. bool Lista::pop(T & e)
  143. {
  144.     if(empty())
  145.         return false;
  146.        
  147.     Nodo * temp = testa;
  148.     e = testa->elemento;
  149.     testa = testa->next;
  150.     delete temp;
  151.     return true;
  152. }//fine pop
  153.  
  154. //------------------------------------------------------------------------------
  155.  
  156. bool Lista::Delete(const T & e)
  157. {
  158.     if(empty())
  159.         return false;
  160.        
  161.     else if(testa->elemento == e)
  162.     {
  163.         T value;
  164.         return pop(value);
  165.     }//fine else if
  166.    
  167.     else
  168.     {
  169.         Nodo * posizione;
  170.         if(find(e,posizione)) //la funzione find determina l'indirizzo "posizione" dell'elemento che precede quello da eliminare
  171.         {
  172.             Nodo * temp;
  173.             temp = posizione->next;
  174.             posizione->next = posizione->next->next;
  175.             delete temp;
  176.             return true;
  177.         }//fine if
  178.        
  179.         else
  180.             return false;    
  181.     }//fine else        
  182. }//fine Delete                
  183.  
  184. //------------------------------------------------------------------------------
  185.  
  186. int Lista::getCount()const
  187. {
  188.     int count = 0;
  189.     Nodo * temp = testa;
  190.     while(temp)
  191.     {
  192.         count++;
  193.         temp = temp->next;
  194.     }//fine while
  195.    
  196.     return count;
  197. }//fine getCount
  198.  
  199. //------------------------------------------------------------------------------
  200.  
  201. void Lista::clear()
  202. {
  203.     Nodo * temp = testa;
  204.     while(testa)
  205.     {
  206.         temp = testa;
  207.         testa = testa->next;
  208.         delete temp;
  209.     }//fine while
  210. }//fine clear
  211.  
  212. //------------------------------------------------------------------------------
  213.  
  214. ostream & operator<<(ostream & out, const Lista & L)
  215. {
  216.     if(L.empty())
  217.         out<<" Non ci sono elementi.";
  218.        
  219.     else
  220.     {
  221.         Nodo * temp = L.testa;
  222.         while(temp)
  223.         {
  224.             out<<temp->elemento<<" ";
  225.             temp = temp->next;
  226.         }//fine while
  227.     }//fine else
  228.    
  229.     return out;
  230. }//fine operator<<
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement