我有这个函数:
void TraverseRecursive ( Node * head, void (*visit) (Node *) )
{
if ( head != nullptr )
{
visit( head ) ;
TraverseRecursive( head->next, visit ) ;
}
}
我试着用在main.cpp中调用它
TraverseRecursive ( head, TraverseRecursive ) ;
这给了我错误"类型为"void(*((节点*头,void(*visit((节点("的参数"与类型为"void(((节点*("的参数不兼容
那么我该如何正确地称呼它呢?我只是在学习链表,显然不明白是什么
void (*visit) (Node *)
意味着一切。
第二个参数应该是为列表中的每个节点回调的函数。它只需要一个参数(要"访问"的节点(。
void visitor(Node *node)
{
printf("%sn", node->data); // Or whatever
}
TraverseRecursive( head, visitor ) ;
旁注:递归的使用真是浪费。如果幸运的话,编译器会对它进行优化。你应该使用
void TraverseRecursive( Node * head, void (*visit) (Node *) )
{
for (; head != nullptr; head = head->next)
{
visit( head ) ;
}
}
void (*visit) (Node *)
意思是"指向一个函数的指针,该函数接受Node*类型的一个参数并返回void"。但是TraverseRecurive采用两个自变量,因此类型不同。你需要定义一个类似的函数
void doSomething(Node* n)
{
}
并将其传递给TraverseRecursive