Для этого задания я должен использовать стандартную реализацию связанного списка [например, class List
, class Node
, class Iterator
, все из учебника по Big C ++] и поменять местами два элемента списка (я предполагаю, что элементы являются узлами), но моя проблема в том, что мы должны взять два Итератора в качестве параметров для свопа.
Итак, похоже, void List::swap(Iterator i1, Iterator i2)
Мой подход к проблеме будь то, что я должен сделать временные переменные, содержащие данные узлов, которые я собираюсь поменять, и их положения, а затем стереть один, вставляя данные другого узла в его положение.
Например, под этим я подразумеваю будет иметь две переменные для i2
: одна содержит свои данные [строку], а другая - ее позицию [которую мы можем найти с помощью функции get()
в классе Iterator
].
Тогда я будет:
- стереть
i1
[используя функцию List::erase(Iterator iter)
] - переместить итератор в положение
i1
- , затем вставить новый узел с данными
i2
[с использованием List::insert(Iterator iter, string s)
]
* 103 0 * Связанные списки все еще новы и сбивают меня с толку, хотя я не уверен, имеет ли смысл что-либо из этого реализовать, и тот факт, что мне нужно использовать два Итератора в качестве параметров, отбрасывает меня.
Любая помощь приветствуется, спасибо, ребята!
РЕДАКТИРОВАТЬ: Вот реализации для List, Node и Iterator. Определения функций заняли бы слишком много места.
Список
class List
{
public:
/**
Constructs an empty list;
*/
List();
/**
Appends an element to the list.
@param data the value to append
*/
void push_back(string data);
/**
Inserts an element into the list.
@param iter the position before which to insert
@param s the value to append
*/
void insert(Iterator iter, string s);
/**
Removes an element from the list.
@param iter the position to remove
@return an iterator pointing to the element after the
erased element
*/
Iterator erase(Iterator iter);
/**
Gets the beginning position of the list.
@return an iterator pointing to the beginning of the list
*/
Iterator begin();
/**
Gets the past-the-end position of the list.
@return an iterator pointing past the end of the list
*/
Iterator end();
void push_front(string s);
void reverse();
void swap(Iterator i1, Iterator i2);
private:
Node* first;
Node* last;
friend class Iterator;
};
Узел
class Node
{
public:
/**
Constructs a node with a given data value.
@param s the data to store in this node
*/
Node(string s);
private:
string data;
Node* previous;
Node* next;
friend class List;
friend class Iterator;
};
Итератор
class Iterator
{
public:
/**
Constructs an iterator that does not point into any list.
*/
Iterator();
/**
Looks up the value at a position.
@return the value of the node to which the iterator points
*/
string get() const;
/**
Advances the iterator to the next node.
*/
void next();
/**
Moves the iterator to the previous node.
*/
void previous();
/**
Compares two iterators
@param b the iterator to compare with this iterator
@return true if this iterator and b are equal
*/
bool equals(Iterator b) const;
private:
Node* position;
List* container;
friend class List;
};