在 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);
}
我有一个简单的问题。我有一个 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);
}