共享指针中的递归,而变量在类中定义

Recursion in shared pointers while variable is defined in the class

本文关键字:变量 定义 指针 递归 共享      更新时间:2023-10-16

我有一个简单的问题。我有一个 LinkList 类,根是在类内启动的。

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 功能支持的情况下实现这一点?

除了考虑为什么使用递归搜索(一旦列表变得足够大,很快就会导致堆栈溢出(而不是迭代搜索之外,由于指针是按值传递的,因此不需要p:只需调用return search_recursiveUtil(root, data)即可。你的理由是到达列表的末尾是一种误解。

从外部调用搜索时,使用 xUtil 函数获取不需要的位置参数可能是一个好主意,只需将其设置为类的私有,以便从外部 - 您的接口将只是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);
}

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