Helen091. не получил явных ответов на поставленные мной вопросы
2. если пишешь свой контейнер в первый раз, то неплохо перед этим ознакомится с интерфейсом существующих, а не писать совершенно неудобный в реальной жизни интерфейс.
http://www.cplusplus.com/reference/stl/list/3. Похоже вы так и не ознакомились с ранее указанной ссылкой.
Поправил ваш код (ну так слегка, что бы размяться перед работой
): реализовал интерфейс близкий к требованиям стандарта (кстати отсутствие конструктора в вашем коде это очень плохая идея)
template <typename T>
class mylist
{
public:
typedef T value_type;
struct Data
{
Data(Data * p, Data * n, const value_type & v)
: prev(p)
, next(n)
, value(v)
{}
Data* prev;
Data* next;
value_type value;
};
struct Iterator
{
Iterator(Data * v) : value(v) {}
Data * value;
// prefix form
Iterator& operator++()
{
value = value->next;
return *this;
}
// postfix form
Iterator operator++(int)
{
Iterator it = *this;
value = value->next;
return it;
}
// prefix form
Iterator& operator--()
{
value = value->prev;
return *this;
}
// postfix form
Iterator operator--(int)
{
Iterator it = *this;
value = value->prev;
return it;
}
value_type & operator*()
{
return value->value;
}
};
public:
mylist()
: size_(0)
, first_(NULL)
, last_(NULL)
{ }
~mylist()
{
while (first_) // очищаем список при его удалении
{
Data * d = first_->next;
delete first_;
first_ = d;
}
}
Iterator Begin()
{
return Iterator(first_);
}
Iterator End()
{
return Iterator(NULL);
}
value_type & Front() { return first->value; }
value_type & Back() { return last->value; }
size_t Size() { return size_; }
bool Empty() { return size_ == 0; }
void PushBack(const value_type & v)
{
Data * d = new Data(last_, NULL, v);
if(last_)
{
last_->next = d;
last_ = d;
}
else
{
first_ = last_ = d;
}
++size_;
}
void PopBack()
{
if(last_)
{
Data * d = last_;
last_ = last_->prev;
last_->next = NULL;
delete d;
--size_;
}
}
void PushFront(const value_type & v)
{
Data * d = new Data(NULL, first_, v);
if(first_)
{
first_->prev = d;
first_ = d;
}
else
{
first_ = last_ = d;
}
++size_;
}
void PopFront()
{
if(first_)
{
Data * d = first_;
first_ = first_->next;
first_->prev = NULL;
delete d;
--size_;
}
}
void Insert(Iterator i)
{
Data * value = i->value;
Data * prev = value->prev;
Data * next = value->next;
Data * d = new Data(prev, next, value->value);
if(prev)
prev->next = d;
if(next)
next->prev = d;
}
void Remove(Iterator i)
{
Data * value = i->value;
Data * prev = value->prev;
Data * next = value->next;
if(prev)
prev->next = value->next;
if(next)
next->prev = value->prev;
if(value == first_)
first_ = next;
if(value == last_)
last_ = prev;
delete value;
}
private:
size_t size_;
Data * first_;
Data * last_;
};