アルゴリズムとデータ構造 補足資料11-3 「線形リストのオペレータ」 横浜国立大学 理工学部 数物・電子情報系学科 富井尚志 リストのオペレータ 1. 生成 2. 表示(走査) 3. 挿入 4. 削除 p key next 21 key next 22 key next 23 NULL リストのオペレータ 1. 生成 2. 表示(走査) 3. 挿入 4. 削除 p 21 key next key 22 next void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } key next 23 NULL void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } p key next 画面出力 21 key next 22 key next 23 NULL p !=NULL key next 画面出力 void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } 21 key next 22 key next 23 NULL void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } p key next 画面出力 <21> 21 key next 22 key next 23 NULL void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } p key next 画面出力 <21> 21 key next 22 key next 23 NULL p !=NULL key next 画面出力 <21> void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } 21 key next 22 key next 23 NULL void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } p key next 画面出力 <21> <22> 21 key next 22 key next 23 NULL void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } p key next 画面出力 <21> <22> 21 key next 22 key next 23 NULL p !=NULL key next 画面出力 <21> <22> void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } 21 key next 22 key next 23 NULL void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } p key next 画面出力 <21> <22> <23> 21 key next 22 key next 23 NULL p void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } NULL key next 画面出力 <21> <22> <23> 21 key next 22 key next 23 NULL p NULL ==NULL key next 画面出力 <21> <22> <23> void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } 21 key next 22 key next 23 NULL p void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } NULL key next 画面出力 <21> <22> <23> 21 key next 22 key next 23 NULL p void print_list(struct list *p) { while (p != NULL) { printf("<%d> ", p->key); p = p->next; } printf("\n"); } NULL key next 21 key next 22 key next 23 NULL 画面出力 <21> <22> <23> 走査(scan)とは、一つ一つの要素のキーを見ていくこと。 「探索」(search)の際にも使う。 リストのオペレータ 1. 生成 2. 表示(走査) 3. 挿入 4. 削除 p key next 21 key next 22 key next void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } 23 NULL void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } p key 21 key next next ここに挿入する x key next 30 22 key next 23 NULL void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } p key 21 key next next この値をコピー x key next 30 22 key next 23 NULL void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } p key 21 key next next この値をコピー x key next 30 22 key next 23 NULL void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } p key 21 key next x next key next 30 22 key next 23 NULL イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 樋口さんの番号 野口さんの番号 ここに挿入する x 夏目さんの番号 夏目 野口 NULL void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 樋口さんの番号 野口さんの番号 この値をコピー x 夏目さんの番号 夏目 樋口さんの番号 野口 NULL void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 夏目さんの番号 野口さんの番号 この値をコピー x 夏目さんの番号 夏目 樋口さんの番号 野口 NULL void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 夏目さんの番号 x 夏目さんの番号 野口さんの番号 夏目 樋口さんの番号 野口 NULL void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 夏目さんの番号 番号の写し順に注意! 夏目 樋口さんの番号 樋口 野口さんの番号 野口 NULL イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 樋口さんの番号 野口さんの番号 ここに挿入する x 夏目さんの番号 夏目 番号の写し順に注意! 先に、福沢さんの覚えている樋口さんの電話番号を、 メモをとらずに(憶えておかずに)夏目さんの電話番号に書き換えてしまうと。。。 野口 NULL イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 夏目さんの番号 x 夏目さんの番号 野口さんの番号 夏目 番号の写し順に注意! 先に、福沢さんの覚えている樋口さんの電話番号を、 メモをとらずに(憶えておかずに)夏目さんの電話番号に書き換えてしまうと。。。 野口 NULL void insert_after(struct list *x, struct list *p) { x->next = p->next; p->next = x; } イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを挿入する。」 p 福沢さんの番号 福沢 樋口 夏目さんの番号 x 夏目さんの番号 野口さんの番号 夏目 ? 番号の写し順に注意! 先に、福沢さんの覚えている樋口さんの電話番号を、 メモをとらずに(憶えておかずに)夏目さんの電話番号に書き換えてしまうと。。。 樋口さんの電話番号がわからなくなる! ので、連絡網が切れてしまう。 野口 NULL リストのオペレータ 1. 生成 2. 表示(走査) 3. 挿入 4. 削除 p key next 21 key 22 next key next 23 NULL void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } 削除がないと、領域を解放しないので、増加しっぱなし。 void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key next q 21 key next 22 key next 23 NULL この要素を削除(領域解放)する void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key 21 key next next key 23 NULL 22 next q この要素を削除(領域解放)する ※見やすくするために位置をずらしましたが、 メモリ内で確保されている領域が 移動するわけではありません。 void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key 21 key next この値をコピー next key next q 22 23 NULL void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key 21 key next この値をコピー next key next q 22 23 NULL void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key 21 key next next key 22 next q 領域を解放 23 NULL void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; free(q); } p key next 21 key next 23 NULL void delete_next(struct list *p) { struct list *q; q = p->next; p->next = q->next; /*free(q);*/ } p key 21 key next next key 23 NULL 22 next 領域解放を忘れると、メモリ内にリンクのない使えない領域が残り続ける。 (メモリリーク:メモリ漏れ; プログラムが進むにつれて、だんだんと使えるメモリが減っていく) 必ず、解放しよう! イメージ: 電話連絡網 この連絡網では、 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口 NULL 樋口さんの番号 樋口 野口さんの番号 この要素を削除する void delete_next(struct list *p) { struct list *q; イメージ: 電話連絡網 q = p->next; p->next = q->next; この連絡網では、 free(q); 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 } 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口 NULL 樋口さんの番号 樋口 野口さんの番号 q この要素を削除する void delete_next(struct list *p) { struct list *q; イメージ: 電話連絡網 q = p->next; p->next = q->next; この連絡網では、 free(q); 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 } 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口 NULL 樋口さんの番号 この値をコピー 樋口 野口さんの番号 q 樋口さんの番号 あとで、本部から樋口さんに 「あなたは連絡網から削除されました」 と電話で伝える(解放する)ために 樋口さんの電話番号をメモしておく void delete_next(struct list *p) { struct list *q; イメージ: 電話連絡網 q = p->next; p->next = q->next; この連絡網では、 free(q); 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 } 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口 NULL 野口さんの番号 この値をコピー 樋口 野口さんの番号 q 樋口さんの番号 void delete_next(struct list *p) { struct list *q; イメージ: 電話連絡網 q = p->next; p->next = q->next; この連絡網では、 free(q); 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 } 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口 NULL 野口さんの番号 樋口 野口さんの番号 q 樋口さんの番号 本部から樋口さんに 「あなたは連絡網から削除されました」 と電話を入れる(解放する) void delete_next(struct list *p) { struct list *q; イメージ: 電話連絡網 q = p->next; p->next = q->next; この連絡網では、 free(q); 「各人は、次に連絡を回す相手の電話番号だけ知っている。」 } 「連絡網が切れないように、途中にメンバーを削除する。」 p 福沢さんの番号 福沢 野口さんの番号 野口 NULL リストのオペレータ 1. 生成 2. 表示(走査) 3. 挿入 4. 削除 struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; } get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; d } p newp get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; d } p NULL newp get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d 1 struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; !=EOD } p NULL newp get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 1 } p NULL newp key next get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 1 } p NULL newp key next 1 get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 1 } p NULL newp key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 1 } p newp key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d 2 struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; !=EOD } p newp key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 2 } p newp key key next next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 2 } p newp key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 2 } p newp key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 2 } p newp key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d 3 struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; !=EOD } p newp key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 3 } p newp key key next next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 3 } p newp key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 3 } p newp key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 3 } p newp key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d 4 struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; !=EOD } p newp key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 4 } p newp key key next next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 4 } p newp key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 4 } p newp key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 4 } p newp key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d 5 struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; !=EOD } p newp key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 5 } p newp key key next next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 5 } p newp key next 5 key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 5 } p newp key next 5 key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 5 } p newp key next 5 key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d 6 struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; !=EOD } p newp key next 5 key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 6 } p newp key key next next 5 key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 6 } p newp key next 6 key next 5 key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 6 } p newp key next 6 key next 5 key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; 6 } p newp key next 6 key next 5 key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 d struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; ==EOD -1 } p newp key next 6 key next 5 key next 4 key next 3 key next 2 key next 1 NULL get_data()関数が返す値リスト a[]={ 1, 2, 3, 4, 5, 6, EOD } ※EOD: -1 struct list * get_list( void ) { int d; struct list *p,*newp; p = NULL; while( ( d = get_data( ) ) != EOD) { newp = (struct list *)malloc(sizeof(struct list)); newp->key = d; newp->next = p; p = newp; } return p; p } key next 6 key next 5 key next 4 key next 3 key next 2 key next 1 NULL
© Copyright 2024 ExpyDoc