Создание функции подкачки для связанных списков, которая принимает два итератора в качестве параметров? - PullRequest
1 голос
/ 28 февраля 2020

Для этого задания я должен использовать стандартную реализацию связанного списка [например, 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;
};
...