リンクリストと、構造体とポインターを使用してCでリストを作成する方法について学習しています。以下に例を示します。私の理解では、呼び出さpush()
れたものは、引数としてヘッドノードが存在する構造体の開始メモリ位置を渡します。push()関数のパラメーターは、structノードをポインターへのポインターとして受け取るため、実際のコピーではなく、参照として渡されます。したがって、最初のポインタはstruct node** headref
ヘッドノードのメモリ位置へのポインタであり、2番目のポインタは値を指します。これはヘッドノードが指す次のメモリ位置です。構造体ノード内にメモリを割り当てることにより、newnodeという新しいノードを作成します。次に、このノード内にint型のデータを作成します。
さて、私が言ったことがすべて正しいと仮定すると、次の部分は私が混乱していることです。
newNode->next= *headRef;
私が理解できることからのこの行は逆参照しているheadref
ので、これはheadref
ヘッドノードを指しているだけです。headref
次に、が指しているものが次に指すポインターにもなるポインター操作があります。これに基づいて、新しいnode(newnode
)の次のポインターはヘッドポインターを指します。
私も混乱している次の行は次のとおりです。
*headRef = newNode;
逆参照されたheadref
ポインターが指しているのはヘッドノードであり、これで新しいノードを指します。
これに基づいて、intデータと新しいノードをヘッドにリンクする次のポインターを持つnewnodeと呼ばれる新しいノードがあるはずです。次に、headrefポインター(またはヘッドノードですか?)が新しいノードを指します。newnodeの次のポインターが2番目のノードを指している必要があるため、これが正しくないことはわかっています。これにより、newnodeを構造体でリンクできるようになります。また、上記の2行のコードで、ポインターへのポインターと逆参照を理解しているとは思いません。
コード:
void Push(struct node** headRef, int data) {
struct node* newNode = malloc(sizeof(struct node));
newNode->data = data;
newNode->next = *headRef;
*headRef = newNode;
}
void PushTest(void) {
struct node* head = BuildTwoThree(); // suppose this returns the list {2, 3}
Push(&head, 1);
Push(&head, 13);
// head is now the list {13, 1, 2, 3}
}