我有这个功能:
void TraverseRecursive ( Node * head, void (*visit) (Node *) )
{
if ( head != nullptr )
{
visit( head ) ;
TraverseRecursive( head->next, visit ) ;
}
}
我正试着用main.cpp和
调用它TraverseRecursive ( head, TraverseRecursive ) ;
这给了我错误“类型的参数”void(*)(Node * head,void(* visit)(Node ))“与”void()类型的参数不兼容(节点*)“”
那我怎么称呼它呢?我只是在学习链表,显然不明白是什么
void (*visit) (Node *)
完全意味着。
答案 0 :(得分:1)
第二个参数应该是为列表中的每个节点回调的函数。它只需要一个参数(节点为"访问")。
void visitor(Node *node)
{
printf("%s\n", node->data); // Or whatever
}
TraverseRecursive( head, visitor ) ;
旁注:递归的浪费。如果你很幸运,编译器会优化它。你应该使用
void TraverseRecursive( Node * head, void (*visit) (Node *) )
{
for (; head != nullptr; head = head->next)
{
visit( head ) ;
}
}
答案 1 :(得分:0)
void (*visit) (Node *)
表示“指向函数的指针,该函数采用Node *类型的一个参数并返回void”。但是 TraverseRecurive 需要两个争论者,因此属于不同的类型。 你需要定义一个像
这样的函数void doSomething(Node* n)
{
}
并将其传递给 TraverseRecursive