c++ - 如何返回函数的指针并用作参数?
问题描述
我不知道这个问题是否能正确表达我的问题,希望解释和代码有所帮助。英语不是我的母语,所以请耐心等待。这是一个家庭作业,所以我不能使用图书馆 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;
}
解决方案
像这样的东西怎么样
node* ptr = list.head;
while ((ptr = list.RightPointer(ptr)) != nullptr)
{
// Do something with the pointer
}
我们首先调用RightPointer
with 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;
}
推荐阅读
- python - 如何优化此代码以更快地工作?猜猜它在算法上写得并不完美
- apache-kafka - 可以将 Kafka Streams 配置为等待 KTable 加载吗?
- facebook - 应用级速率限制,总时间使用计算
- java - 如何使用apache poi在excel数据透视表中生成总和,平均在行标签而不是列标签?
- local-storage - Windows 本地磁盘 (c) 始终显示 0 字节
- cleartool - rcleartool lsactivity 没有 -fmt 选项
- orchardcms - 如何在 Orchard CMS 中启用 gzip 压缩
- laravel - 当我从 mysql 数据库中提取图像时,它不会显示,因为那里有多个图像。我只需要在每一行中显示第一张图片
- html - 在html中为表格的第一列添加水平滚动
- elasticsearch - elasticSearch python API:put_mapping时出错