2

head_insertリンクされたリストの先頭に新しいノードを挿入するコードの下に添付しています。関数は で呼び出されhead_insert(head)ます。

関数の最初の引数の構文についてはよくわかりません。代わりに期待しNodePtr ていたのは、既にポインターであるためです。以下を参照してください。

head が既にポインターであるためだけNodePtr &headでなく、コードが使用するのはなぜですか?NodePtr head

void head_insert(NodePtr & head, int the_number)
{
  NodePtr temp_ptr;
  temp_ptr=new Node;
  temp_ptr->data=the_number;
  temp_ptr->link=head;
  head=temp_ptr;
}


struct Node
{
  int data;
  Node *link;
};

typedef Node* NodePtr;
4

2 に答える 2

0

あなたの typedef は、一見すると少し混乱します。C では、struct Node ** head引数を渡し、その値を新しく作成されたノードに割り当てる必要があります*head = temp_ptr;。これは次のようになります。

void head_insert(struct Node **head, int the number)
{
    struct Node *new_head = NULL;
    // Alloc memory for new_head, etc..
    new_head->data = the_number;
    new_head->link = *head;
    *head = new_head;
}

したがって、割り当てを行う*head = new_headには、ポインターでもあるリストヘッドへのポインターが必要です。それ以外の場合、関数で実行される更新はローカルのままになります。コードでは、ポインターへの参照を取得します。これは、「ダブル」ポインターを渡すのと同じ効果しかありません。

于 2013-02-18T07:54:12.940 に答える