C++/List/your list

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Your own list

  
#include <string>
#include <iostream>
#include <cassert>
using namespace std;
class List;
class Iterator;
class Node
{
public:
   Node(string s);
private:
   string data;
   Node* previous;
   Node* next;
friend class List;
friend class Iterator;
};
class List
{
public:
   List();
   void push_back(string s);
   void insert(Iterator iter, string s);
   Iterator erase(Iterator i);
   Iterator begin();
   Iterator end();
private:
   Node* first;
   Node* last;
};
class Iterator
{
public:
   Iterator();
   string get() const;
   void next();
   void previous();
   bool equals(Iterator b) const;
private:
   Node* position;
   Node* last;
friend class List;
};
Node::Node(string s)
{  
   data = s;
   previous = NULL;
   next = NULL;
}
List::List()
{  
   first = NULL;
   last = NULL;
}
void List::push_back(string s)
{  
   Node* newnode = new Node(s);
   if (last == NULL) 
   {  
      first = newnode;
      last = newnode;
   }
   else
   {  
      newnode->previous = last;
      last->next = newnode;
      last = newnode;
   }
}
void List::insert(Iterator iter, string s)
{  
   if (iter.position == NULL)
   {  
      push_back(s);
      return;
   }
   Node* after = iter.position;
   Node* before = after->previous;
   Node* newnode = new Node(s);
   newnode->previous = before;
   newnode->next = after;
   after->previous = newnode;
   if (before == NULL) 
      first = newnode;
   else
      before->next = newnode;
}
Iterator List::erase(Iterator i)
{  
   Iterator iter = i;
   assert(iter.position != NULL);
   Node* remove = iter.position;
   Node* before = remove->previous;
   Node* after = remove->next;
   if (remove == first)
      first = after;
   else
      before->next = after;
   if (remove == last)
      last = before;
   else
      after->previous = before;
   iter.position = after;
   delete remove;
   return iter;
}
Iterator List::begin()
{  
   Iterator iter;
   iter.position = first;
   iter.last = last;
   return iter;
}
Iterator List::end()
{  
   Iterator iter;
   iter.position = NULL;
   iter.last = last;
   return iter;
}
Iterator::Iterator()
{  
   position = NULL;
   last = NULL;
}
string Iterator::get() const
{  
   assert(position != NULL);
   return position->data;
}
void Iterator::next()
{  
   assert(position != NULL);
   position = position->next;
}
void Iterator::previous()
{  
   if (position == NULL)
      position = last;
   else 
      position = position->previous;
   assert(position != NULL);
}
bool Iterator::equals(Iterator b) const
{  
   return position == b.position;
}
int main()
{  
   List staff;
   staff.push_back("A");
   staff.push_back("B");
   staff.push_back("C");
   staff.push_back("D");
   Iterator pos;
   pos = staff.begin();
   pos.next();
   pos.next();
   pos.next();
   staff.insert(pos, "Reindeer, Rudolf");
   pos = staff.begin();
   pos.next();
   staff.erase(pos);
   for (pos = staff.begin(); !pos.equals(staff.end()); pos.next())
      cout << pos.get() << "\n";
   return 0;
}