Передача связанного списка в функцию и проверка того, что он не изменен - PullRequest
0 голосов
/ 06 октября 2019

Есть ли способ передать связанный список в функцию и убедиться, что он не изменен?

Мы можем передать указатель const head на функцию, и это будет гарантировать, что заголовок не будетмодифицирована. Однако функция может получать доступ к другим узлам из головы и изменять их.

Ответы [ 2 ]

1 голос
/ 06 октября 2019

Может быть, вы захотите попробовать что-то вроде этого:

class Node{
  private: 
    Node* _next;  
  public:        
    Node(Node* next) : _next(next){}

    Node* getNext(){ return _next; }
    const Node* getNext() const {return _next; }
};

ps ИМХО. Программисты C ++ очень часто игнорируют ссылки и используют указатели там, где они не нужны. Может ли это быть вариантом для вашего случая? :)

struct Node{ Node& _next; Node(Node& next) : _next(next){} }; 

PP.SS. Второй getNext может не понадобиться в вашем конкретном случае. Это просто сделать жизнь проще, если у вас есть функции, использующие указатели на константные узлы. В приведенном ниже примере я попытаюсь прояснить идею с помощью const-метода немного подробнее:

#include <iostream>
#include <cstdlib>

class Node{
  private: 
    Node* _next;  
  public:        
    Node(Node* next) : _next(next){}

    Node* getNext(){ std::cout << "getNext\n";  return _next;  }
    const Node * getNext() const { std::cout << "getNext const\n";  return _next; }
};

void f1(Node* node){ node->getNext(); }
void f2(const Node* node){ node->getNext(); }

int main() {
        Node* n1 = new Node(NULL);
        Node* n2 = new Node(n1);        
        f1(n2);
        f2(n2);
}
0 голосов
/ 06 октября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...