Advertisement
Karolina99

Singly linked list

Nov 17th, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.54 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Elem
  6. {
  7. private:
  8.     int v; //key, data
  9.     Elem* next_elem; //next
  10.  
  11. public:
  12.     Elem();             //tworzy pusty element, konstruktor
  13.     Elem(int x);            //tworzy element przechowujący x, drugi konstruktor
  14.     int value();            //zwraca wartość v
  15.     void setValue(int v);       //ustawia warość v
  16.     Elem* next();           //zwraca następny element
  17.     void setNext(Elem* p);      //ustawia p jako następny element
  18. };
  19.  
  20. Elem::Elem()
  21. {
  22.     next_elem = NULL;
  23.     v = 0; //zeby byla jakas wartosc
  24. }
  25.  
  26. Elem::Elem(int x)
  27. {
  28.     next_elem = NULL;
  29.     v = x;
  30. }
  31.  
  32. int Elem::value()
  33. {
  34.     return v;
  35. }
  36.  
  37. void Elem::setValue(int v)
  38. {
  39.     this->v = v; //stary v staje sie nowym v, ten obiekt, do którego sie konkretnie odwołuje
  40. }
  41.  
  42. Elem* Elem::next()
  43. {
  44.     return next_elem;
  45. }
  46.  
  47. void Elem::setNext(Elem* p)
  48. {
  49.     next_elem = p;
  50. }
  51.  
  52. class SortedSLList
  53. {
  54. private:
  55.     Elem* head;         //wskaźnik na pierwszy element list
  56.     Elem* tail;         //wskaźnik na ostatni element list
  57.     int list_size;          //długość listy
  58.  
  59. public:
  60.     SortedSLList();             //tworzy pustą listę, konstruktor
  61.     bool empty();               //zwraca prawdę jeśli lista pusta, fałsz w przeciwnym przypadku
  62.     int size();             //zwraca wielkość listy (liczbę elementów w liście)
  63.     Elem* first();              //zwraca pozycję pierwszego elementu
  64.     Elem* last();               //zwraca pozycję ostatniego elementu
  65.     Elem* next(Elem* p);            //zwraca pozycję elementu następnego za p
  66.     Elem* prev(Elem* p);            //zwraca pozycję elementu poprzedzającego p
  67.     int retrieve(Elem* p);          //zwraca element z pozycji p
  68.     Elem* locate(int x);            //zwraca pozycję pierwszego wystąpienia elementu x, NULL jeśli x nie występuje, wyszukiwanie liniowe
  69.     void insert(int x);             //wstawia x z zachowniem porządku
  70.     void del(int x);                //usuwa pierwsze wystąpienie element x
  71.     void delAllx(int x);     //usuwa wszytkie wystapienia elementu x
  72.     void clear();               //usuwa całą listę
  73.     friend ostream& operator<<(ostream& out, SortedSLList& l); //wypisuje elementu listy
  74. };
  75.  
  76. SortedSLList::SortedSLList()
  77. {
  78.     head = NULL;
  79.     tail = NULL;
  80.     list_size = 0;
  81. }
  82.  
  83. bool SortedSLList::empty()
  84. {
  85.     /**if (list_size == 0)
  86.     {
  87.         return true;
  88.     }
  89.     else
  90.     {
  91.         return false;
  92.     }**/
  93.  
  94.     if (list_size == 0)
  95.         return true;
  96.     return false;
  97. }
  98.  
  99. int SortedSLList::size()
  100. {
  101.     return list_size;
  102. }
  103.  
  104. Elem* SortedSLList::first()
  105. {
  106.     return head;
  107. }
  108.  
  109. Elem* SortedSLList::last()
  110. {
  111.     return tail;
  112. }
  113.  
  114. Elem* SortedSLList::next(Elem* p)
  115. {
  116.     /**if (empty() || head == tail) //lista jest pusta lub jednoelementowa
  117.     {
  118.         return NULL;
  119.     }
  120.     else if (p == tail) //p jest ogonem
  121.     {
  122.         return NULL;
  123.     }**/
  124.  
  125.     if (empty())
  126.         return NULL;
  127.     else if (head == tail)
  128.         return NULL;
  129.     else if (p == tail)
  130.         return NULL;
  131.     return p->next(); //strzałka bo p jest wskaznikiem
  132. }
  133.  
  134. Elem* SortedSLList::prev(Elem* p)
  135. {
  136.     /**if (empty() || head==tail)
  137.     {
  138.         return NULL;
  139.     }
  140.     if (p == head)
  141.     {
  142.         return NULL;
  143.     }**/
  144.  
  145.     if (empty())
  146.         return NULL;
  147.     else if (head == tail)
  148.         return NULL;
  149.     else if (p == head)
  150.         return NULL;
  151.     Elem* temp = head;
  152.     while (temp->next() != p)
  153.     {
  154.         temp = temp->next();
  155.     }
  156.     return temp;
  157. }
  158.  
  159. int SortedSLList::retrieve(Elem* p)
  160. {
  161.     /**if (empty()) return NULL;
  162.     else return p->value();**/
  163.  
  164.     if (empty())
  165.         return NULL;
  166.     return p->value();
  167. }
  168.  
  169. Elem* SortedSLList::locate(int x)
  170. {
  171.     if (empty())
  172.     {
  173.         return NULL;
  174.     }
  175.     Elem* p = head;
  176.     while (p->value() != x)
  177.     {
  178.         if (p == tail)
  179.             return NULL;
  180.         p = p->next();
  181.     }
  182.  
  183.     return p;
  184. }
  185.  
  186. void SortedSLList::insert(int x)
  187. {
  188.     if (empty())
  189.     {
  190.         head = new Elem(x); //wywolujemy drugi konstruktor, tworze pierwszy element listy
  191.         tail = head;
  192.         list_size++;
  193.  
  194.         //drugi sposob, mysle, ze jest tez ok
  195.         //Elem* p = new Elem(x);
  196.         //head = tail = p;
  197.         //list_size++;
  198.     }
  199.     else
  200.     {
  201.         if (head->value() >= x) //tworze nowy element przed dochczasowa head
  202.         {
  203.             Elem* p = new Elem;
  204.             p->setValue(x);
  205.             p->setNext(head);
  206.             head = p;
  207.             list_size++;
  208.         }
  209.         else
  210.         {
  211.             if (head == tail) //jesli lista jest jednoelementowa i nowy element jest wiekszy od head to tworze nowy tail
  212.             {
  213.                 tail = new Elem(x);
  214.                 tail->setValue(x);
  215.                 head->setNext(tail);
  216.                 list_size++;
  217.             }
  218.             Elem* p = head;
  219.             while (p->next()->value() < x)
  220.             {
  221.                 p = p->next();
  222.                 if (tail == p) //nowy element jest wiekszy od dotychczasowego tail, czyli tworze nowy tail
  223.                 {
  224.                     tail = new Elem(x);
  225.                     tail->setValue(x);
  226.                     p->setNext(tail);
  227.                     list_size++;
  228.                     break;
  229.                 }
  230.             }
  231.             Elem* newElem = new Elem(x); //tworze nowy element wewnatrz listy
  232.             newElem->setNext(p->next());
  233.             p->setNext(newElem);
  234.             list_size++;
  235.         }
  236.     }
  237.  
  238.     //kod ponizej dziala zle, w jednym miejscu jest blad
  239.     /**if (empty()) //jesli lista jest pusta
  240.     {
  241.         Elem* p = new Elem(x);
  242.         head = tail = p;
  243.         list_size++;
  244.     }
  245.     else //jesli lista nie jest pusta
  246.     {
  247.         if (head == tail)  //lista jest jednoelementowa
  248.         {
  249.             if (x <= head->value()) //new head
  250.             {
  251.                 Elem* p = new Elem(x);
  252.                 p->setNext(head);
  253.                 tail=head;
  254.                 head = p;
  255.                 list_size++;
  256.             }
  257.             else //new tail
  258.             {
  259.                 Elem* p = new Elem(x);
  260.                 tail->setNext(p);
  261.                 head=tail;
  262.                 tail = p;
  263.                 list_size++;
  264.             }
  265.         }
  266.         else //lista nie jest jednoelementowa, czyli jest co najmniej dwuelementowa
  267.         {
  268.             if (x <= head->value()) //new head
  269.             {
  270.                 Elem* p = new Elem(x);
  271.                 p->setNext(head);
  272.                 head = p;
  273.                 list_size++;
  274.             }
  275.             else if (x >= tail->value())
  276.             {
  277.                 Elem* p = new Elem(x);
  278.                 tail->setNext(p);
  279.                 tail = p;
  280.                 list_size++;
  281.             }
  282.             else //wstawiam elemnt pomiedzy head i tail
  283.             {
  284.                 Elem* p = new Elem(x);
  285.                 Elem* temp = head;
  286.                 while (temp != tail)
  287.                 {
  288.                     if ((p->value() >= temp->value()) && (p->value() <= temp->next()->value()))
  289.                     {
  290.                         p->setNext(temp->next());
  291.                         temp->setNext(p);
  292.                         list_size++;
  293.                         break;
  294.                     }
  295.                     temp = temp->next();
  296.                 }
  297.             }
  298.         }
  299.     }**/
  300. }
  301.  
  302. void SortedSLList::del(int x)
  303. {
  304.     Elem* p = locate(x);
  305.     if (p == NULL)
  306.         return;
  307.     else if (p == head)
  308.     {
  309.         head = head->next();
  310.         delete p;
  311.         list_size--;
  312.     }
  313.     else if (p != tail)
  314.     {
  315.         Elem* prev = this->prev(p);
  316.         prev->setNext(p->next());
  317.         delete p;
  318.         list_size--;
  319.     }
  320.     else
  321.     {
  322.         Elem* prev = this->prev(p);
  323.         tail = prev;
  324.         tail->setNext(NULL);
  325.         delete p;
  326.         list_size--;
  327.     }
  328. }
  329.  
  330. void SortedSLList::clear()
  331. {
  332.     if (empty())
  333.     {
  334.         return;
  335.     }
  336.     else
  337.     {
  338.         while (head != NULL)
  339.         {
  340.             Elem* p = head;
  341.             head = head->next();
  342.             delete p;
  343.         }
  344.     }
  345. }
  346.  
  347. void SortedSLList::delAllx(int x)
  348. {
  349.     if (empty())
  350.         return;
  351.     else
  352.     {
  353.         Elem* p = locate(x);
  354.         while(p != NULL)
  355.         {
  356.             p = locate(x);
  357.             if (p == NULL)
  358.                 break;
  359.             Elem* previous = prev(p);
  360.             if (previous != NULL)
  361.             {
  362.                 previous->setNext(p->next());
  363.                 delete p;
  364.             }
  365.             else
  366.             {
  367.                 head = head->next();
  368.                 delete p;
  369.             }
  370.         }
  371.  
  372.         /*
  373.         Elem* p;
  374.         while (true)
  375.         {
  376.             p = locate(x);
  377.             if(p == NULL)
  378.                 break;
  379.             Elem* previous = prev(p);
  380.             if (previous != NULL)
  381.             {
  382.                 previous->setNext(p->next());
  383.                 delete p;
  384.             }
  385.             else
  386.             {
  387.                 head = head->next();
  388.                 delete p;
  389.             }
  390.         }*/
  391.     }
  392. }
  393.  
  394. ostream& operator<<(ostream& out, SortedSLList& l)
  395. {
  396.     if (l.head == NULL)
  397.         return out;
  398.     Elem* temp = l.head;
  399.     do {
  400.         out << temp->value() << " ";
  401.         temp = temp->next();
  402.     } while (temp != l.tail);
  403.     return out;
  404. }
  405.  
  406. int main()
  407. {
  408.     SortedSLList lista;
  409.     lista.insert(5);
  410.     lista.insert(5);
  411.     lista.insert(5);
  412.     lista.insert(2);
  413.     lista.insert(2);
  414.     lista.insert(6);
  415.     lista.insert(1);
  416.     lista.insert(6);
  417.     cout << lista;
  418.     cout << endl;
  419.  
  420.     lista.delAllx(2);
  421.     cout << lista;
  422.     return 0;
  423. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement