Как вернуть указатель на функцию и использовать в качестве параметра? - PullRequest
0 голосов
/ 24 сентября 2019

Я не знаю, может ли вопрос правильно выразить мою проблему, надеюсь, объяснение и код помогут.Английский не мой родной язык, так что наберитесь терпения.И это домашнее задание, поэтому я не могу использовать библиотеку, связанную с STL.Как правильно пройти по связанному списку без цикла while / for, вернуть текущий указатель и дать тот же указатель на функцию?(Может быть, взаимная рекурсия? Я просто говорю, может, моя идея ошибочна).

Давайте представим, что что-то происходит (это внешняя переменная, которая дает мне истину) во время выполнения программы.Как я могу продолжать проходить по одному и тому же списку, не всегда начиная с головы?

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

Давайте представим, что у нас есть список чисел (1, 2, 3, 4, 5, 6, 7);Программа запускается, и я возвращаю указатель, который указывает на 1, и это нормально, во время того же выполнения программы, что-то происходит, и мне нужно вернуть 2, снова, что-то происходит снова, затем функция должна вернуть 3 и т. Д.Как я могу это сделать?Код, который вы видите, является идеей того, что я хотел бы сделать.Я не уверен, что то, что я хотел бы сделать, выполнимо, и если нет, что я могу сделать?

struct node {
  int val;
  node* next;
};
class random {
 public:
  node* head = NULL;
  node* create() {
    node* tmp;
    for (int i = 1; i < 8; i = i + 1) {
      tmp = new node;
      tmp->val = i;
      tmp->next = head;
      head = tmp;
    }
    return this->head;
  }
  bool SomethingHappens() {
    if  // somethingHappens
      return true;
  }
  node* RightPointer(node* current) {
    bool somethinghappened;
    somethinghappened = SomethingHappens();
    if (somethinghappened) {
      current = current->next;
    }
    return current;
  }
};
int main(int argc, char** argv) {
  random list;
  list.RightPointer(list.head);

  return 0;
}

1 Ответ

0 голосов
/ 24 сентября 2019

Как насчет чего-то вроде

node* ptr = list.head;
while ((ptr = list.RightPointer(ptr)) != nullptr)
{
    // Do something with the pointer
}

Мы начинаем с вызова RightPointer с list.head (из-за инициализации ptr).Каждый вызов RightPointer либо возвращает один и тот же узел (если ничего не произошло), либо указатель next (если что-то произошло).

Когда вы достигнете конца списка, функция вернет нулевой указатель, который делаетусловие цикла ложно и останавливает итерацию.


Чтобы облегчить чтение кода для начинающего, вышеуказанный цикл эквивалентен следующему:

// Get the first node back from RightPointer
node* ptr = list.RightPointer(list.head);

// Loop while the pointer returned by RightPointer isn't a null pointer
while (ptr != nullptr)
{
    // Do something with the pointer...
    // ...
    // ...
    // ...

    // Get the (possibly) next pointer from RightPointer
    ptr = list.RightPointer(ptr);

    // Note that the above call could return the same node that was passed to it
    // Or it might return ptr->next
    // This means the above assignment could either be equivalent to
    //     ptr = ptr;
    // or
    //     ptr = ptr->next;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...