リストのプログラムでwhile(1)文のp->next = head;からあとを説明していただけませんか。p->next = head;はNODE *head = NULL;だからp->next==NULLですよね。
pにはデータを入れるためのメモリ領域の先頭アドレスが入っていて、それのp->nextが
NULLということですよね。head = p;はどうしてこうしているのですか。headにデータを入れていくということかなと思いますが。いやpにデータを入れていますよね。
ここらあたりがこんがらがって、よく理解できません。while(1)文を出た後の、
p = head;はどうしているんでしょうか。実行結果が後から順に表示されていますが、
それと関係ありそうですが、よろしくお願いします。
// リスト構造 #include <stdio.h> #include <stdlib.h> typedef struct node { struct node *next; int data; }NODE; int main(int argc, char *argv[]) { int x; NODE *head = NULL; // 変数headは、NODE型の構造体を指すポインタ変数です。 // リストの始まり位置を記憶させます。初期状態は // ノードがない状態なので、headの内容はNULL //(リストの最後の印)にしておきます。 NODE *p; // 変数pもNODE型構造体を指すポインタ変数です。 typedef struct node { struct node *next; int data; } NODE; while(1){ // while(1)は、継続条件がいつも1(真)なので、59~72行目の // ブロック内を永久に繰り替えします。 printf("data = "); scanf("%d", &x); if(x == -1) break; // 終了条件は、「x == -1」です。-1が入力されると、 // break文が実行され、whileのループから抜け出ます。 p = malloc(sizeof(NODE)); // NODE型構造体に必要な大きさの記憶場所を確保し、そのアドレスを // ポインタ変数pに入れます。 // malloc()関数の戻り値をチェックしなければならないのですが、 // ここでは、省略します。 p->next = head; // 確保したNODE方の記憶場所の中のメンバnextに // 現在のheadに記憶されているアドレスを入れます。 head = p; // headにpに記憶されたアドレスを入れます。 p->data = x; // 整数データをpが指している記憶場所の中のメンバdataに格納します。 } printf("\nアドレスは%p\n\n", p); p = head; while(p) { printf("%d\n", p->data); p = p->next; } } /* C:\MinGW\users\chap09\kadai>gcc -I. -o LST2 LST2.c -Wall C:\MinGW\users\chap09\kadai>LST2 data = 5 data = 9 data = 3 data = 4 data = 7 data = 2 data = -1 アドレスは00681358 2 7 4 3 9 5 C:\MinGW\users\chap09\kadai>
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/18 12:00
2017/11/18 12:01