c++ - 如何将指针的值存储在递归函数中?
问题描述
现在假设我想编写一个函数,递归地搜索链表中的某个节点。当我成功到达目标节点时,该函数将通过引用返回它的 ID 和其他信息,其中它的 ID 将通过结构存储:
struct P{
int ID;
int some_info;
P* next_node;
}
该功能将类似于
void search(int targeted_ID, P*& current_node){
P* c = current_node;
if(c->ID == targeted_ID){
current_node = c;
}
if(c->next_node == nullptr){
return;
}
else{
search(ID, current_node->next_node);
}
}
输出语句将类似于
cout << "The targeted node have ID= " << current_node->ID << "with" << current_node->some_info << endl;
但是,这个函数会自己递归调用,直到所有节点都到达并检查完,并且在current_node
整个过程中指针的值会不断变化。
主要问题是如何在递归时保持它的值不变。
ps 存在以下限制:
- 无法添加任何全局变量
- 不能使用任何静态变量
- 不能在 void 函数中添加任何参数
- 无法使用数组
- 无法更改
struct
的内容 - 输出语句不能更改
- 不能用
goto
解决方案
正如@Ted Lyngmo 指出的那样,我只是编码了一点,你必须返回一个值,所以你不能使用 void 函数。
这是代码:
#include <iostream>
struct P {
int ID;
int some_info;
P* next_node;
};
P* newNode(int ID, int some_info) {
P* temp = new (std::nothrow) P;
if (temp == nullptr){
return nullptr;
}
else {
temp->ID = ID;
temp->some_info = some_info;
temp->next_node = nullptr;
return temp;
}
}
P* search(int targeted_ID, P* current_node) {
// check if current node is valid
if (current_node == nullptr) {
return nullptr;
}
// check for ID of current node
else if (current_node->ID == targeted_ID) {
return current_node;
}
// this node isn't the desired one --> go to nex node
else {
return search(targeted_ID, current_node->next_node);
}
}
void freeMem(P* list) {
P* tmp = nullptr;
while (list != nullptr) {
tmp = list->next_node;
delete list;
list = tmp;
}
}
int main()
{
P* list = nullptr;
P* tmp = nullptr;
P* lastNode = nullptr;
// populate list
for (int i = 0; i < 10; ++i) {
tmp = newNode(i, i * 10);
if (tmp == nullptr) {
// error occured
// free memory
freeMem(list);
list = nullptr;
return -1;
}
if (list == nullptr) {
// first node
list = tmp;
lastNode = list;
}
else {
lastNode->next_node = tmp;
lastNode = tmp;
}
}
tmp = nullptr;
lastNode = nullptr;
int ID_to_find = 1;
P* node = search(ID_to_find, list);
if (node == nullptr) {
// node not found ...
std::cout << "node not found" << std::endl;
}
else {
// node found
std::cout << "node found at: " << node << std::endl;
}
freeMem(list);
list = nullptr;
return 0;
}
这段代码有效,但它不是真正的 C++,它更像 C。如果你想编写 C++ 代码,请使用 STL-Containers,不要编写自己的列表,因为它更具可读性并且有机会拥有一个错误要小得多。还要考虑使用异常而不是(std::nothrow)
.
推荐阅读
- java - Java中的自定义排序算法?
- javascript - 如果最终用户无论如何都没有得到所有这些,节点模型文件夹怎么会这么大?
- reactjs - 解析模块说明符时出错:从 API 进行动态导入时做出反应
- c - 使用 C 中的不同进程更改整数的值,出了什么问题?
- .net - 在基于事件的系统中,日志记录应该是它自己的微服务吗?
- list - 谷歌表格 - 过滤列表排除其他列表中的值
- react-native - 从 API 接收 [object object]
- matplotlib - 使用限制时的 Matplotlib 边距/填充
- angular - 无法将 Angular 表单提交到本地电子邮件客户端
- python - 可视化两个数值数组之间的差异