0

関数への単一ポインターの代わりに二重ポインターを渡すことを意図した多くのリンクリスト関数とC関数に遭遇しました。たとえば、リンクリストへのソートされた挿入のための以下の関数:

    void sortedinsert(struct node **headref,struct node *newnode)
    {
           while(*headref!=NULL&&(*headref)->data<newnode->data)
                   headref=&((*headref)->next);
           newnode->next=headref;
           *headref=newnode;
    }

シングルポインタの代わりに関数の引数としてダブルポインタを使用する方法と、リンクリストに対して上記のように関数を簡単に記述できる方法について説明してください。

4

3 に答える 3

2

この「ダブルポインタ」は、ポインタへのポインタです。これにより、呼び出し元のポインターのコピーはsortedinsert、リストのヘッド項目を更新するときに関数によって更新されます。

この行*headref=newnode;は、を指すように呼び出し元のポインターを更新しますnewnode。(余談ですが、コードは疑わしいと思います。リストの位置が挿入されているかどうかに関係なく、headref常にに設定されているようです。)newnodenewnode

この場合、関数を変更してリストの先頭へのポインターを返すようにすることで、ポインターへのポインターの使用を回避できることに注意してください。

于 2013-01-15T16:39:54.597 に答える
0

C ++を使用している場合はheadref、参照で渡すことができるため、同じコードの方が簡単であることに注意してください。まったく同じことをしますが、もっと簡単です。

    void sortedinsert(struct node* &headref,struct node *newnode)
    {
           while(headref!=NULL && headref->data < newnode->data)
                   headref = headref->next;
           newnode->next = headref;
           headref = newnode;
    }
于 2013-01-15T16:47:02.773 に答える
0

このsortedinsert関数は、リストの先頭へのポインターと新しいノードへのポインターを受け入れます。

リストの先頭は単なるポインターですが、この関数はリストの先頭の位置を変更しているため、この関数では「ポインターへのポインター」です。

新しいノードはリスト内のソートされた位置に追加され、ヘッドは常に最新のノードを指すように変更されているように見えます。

于 2013-01-15T16:42:04.037 に答える