0

私の与えられたコードにいくつかの問題があります。それに応じて動作するので、「transverse」および「transverseR」関数を実装する必要があります。

また、与えられた関数ポインタが何のためにあるのか理解するのに苦労しています:関数ポインタ=> 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
void (*visit)(link)

これは、型リンクを取り、voidを返す関数ポインタです。

例:

機能がありますvoid function1(Link a)

以下のように関数traverseを呼び出すことができます。

traverse (ls, &function1) ;
于 2012-08-10T09:13:02.043 に答える
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

すでに述べたことに加えて、難読化されていない構文を使用すると、コードが理解しやすくなります。

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 に答える