2

head->next が NULL の場合に備えて、head 構造を NULL にしたい。ただし、関数に渡してnullにすると機能しません。

void remove(struct node* head)
{
 int val;

 cout << "Enter a value to delete: ";
 cin >> val;

 if (head->next == NULL)
  if (head->data == val)
   head = NULL;
}

関数に渡されなくても正常に動作しますが、メイン関数で直接実行されます。どこが間違っていますか?

4

2 に答える 2

4

に引数として渡されたポインタがremove関数にコピーされています。関数のhead内部はそのポインタのコピーです。そのコピーをに設定しNULL、外側のものは変更されません。参照によってポインターを取得するだけです。

void remove(struct node*& head)
{
  // ...
}

の型のアンパサンドに注意してくださいhead。これは、「へのポインタへの参照」であることを意味しnode、渡されたオブジェクトのコピーではなく、正確に参照できるようにします。

于 2013-03-23T17:10:38.063 に答える
3

問題は、それが指しているポインタを変更できるポインタを渡していることですがnode、ポインタ自体は値で渡されるため、ポインタ自体を変更することはできません。removeしたがって、関数でこれを行うことはできません。

node = NULL;

人々があなたに与えた解決策は、ポインタへの参照として渡すことでnode *&headあり、これは完全にうまく機能します。nodeただし、この種のこと (ポインター自体を変更すること) の一般的な規則は、二重ポインター (つまり、へのポインターへのポインター)を渡すことであることを知りたいと思います。

void remove(node **head) { ... }

次に、メインでポインターのアドレスを渡します。

node *theHead = blah;
remove(&theHead);

次にremove、ポインターの値を変更できます。

*head = NULL;

もちろん、逆参照することもできます。

(*head)->next; // etc
于 2013-03-23T17:19:27.347 に答える