0

2つの質問:

  1. リストの前にノードを追加する関数を書いています。現在、私はこのようにしています:

    void addList( NODE_TYPE** head, NODE_TYPE** d_name )
    {
        (*d_name)->next = *head;
        *head = *d_name;
    }
    

    そして内部main()では、私はそれを次のように呼んでいます:

    addList( &head, &node_3);
    

    私の質問は、次のような関数プロトタイプを使用してこれを行う別の方法はありますか?

    void addList( NODE *head, NODE *node);
    

    これはクラスの問題でした。関数を呼び出すとアドレスの値のみが渡され、呼び出し元はヘッドに加えられた変更を確認できず、ノード。

  2. deleteList関数が正しいかどうかわかりません。温度が頭(アンカー)が指す場所を指すようにしたいと思います。次に、next_freeは、ヘッドにリンクされている2番目のノードを指します。次に、最初のノードを解放します。次に、すべてが解放されるまで、2番目、3番目などを繰り返します。

    void deleteList( NODE_TYPE** head )
    {
        NODE_TYPE* temp = *head;
        NODE_TYPE* next_free = NULL;
    
        while ( temp->next != NULL )
        {
            next_free = temp->next;
            free( temp );
            temp = next_free;
        }
    
        *head = NULL;
    }
    

これは正しいアプローチですか?

4

3 に答える 3

0

1番の答えとして、ダミーヘッドと呼ばれるものを使用できます。nextこれは、ポインタがリストの最初の要素を指す空のノードです。したがって、空のリストを単一のノードとして作成し、そのポインターが変更されないことを認識してそのノードを渡します。これは、リストの先頭へのポインターを複数の場所に格納するが、リストを変更できるようにする場合に便利です。

番号 2 については、ほぼ正しいですが、*head最初は NULL でないことを確認する必要があります。また、要素が 1 つしかないリストは削除されません。代わりにこれを行います:

while ( temp != NULL )

そして、他のすべてを同じままにします。

ああ、あなたの最初の質問についての別のメモ。あなたがこれを言うとき、あなたは間違っています:

関数を呼び出すとアドレスの値のみが渡され、呼び出し元は headや nodeに加えられた変更を確認できなくなります。

ノードの内容は変更される可能性があります。それへの二重ポインタは必要ありません。ダブルポインターは、ポインターが変更できることを意味します。

于 2012-11-25T21:17:50.940 に答える
0

*head に直接割り当てることで、余分な「next_free」変数を回避できます。

void deleteList( NODE_TYPE **head )
{
    NODE_TYPE *temp;

    while ( (temp = *head) )
    {
        *head = temp->next;
        free( temp );
    }

}
于 2012-11-25T21:42:33.360 に答える
0

「私の質問は、次のような関数プロトタイプでこれを行う別の方法があるかどうかです: void addList( NODE *head, NODE *node)」

あなたは正しいです。「値渡し」だけでは、反映した変更は元のサブルーチンには適用されません。あなたができることはこれです:

Node_type * addList(Node_type *head, Node_type *d_name)
{
d_name->next=head;
return d_name;
}

この形式の呼び出し元関数呼び出しで

 head = addList( head, node_3);

これは、見たい変更を反映します

Q2の場合

条件を入れるだけ

while(temp!=NULL)

これにより、空のリストまたは単一ノードのリストがある条件が処理されます

于 2012-11-26T08:02:50.947 に答える