如何在C ++中调用递归链表遍历函数

时间:2014-05-31 23:17:40

标签: c++ list recursion linked-list traversal

我有这个功能:

    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 *)

完全意味着。

2 个答案:

答案 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