Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef LISTA_H
- #define LISTA_H
- #include <iostream>
- #include <string>
- #include <sstream>
- using namespace std;
- template<class T>
- class Node
- {
- public:
- T data;
- public:
- Node<T>* prev;
- Node<T>* next;
- Node(T value)
- {
- data = value;
- }
- ~Node()
- {
- }
- const T getData() const
- {
- return data;
- }
- void setData(T value)
- {
- data = value;
- }
- string toString()
- {
- stringstream s;
- s << this->getData();
- return s.str();
- }
- };
- template<class T>
- class Lista
- {
- public:
- int size;
- Node<T>* head;
- Node<T>* tail;
- public:
- Lista()
- {
- head = nullptr;
- tail = nullptr;
- size = 0;
- }
- ~Lista()
- {
- clear();
- }
- void push_back(const T value)
- {
- if (size == 0)
- {
- push_front(value);
- return;
- }
- Node<T>* temp = new Node<T>{ value };
- tail->next = temp;
- temp->prev = tail;
- tail = temp;
- size++;
- }
- void push_front(const T value)
- {
- Node<T>* temp = new Node<T>{ value };
- temp->next = head;
- if (head != nullptr)
- {
- head->prev = temp;
- }
- head = temp;
- if (size == 0)
- {
- tail = head;
- }
- size++;
- }
- void remove_back()
- {
- if (size == 0)
- {
- cout << "Nie mam czego usunac - lista pusta" << endl;
- return;
- }
- if (size == 1)
- {
- remove_front();
- return;
- }
- Node<T>* temp = tail;
- tail = tail->prev;
- tail->next = nullptr;
- delete temp;
- size--;
- }
- void remove_front()
- {
- if (size == 0)
- {
- cout << "Nie mam czego usunac - lista pusta ";
- return;
- }
- Node<T>* temp = head;
- head = head->next;
- if (head != nullptr)
- {
- head->prev = nullptr;
- }
- delete temp;
- size--;
- }
- void error() {
- cout << "Blad" << endl;
- exit(EXIT_FAILURE);
- }
- T return_by_index(const int index)
- {
- Node<T>* temp = head;
- if (index<0 || index>size)
- {
- error();
- }
- for (int i = 0; i < index; i++)
- {
- temp = temp->next;
- }
- return temp->getData();
- }
- void replace(int index, const T& value)
- {
- if (index<0 || index>size)
- {
- error();
- }
- Node<T>* temp = head;
- for (int i = 0; i < index; i++)
- {
- temp = temp->next;
- }
- temp->data = value;
- }
- Node<T>* search(const T& value, int (*data)(T, T))
- {
- if (size == 0)
- {
- return NULL;
- }
- Node<T>* temp = head;;
- for (int i = 0; i < size; i++)
- {
- if (!data(temp->getData(), value))
- {
- return temp;
- }
- temp = temp->next;
- }
- error();
- }
- bool remove_by_value(const T& value, int (*data)(T, T))
- {
- int j = 0;
- Node<T>* temp = head;
- Node<T>* temp_next;
- Node<T>* temp_prev;
- Node<T>* del;
- for (int i = 0; i < size; i++)
- {
- if (!data(temp->getData(), value))
- {
- del = temp;
- temp_prev = del->prev;
- temp_next = del->next;
- temp_prev->next = temp_next;
- temp_next->prev = temp_prev;
- temp = temp->next;
- delete del;
- size--;
- j = 1;
- return true;
- }
- else
- {
- temp = temp->next;
- }
- }
- return false;
- }
- void insert(int index, const T& value)
- {
- if (size == 0)
- {
- push_front(value);
- return;
- }
- if (index == size)
- {
- push_back(value);
- return;
- }
- if (index<0 || index>size)
- {
- error();
- }
- Node<T>* temp = new Node<T>{ value };
- Node<T>* temp_next;
- Node<T>* temp_prev = head;
- for (int i = 0; i < index - 1; i++)
- {
- temp_prev = temp_prev->next;
- }
- temp_next = temp_prev->next;
- temp_prev->next = temp;
- temp_next->prev = temp;
- temp->next = temp_next;
- temp->prev = temp_prev;
- size++;
- }
- void clear()
- {
- Node<T>* temp = tail;
- Node<T>* del;
- while (size != 0)
- {
- del = temp;
- temp = temp->prev;
- /*
- del->prev = nullptr;
- temp->next = nullptr;
- */
- delete del;
- size--;
- }
- }
- void print(int a) const
- {
- Node<T>* temp = head;
- cout << "Rozmiar listy: " << size << endl;
- cout << "Adres listy: " << head << endl;
- cout << "Poczatkowe elementy" << "(" << a << ")" << endl;
- for (int i = 0; i < a; i++)
- {
- cout << temp->getData() << endl;
- temp = temp->next;
- }
- }
- };
- #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement