自己参照構造体を使ったリスト処理コードでfree()関数のところが
よく理解できないので、おしえてください。
void free_list(struct list *p)でどうしてp2を定義するのか。
p2 = p->next;をどうして保存するのか。保存したp->nextをどうしてpに
設定しなおしているのか。この関数自体がなぜこんなことをしているのか分かりません。
自分ではp2はpをフリーする前に保存しておかないとfree(p);の後では
p = p2;が実行できないからだと思っています。
コード #include <stdio.h> #include <string.h> #include <stdlib.h> struct list { int key; // キー char name[20]; // 名前 struct list *next; // 次のデータへのポインタ }; struct list *add_list(int key, char *name, struct list *head); void show_list(struct list *p); void free_list(struct list *p); int main(void) { struct list *head; // 先頭ポインタ char name[20]; int key = 0; head = NULL; // 先頭ポインタにNULLを設定 printf("キーと名前(MAX:19文字)を入力(終了:CTRL+Z)\n"); while (scanf("%d %s", &key, name) != EOF) { head = add_list(key, name, head); // リストにデータを登録 } show_list(head); // リストの表示 free_list(head); // リストの開放 return 0; } // リストにデータを登録 struct list *add_list(int key, char *name, struct list *head) { struct list *p; // 記憶領域の確保 if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) { printf("malloc error\n"); exit(EXIT_FAILURE); } // リストにデータを登録 p->key = key; strcpy(p->name, name); // ポインタのつなぎ換え p->next = head; // 今までの先頭ポインタを次ポインタに // 新しいデータの次のポインタに headのアドレスをつなぐ。 // p->nextが次を指すようにする。新たな領域を先頭ポインタに head = p; // 新たな領域を先頭ポインタに // headにpのアドレスを代入してpを先頭ポインタにする。 // 先頭ポインタ(head)新しくなったNODEに沿って移動していく return head; // 最後に代入されたデータがheadになるのでそのアドレスを返す。 } // リストの表示 void show_list(struct list *p) { while (p != NULL) { // 次ポインタがNULLまで処理 printf("%3d %s\n", p->key, p->name); p = p->next; } } //リストの開放 void free_list(struct list *p) { struct list *p2; while (p != NULL) { // 次ポインタがNULLまで処理 p2 = p->next; free(p); p = p2; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/18 10:43
2018/01/18 10:51
退会済みユーザー
2018/01/18 11:00
2018/01/18 13:26
退会済みユーザー
2018/01/19 09:21
退会済みユーザー
2018/01/19 09:59