Witam, mam prosbe czy moglibyscie mi pomóc, jak zmienic ta liste jednokierunkowa na dwukierunkowa wiem ze trzeba dodac node<T> *ogon
; tylko nie wiem jak go zaimplementowac w funkcjach prosze o pomoc :)
#include <iostream>
using namespace std;
template <class T>
struct node
{
T data;
node<T> *next;
node<T> *prev;
};
template <class T>
class Kontener
{
public:
//constructs a new empty Kontener
Kontener()
{
glowa = new node<T>;
glowa->next = glowa;
glowa->prev = glowa;
};
//constructs a new jp_list that is a copy of an existing list
Kontener(const Kontener<T>& rt_side)
{
glowa = new node<T>;
glowa->next = glowa;
glowa->prev = glowa;
node<T> *crt_ptr = rt_side.glowa->next;
while(crt_ptr != rt_side.glowa)
{
push_back(crt_ptr->data);
crt_ptr = crt_ptr->next;
}
};
//adds a data node to the front of the list
void push_front(T nw_data)
{
node<T> *temp = new node<T>;
temp->data = nw_data;
temp->next = glowa->next;
glowa->next->prev = temp;
temp->prev = glowa;
glowa->next = temp;
};
//adds a data node to the end of the list
void push_back(T nw_data)
{
node<T> *temp = new node<T>;
temp->data = nw_data;
glowa->prev->next = temp;
temp->prev = glowa->prev;
temp->next = glowa;
glowa->prev = temp;
};
//removes the first node and returns the data
T pop_front()
{
node<T> *temp = glowa->next;
T temp_data = glowa->next->data;
glowa->next = temp->next;
temp->next->prev = glowa;
delete temp;
return temp_data;
};
//removes the last node and returns the data
T pop_back()
{
node<T> *temp = glowa->prev;
T temp_data = glowa->prev->data;
glowa->prev = temp->prev;
temp->prev->next = glowa;
delete temp;
return temp_data;
};
//resturns the size of the list
int size()
{
int size = 0;
node<T> *crt_ptr; //pointer to current node
crt_ptr = glowa->next;
while(crt_ptr != glowa)
{
size += 1;
crt_ptr = crt_ptr->next; //advance to the next node then loop
}
return size;
};
//prints out all the data in the list
void display_all()
{
node<T> *crt_ptr = glowa->next;
for(int i = 0; crt_ptr != glowa; i++)
{
cout << "Node " << (i+1) << ": " << crt_ptr->data << endl;
crt_ptr = crt_ptr->next;
}
};
Kontener& operator= (const Kontener& rt_side)
{
if(this == &rt_side)
return *this;
node<T> *crt_ptr = glowa->next;
//empty this list so the rt_side can be coppied in
while(crt_ptr != glowa)
{
crt_ptr = crt_ptr->next;
pop_front();
}
crt_ptr = rt_side.glowa->next;
while(crt_ptr != rt_side.glowa)
{
push_back(crt_ptr->data);
crt_ptr = crt_ptr->next;
}
return *this;
};
virtual ~Kontener()
{
int list_size = size();
for(int i = 0; i < list_size; i++)
{
pop_front();
}
delete glowa;
};
private:
node<T> *glowa;
};
#endif