Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.88 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. bool charcmp(char, char);
  5.  
  6. template <class T>
  7. struct Elt_t
  8. {
  9.         T data;
  10.         Elt_t<T> * Pred;
  11.         Elt_t<T> * Link;
  12.        
  13. };//NODES
  14.  
  15. template <class T>
  16. class LinkedList
  17. {
  18.         private:
  19.         Elt_t<T> * Head;
  20.         Elt_t<T> * Tail;
  21.         Elt_t<T> * Curs;
  22.         int total;
  23.         public:
  24.         LinkedList();
  25.         LinkedList(const LinkedList & );
  26.         void pushfront(T);
  27.         void pushback(T);
  28.         int size();
  29.         void begin();
  30.         void next();
  31.         void previous();
  32.         void clear();
  33.         void erase();
  34.         bool empty();
  35.         T popback();
  36.         T popfront();
  37.         void remove(T);
  38.         void insert(T);
  39.         void insertInOrder(T, bool (*charcmp)(char a, char b));
  40.         T operator *();
  41.         void operator ++(int);
  42.         void operator --(int);
  43.        
  44. };//List
  45.  
  46. template <class T>
  47. LinkedList<T>::LinkedList()
  48. {
  49.         Head = Tail = NULL;
  50.         Curs = NULL;
  51.         total = 0;
  52. }//List
  53.  
  54. template <class T>
  55. LinkedList<T>::LinkedList(const LinkedList & ListA)
  56. {
  57.     if(ListA.total == 0) //if list empty
  58.     {
  59.         Head = Tail = NULL;
  60.         total = 0;
  61.     }
  62.     else
  63.     {
  64.         Elt_t<T> * Curr = ListA.Head;
  65.         Head = Tail = NULL;
  66.         total = 0;
  67.         while(Curr != NULL)
  68.         {
  69.             Elt_t<T> *Temp = new Elt_t<T>;
  70.             Temp -> Pred = NULL;
  71.             Temp -> Link = NULL;
  72.             Temp -> data = Curr -> data;
  73.             if(total == 0)
  74.                 Head = Tail = Temp;
  75.             else
  76.             {
  77.                 Tail -> Link = Temp;
  78.                 Temp -> Pred = Tail;
  79.                 Tail = Tail -> Link;
  80.             }
  81.             total++;
  82.             Curr = Curr -> Link;
  83.         }
  84.     }
  85. }
  86.  
  87.  
  88. template <class T>
  89. void LinkedList<T>::insert(T newvalue)
  90. {total++;
  91.     if(!empty())
  92.     {
  93.         Elt_t<T> * Temp;
  94.         Temp = new Elt_t<T>;
  95.         Temp -> data = newvalue;
  96.    
  97.         if((Curs -> Link != NULL)&&(Curs -> Pred !=NULL))
  98.         {
  99.         Temp -> Link = Curs -> Link;
  100.         Temp -> Pred = Curs;
  101.         Curs -> Link = Temp;
  102.         Curs = Temp -> Link;
  103.         Curs ->Pred = Temp;
  104.        
  105.         }//inside list
  106.        
  107.         else if(Curs -> Pred ==NULL)
  108.         pushfront(newvalue);
  109.        
  110.         else if(Curs -> Link == NULL)
  111.         pushback(newvalue);
  112.     }//list not empty
  113.     else
  114.         pushback(newvalue);
  115.        
  116. }//insert
  117.        
  118.        
  119.  
  120. template <class T>
  121. void LinkedList<T>::insertInOrder(T value, bool (*charcmp)(char, char))
  122. {
  123.     if(!empty())
  124.     {
  125.             Elt_t<T> * Temp;
  126.             Temp = new Elt_t<T>;
  127.             Temp -> data = value;
  128.         begin();
  129.         while(Curs != NULL && charcmp(Curs ->data, Temp ->data))
  130.         {
  131.             Curs = Curs -> Link;
  132.         }
  133.         if(Curs == NULL)
  134.         pushback(value);
  135.         else if(Curs -> Pred != NULL)
  136.         {
  137.             Temp -> Link = Curs;
  138.             Temp -> Pred = Curs -> Pred;
  139.             Curs -> Pred = Temp;
  140.             Curs = Temp ->Pred;
  141.             Curs -> Link = Temp;
  142.             total++;
  143.         }//inserts if not at end of list
  144.  
  145.         else if(Curs ->Pred == NULL)
  146.             pushfront(value);
  147.      
  148.     }
  149.     else
  150.         pushfront(value);
  151. }
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161. template <class T>
  162. void LinkedList<T>::remove(T value)
  163. {
  164.     if(!empty())
  165.     {
  166.         bool Done = false;
  167.         bool Found = false;
  168.         Curs = Head;
  169.         while((!Done)&&(Curs != NULL))
  170.         {
  171.             if(Curs -> data != value)
  172.             Curs = Curs -> Link;
  173.             else
  174.             {
  175.                 Done = true;
  176.                 Found = true;
  177.             }
  178.         }//while
  179.         if(Found == true)
  180.         erase();
  181.         else
  182.         cout<<"Item not found."<<endl;
  183.     }//if not empty
  184.     else
  185.     cout<<"List Empty"<<endl;
  186. }//Remove
  187.        
  188.  
  189. template <class T>
  190. void LinkedList<T>::operator --(int)
  191. {
  192.     Curs = Curs -> Pred;
  193. }//overloaded -- operator
  194.  
  195. template <class T>
  196. void LinkedList<T>::operator ++(int)
  197. {
  198.     Curs = Curs -> Link;
  199. }//overloaded ++ operator
  200.  
  201. template<class T>
  202. T LinkedList<T>::operator *()
  203. {
  204.     T Temp;
  205.     Temp = Curs -> data;
  206.     return Temp;
  207. }//* overload
  208.  
  209. template <class T>
  210. void LinkedList<T>::previous()
  211. {
  212.     if(!empty())
  213.     if(Curs -> Pred != NULL)
  214.     Curs = Curs -> Pred;
  215. }//Jump Previous
  216.  
  217. template <class T>
  218. void LinkedList<T>::next()
  219. {
  220.     if(!empty())
  221.     if(Curs ->Link != NULL)
  222.     Curs = Curs -> Link;
  223. }//Jump Next
  224.  
  225. template <class T>
  226. T LinkedList<T>::popfront()
  227. {
  228. if(!empty())
  229.  
  230.     {
  231.     T Temp;
  232.     if(Head!=NULL)
  233.         {
  234.         Elt_t<T> * Curr;
  235.         Curr = Head;
  236.         Temp = Curr ->data;
  237.         Head = Head -> Link;
  238.         Head -> Pred =NULL;
  239.         delete Curr;
  240.         }
  241.     else  
  242.         {
  243.         Temp = Head -> data;
  244.         delete Head;
  245.         Head = Tail = NULL;
  246.         }
  247.     total = total -1;
  248.     return Temp;
  249.     }
  250.     else
  251.     cout<<"UnderFlow ERROR"<<endl;
  252.     return NULL;
  253. }
  254.  
  255. template <class T>
  256. T LinkedList<T>::popback()
  257. {   if(!empty())
  258.     {
  259.     T Temp;
  260.     if(Head!=NULL)
  261.         {
  262.         Elt_t<T> * Curr;
  263.         Curr = Tail;
  264.         Temp = Curr ->data;
  265.         Tail = Tail ->Pred;
  266.         Tail -> Link =NULL;
  267.         delete Curr;
  268.         }
  269.     else
  270.         {
  271.         Temp = Head -> data;
  272.         delete Head;
  273.         Head = Tail = NULL;
  274.         }
  275.     total = total -1;
  276.     return Temp;
  277.     }
  278.     else
  279.     cout<<"UnderFlow ERROR"<<endl;
  280.     return NULL;
  281. }
  282.    
  283.  
  284. template <class T>
  285. bool LinkedList<T>::empty()
  286. {
  287. return (total == 0);
  288. }
  289.  
  290. template <class T>
  291. void LinkedList<T>::erase()
  292. {
  293.     if(!empty())
  294.     {
  295.         if((Curs -> Pred != NULL)&&(Curs ->Link != NULL))
  296.         {
  297.         Elt_t<T> * Temp;
  298.         Temp = Curs;
  299.         Curs = Curs ->Pred;
  300.         Curs->Link = Temp ->Link;
  301.         Curs = Curs -> Link;
  302.         Curs -> Pred = Temp ->Pred;
  303.         delete Temp;
  304.         }//Middle
  305.        
  306.         else if(Curs ->Pred == NULL)
  307.         popfront(); //Head
  308.        
  309.         else if(Curs ->Link == NULL)
  310.         popback(); //Tail
  311.        
  312.         total = total -1;
  313.     }//List not empty
  314.    
  315. }
  316.    
  317.    
  318.  
  319.  
  320. template <class T>
  321. void LinkedList<T>::clear()
  322. {
  323.     if(!empty())
  324.     {
  325.     Elt_t<T> * Temp;
  326.     Temp = new Elt_t<T>;
  327.    
  328.     while(Head!=NULL)
  329.         {
  330.    
  331.         Temp = Head;
  332.         Head = Head -> Link;
  333.         delete Temp;
  334.         }
  335.     total = 0;
  336.     Head = Tail = NULL;
  337.     }
  338.    
  339. }//Clear
  340.    
  341.  
  342. template <class T>
  343. void LinkedList<T>::begin()
  344. {
  345.     Curs = Head;
  346. }//Sets Cursor to begining
  347.  
  348.  
  349.  
  350.  
  351. template <class T>
  352. int LinkedList<T>::size()
  353. {
  354.     return total;
  355. }//Returns # items in list
  356.  
  357. template <class T>
  358. void LinkedList<T>::pushback(T newvalue)
  359. {
  360.         Elt_t<T> * Curr;
  361.         Curr = new Elt_t<T>;
  362.         Curr ->data = newvalue;
  363.  
  364.         if((Tail!=NULL)&&(Head!=NULL))
  365.         {
  366.             Curr -> Pred = Tail;
  367.             Curr -> Link = NULL;
  368.             Tail -> Link = Curr;
  369.             Tail = Curr;
  370.         }//List not Empty
  371.         else  
  372.         {
  373.              Curr -> Pred = NULL;
  374.              Curr -> Link = NULL;
  375.              Tail = Curr;
  376.              Head = Curr;
  377.         }//empty list
  378.     total= total +1;
  379.  
  380. }//Add to End
  381.  
  382.  
  383. template <class T>
  384. void LinkedList<T>::pushfront(T newvalue)
  385. {
  386.                 Elt_t<T> * Curr;
  387.                 Curr = new Elt_t<T>;
  388.                 Curr ->data = newvalue;
  389.                 if(Head!=NULL)
  390.                 {
  391.                 Curr -> Link = Head;
  392.                 Head -> Pred = Curr;
  393.                 Head = Curr;
  394.                
  395.                 }
  396.                else
  397.                 {
  398.                         Curr -> Link = NULL;
  399.                         Curr -> Pred = NULL;
  400.                         Head = Curr;
  401.                         Tail = Curr;
  402.                 }
  403.                 total = total+1;
  404.  
  405.  
  406. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement