首页 > 解决方案 > 如何返回函数的指针并用作参数?

问题描述

我不知道这个问题是否能正确表达我的问题,希望解释和代码有所帮助。英语不是我的母语,所以请耐心等待。这是一个家庭作业,所以我不能使用图书馆 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;
}

标签: c++linked-list

解决方案


像这样的东西怎么样

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

我们首先调用RightPointerwith 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;
}

推荐阅读