0

リンクされたリストの例に取り組んでいます。しかし、現在 head_insert メソッドを理解できません。誰かもう少し詳しく説明してください。ありがとうございました。

#include <iostream>
using namespace std;

struct node_ll
{
    int payload;
    node_ll* next;  // pointer to the next node
};

void head_insert(node_ll** list, int pload)
{
    node_ll* temp = new node_ll;//Declare temp, a pointer to a node.
    temp->payload = pload;//Set the payload of the struct at the address of temp to pload.
    temp->next = *list;//Set the next of the struct at the address of temp to the pointer to the old head of the list.
    *list = temp;//Set the pointer to the old head of the list to the pointer to the temp node.
    //Why doesnt the temp->next = temp?
};

void print_ll(node_ll** list)
{
    node_ll* temp;
    temp = *list;
    while (temp) // != NULL
    {
        cout << temp->payload << '\n';
        temp = temp->next;
    };
}

int main()
{
    node_ll* alist = NULL;  
    cout << "Empty list a to start\n";
    head_insert(&alist, 2); 
    head_insert(&alist, 4);
    head_insert(&alist, 6);
    cout << "List a after head insertion of 2,4,6 is \n";
    print_ll(&alist);
    cout << '\n';
    system("PAUSE");
    return 0;
}

私の混乱はコメントに詳述されています。私は行を持っている場合

temp->next = *list;
*list = temp;

新しく作成したノードが next で独自のアドレスを指していないのはなぜですか?

4

3 に答える 3

1
//Declare temp, a pointer to a node.

いいえ。「新しいノードを作成し、tempそのノードのアドレスにします。」

//Set the payload of the struct at the address of temp to pload.

いいえ、「ploadするアドレスpayloadの構造体の を設定してください」。それはおそらくあなたが意図したことですが、これらのことについては本当に正確である必要があります. いずれにせよ、これは作成したばかりの新しいノードを埋めています。 temppayload

//Set the next of the struct at the address of temp to the pointer to the old head of the list.

同様に... 「アドレスがnextである構造体の をの古い先頭のアドレス設定します。」 templist

//Set the pointer to the old head of the list to the pointer to the temp node.

気をつけろ。「リストの古いヘッドのアドレス」は変数ではなくです。4数値をメモリ内の複数の場所に格納できるのと同じように、メモリ内の複数の場所に存在させることができます。

関数には a node_ll**、つまり a(node_ll*)*へのポインタが与えられましたnode_ll*。具体的には、 から関数を呼び出したときに、への現在の呼び出しで変数へのmainポインタを渡しました。a_listmain

したがって、 を実行すると、その*list =メモリ ロケーションに書き込みます。つまり、変数を置き換えます。このようにメモリアドレスをいじることで、「参照渡し」をシミュレートし、呼び出し元からの変数の値を変更できます (コピーが与えられているため、パラメーターから変数にアクセスすることはできません。それらはグローバルではないため、グローバルとしてアクセスします)。a_list

//Why doesnt the temp->next = temp?

なぜでしょうか?コードは上から下に実行されます (制御構造にもかかわらず)。リストの新しいヘッドを設定する前に、リストの古いヘッドtemp->nextに設定されました。

temp->nextプロセスのその時点で、たまたまリストの古い先頭を指していて、たまたま同じ値を持つ変数を変更したという理由だけで、変更を期待していたようです。リストの古い先頭。しかし、それらは明らかに別個の変数です。と書いてa = 4; a *= 3も、値 4 は変わりません。変数aはそうです。ポインターも同様です。それらは単なる別の種類の値です。

于 2013-04-11T07:00:11.773 に答える
0

これは紛らわしいコードです。

listノードへのポインタへのポインタです。ノードを変更していません。渡されたポインターを変更しているため、挿入されたノードを指してい*list = tempます

于 2013-04-11T06:48:34.803 に答える
0

head_insert関数では、新しい Node が最初に追加されます。つまり、新しい新しいノードがリンクされたリストの先頭になります

temp->next = *list;//Store pointer to earlier head as the next node
*list = temp;  // Make pointer new node as the head node

あなたのコードでは、二重ポインタが引数として関数に渡されます。つまりA、ポインタ ヘッダー ノードの場合、次Bを含むアドレスAが引数として関数に渡されます。

于 2013-04-11T06:49:52.437 に答える