在 class 中定义变量时共享指针中的递归

Recursion in shared pointers while variable is defined in the class

我有一个简单的问题。我有一个 LinkList class 并且在 class 中启动了 root。

class LinkList {

     struct node {
        int data;
        shared_ptr<node> next;
    };

    shared_ptr<node> root;

    public:
       void insert(int data);
       void remove(int data);
       void print();
       int length();
       bool search_recursive(int data);
       bool search_recursiveUtil(shared_ptr<node> p, int data);
  }

理想情况下,我想实现一个递归函数来搜索节点。现在我是这样实现的:

bool LinkList::search_recursiveUtil(shared_ptr<node> p, int data){

     if(p == nullptr){
        return false;
     }

     if(p->data == data){
        return true;
     }

     return search_recursiveUtil(p->next, data);

}

bool LinkList::search_recursive(int data){

     shared_ptr<node> p = root;
     return search_recursiveUtil(p, data);
}

现在你可以清楚地看到,因为我不希望 root 到达链表的末尾,因为其他函数可能会使用这个头指针来做一些事情,所以我使用共享指针 P 并遍历它。现在我想让 p 传递给 "search_recursive" 函数,但由于它不接受 shared_ptr 参数,所以我不得不支持 "search_recursiveUtil" 函数。

我的问题是这是正确的方法吗?我如何在没有 util 函数支持的情况下实现它?

原则上,这正是要走的路:
您的接口函数具有必要的参数,可以调用具有所需参数的内部函数。这样你就可以隐藏你的 root 成员变量。您 could/should 甚至将您的 util 成员函数声明为私有。

除了考虑为什么使用递归搜索(一旦列表足够大就会很快导致堆栈溢出)而不是迭代搜索,因为指针是按值传递的,所以不需要p:直接调用return search_recursiveUtil(root, data)。您关于到达列表末尾的推理是一种误解。

使用 xUtil 函数获取从外部调用搜索时不需要的位置参数可能是个好主意,只需将其设为私有 class,这样 - 从外部 - 您的界面将只是 search_recursive 函数。

此外,声明两个函数 const,因为它们不应该修改数据。

另一种方法是将 "Util" 函数作为节点成员,这样你就可以

bool LinkList::node::search_recursiveUtil(int src_data){

     if(data == src_data)
        return true;

     if(pnext == nullptr)
        return false;

     return pnext->search_recursiveUtil(src_data);

}

称为

bool LinkList::search_recursive(int data){

     root->search_recursiveUtil(data);
}