0

我给定的代码有一些问题。你它相应地工作,我需要实现“横向”和“横向R”功能。

我也很难理解给定的函数指针的用途:Function pointers => void (*visit)(link)

void traverse (link ls, void (*visit)(link)) {
  if (ls == NULL) {
    return;
  }
  (*visit) (ls);
  traverse (ls->next, visit);
  return;
}

void traverseR (link ls, void (*visit)(link)) {
  if (ls == NULL) {
    return;
  }
  traverseR (ls->next, visit);
  (*visit)(ls);
  return;
}


void square (link l) {
  // link tmp = NULL;
  int container = l->item;
  container = SQUARE(container);

  l->item = container;

}

void squareAll (link ls){

  link curr = ls;  
  while (curr != NULL){
    square(curr);
    curr = curr->next;
  }

  ls = curr;
}
4

4 回答 4

0

除了已经说过的内容之外,较少混淆的语法将使代码更容易理解。

typedef void(*visit_t)(link);


void traverse (link ls, visit_t visit) {
  if (ls == NULL) {
    return;
  }

  visit (ls);
  traverse (ls->next, visit);
  return;
}

void traverseR (link ls, visit_t visit) {
  if (ls == NULL) {
    return;
  }

  traverseR (ls->next, visit);
  visit (ls);
  return;
}
于 2012-08-10T09:07:49.833 回答
0

这些函数指针允许您在遍历列表时在每个列表项上使用您自己的函数执行一些自定义操作。例如,您可以编写一个减少每个节点数据的函数:

void decrease_item(link node)
{
  --node->item;
}

当您可以调用traverse(list_head, decrease_item)以减少列表中每个项目的值时。您可以创建一个函数来打印每个元素的项目等。

顺便说一句,在上面的代码中,您可以squareAll以更优雅的方式重写函数:

void squareAll (link ls){
   traverse(ls, square);
}
于 2012-08-10T08:56:43.313 回答
0

Also i have trouble understanding what the given function pointers are for: Function pointers => void (*visit)(link)

您的函数指针可以存储具有以下类型的任何函数的地址:

void ()(link) // a function that takes an argument of type 'link' as first
              // parameter and returns void.
              // ex: void random_func(link param)

visit只是程序中使用的指针名称。您可以声明、分配和执行函数指针,如下所示:

// protoype of an implemented function
int char_to_int(char c);
// your pointer declaration
int (*pointer_name)(char);
// assignment
pointer_name = &char_to_int;
// use of a function pointer
(*pointer_name)(some_character);
于 2012-08-10T09:04:21.010 回答
0
void (*visit)(link)

这是一个函数指针,它采用类型链接并返回一个 void。

例如:

有一个功能void function1(Link a)

您可以调用函数遍历,如下所示:

traverse (ls, &function1) ;
于 2012-08-10T09:13:02.043 回答