Параметризованный конструктор для связанного списка на основе узлов - PullRequest
1 голос
/ 19 апреля 2019

Я в CS2, и мы только изучаем связанные списки, и мне нужно кодировать параметризованный конструктор класса связанного списка (на основе узлов).Я не очень понимаю списки узлов, поэтому любая помощь в том, что здесь происходит или как подойти, будет полезна!У меня есть следующий класс Node:

class Node {

friend class NodeList;

public:
 Node() : m_next(NULL) {}
 Node(const DataType& data, Node* next = NULL) :
        m_next(next), m_data(data) {}
 Node(const Node& other) : m_next(other.m_next),
                           m_data(other.m_data) {}

 DataType& data() { return m_data; }

 const DataType& data() const { return m_data; }

private:
 Node* m_next;
 DataType m_data;
};

, и я пытаюсь создать параметризованный конструктор для следующего класса:

Class NodeList {
    public:
     NodeList();
     NodeList(size_t count, const int value);
    private:
     Node* m_head;
}

, где должен иметься параметризованный конструкторузлы 'count' инициализированы значением 'value'.

Спасибо!

1 Ответ

1 голос
/ 19 апреля 2019

Решение такой проблемы состоит из 3 частей.

  • Разбейте проблему на более мелкие, более простые задачи, облегчающие решение
  • Выполните меньшие задачи
  • Используйте их для решения большой проблемы.

Что облегчит решение этой проблемы? Добавление одного значения в список проще, чем добавление нескольких значений в список, поэтому давайте напишем для этого функцию.

Чтобы добавить одно значение в начале списка,

  • Мы можем создать новый узел с этим значением
  • У нас есть новый узел, указывающий на текущийпервый узел
  • Мы устанавливаем текущий первый узел на новый узел.

Давайте назовем нашу функцию prepend, так как она добавляет значение в список.

class NodeList {
   public:
    // The head should be set to null initially
    NodeList() 
      : m_head(nullptr) 
    {
    }
    // This function takes a value and adds it to the beginning of the list
    void prepend(const DataType& value) {
        // The new node uses the current head as the next value
        Node* newNode = new Node(value, m_head); 
        // We set the current head to the new node. 
        m_head = newNode; 
    }

Теперь добавить значение несколько раз просто.Мы можем просто вызывать prepend один раз для каждого добавляемого элемента.

class NodeList {
   public:
    // The head should be set to null initially
    NodeList() 
      : m_head(nullptr) 
    {
    }
    // This function takes a value and adds it to the beginning of the list
    void prepend(const DataType& value) {
        // The new node uses the current head as the next value
        Node* newNode = new Node(value, m_head); 
        // We set the current head to the new node. 
        m_head = newNode; 
    }

    NodeList(size_t count, const DataType& value) 
      : m_head(nullptr) // The head still has to be null initially
    {
        for(size_t i = 0; i < count; i++) 
        {
           prepend(value); 
        }
    }
};
...