32 bit 18 bit 4 32 bit 4
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 0 x 40 ea 0810 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p 変数 0 x 40 ea 082 c 0 x 0100 0001 0 x 40 ea 0824 0 x 1011 0111 0 x 40 ea 0828 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next mallocで 確保された領域 21 0 x 40 ea 0800 0 x 40 ea 0834 0 x 0110 1111 0 x 40 ea 0838 0 x 1010 0111 0 x 40 ea 083 c 0 x 0101 0000 … どのような状況か? 0 x 0000 0 x 40 ea 0820 … 構成 23 0 x 0000 0 x 40 ea 081 c 物理的 22 0 x 40 ea 0808 0 x 40 ea 0810 メモリの ※ mallocは、そのときで 適当な場所を割り当てる。
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 0 x 40 ea 0810 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p 変数 0 x 40 ea 082 c 0 x 0100 0001 0 x 40 ea 0824 0 x 1011 0111 0 x 40 ea 0828 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 21 0 x 40 ea 0800 0 x 40 ea 0834 0 x 0110 1111 0 x 40 ea 0838 0 x 1010 0111 0 x 40 ea 083 c 0 x 0101 0000 … どのような状況か? 0 x 0000 0 x 40 ea 0820 … 構成 23 0 x 0000 0 x 40 ea 081 c 物理的 22 0 x 40 ea 0808 0 x 40 ea 0810 メモリの mallocで 確保された領域
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 0 x 40 ea 0810 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p 変数 0 x 40 ea 082 c 0 x 0100 0001 0 x 40 ea 0824 0 x 1011 0111 0 x 40 ea 0828 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 21 0 x 40 ea 0800 0 x 40 ea 0834 0 x 0110 1111 0 x 40 ea 0838 0 x 1010 0111 0 x 40 ea 083 c 0 x 0101 0000 … どのような状況か? 0 x 0000 0 x 40 ea 0820 … 構成 23 0 x 0000 0 x 40 ea 081 c 物理的 22 0 x 40 ea 0808 0 x 40 ea 0810 メモリの mallocで 確保された領域
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 0 x 40 ea 0810 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p 変数 0 x 40 ea 082 c 0 x 0100 0001 0 x 40 ea 0824 0 x 1011 0111 0 x 40 ea 0828 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 21 0 x 40 ea 0800 0 x 40 ea 0834 0 x 0110 1111 0 x 40 ea 0838 0 x 1010 0111 0 x 40 ea 083 c 0 x 0101 0000 … どのような状況か? 0 x 0000 0 x 40 ea 0820 … 構成 23 0 x 0000 0 x 40 ea 081 c 物理的 22 0 x 40 ea 0808 0 x 40 ea 0810 メモリの mallocで 確保された領域
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 ← 物理構成 領域まとめて 32 bitで表示) (実際のメモリの状態) , 4アドレス飛び … … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 22 0 x 40 ea 0810 0 x 40 ea 0808 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 0 x 40 ea 0810 key 0 x 40 ea 0814 next 0 x 40 ea 0818 23 0 x 0000 p 0 x 40 ea 081 c 論理構成 (こういう状態であると「みなす」)↓ p 0 x 40 ea 082 c 0 x 40 ea 0820 0 x 0100 0001 key 0 x 40 ea 0824 0 x 1011 0111 next 0 x 40 ea 0828 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 21 0 x 40 ea 0800 0 x 40 ea 0834 0 x 0110 1111 0 x 40 ea 0838 0 x 1010 0111 0 x 40 ea 083 c 0 x 0101 0000 … … 線形リスト 21 key 22 next key next 23 NULL
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 22 0 x 40 ea 0810 0 x 40 ea 0808 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 0 x 40 ea 0810 key 0 x 40 ea 0814 next 0 x 40 ea 0818 23 0 x 0000 p 0 x 40 ea 081 c newp 0 x 40 ea 0828 0 x 0100 0001 key 0 x 1011 0111 next 21 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 21 0 x 40 ea 0800 0 x 40 ea 0834 0 x 0110 1111 0 x 40 ea 0838 0 x 1010 0111 0 x 40 ea 083 c 0 x 0101 0000 … p 0 x 40 ea 082 c 0 x 40 ea 0820 0 x 40 ea 0824 ここで、新たに要素を追加したい (ただし、変数newpをつかってよい) … key 22 next key next 23 NULL
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … key 0 x 40 ea 0804 next 22 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 0 x 40 ea 0810 key 0 x 40 ea 0814 next 0 x 40 ea 0818 23 0 x 0000 p 0 x 40 ea 081 c newp = (struct list *)malloc(sizeof(struct list)); 0 x 40 ea 0810 0 x 40 ea 0808 p 0 x 40 ea 082 c 0 x 40 ea 0820 newp 0 x 40 ea 0828 0 x 0100 0001 key 0 x 1011 0111 next 21 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 21 0 x 40 ea 0800 0 x 40 ea 0834 0 x 0110 1111 0 x 40 ea 0838 0 x 1010 0111 0 x 40 ea 083 c 0 x 0101 0000 … ① newp用にメモリ確保 … 0 x 40 ea 0800 0 x 40 ea 0824 ここで、新たに要素を追加したい (ただし、変数newpをつかってよい) … key 22 next key next 23 NULL
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … key 0 x 40 ea 0804 next 22 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 0 x 40 ea 0810 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p newp key 23 0 x 0000 0 x 40 ea 081 c newp = (struct list *)malloc(sizeof(struct list)); 0 x 40 ea 0810 0 x 40 ea 0808 next p 0 x 40 ea 082 c 0 x 40 ea 0820 newp 0 x 40 ea 0828 0 x 0100 0001 key 0 x 40 ea 0834 next 21 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 0 x 40 ea 0800 0 x 40 ea 0834 key 0 x 0110 1111 0 x 40 ea 0838 next 0 x 1010 0111 0 x 40 ea 083 c … ① newp用にメモリ確保 … 0 x 40 ea 0800 0 x 40 ea 0824 ここで、新たに要素を追加したい (ただし、変数newpをつかってよい) 21 0 x 0101 0000 … key 22 next key next 23 NULL
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … key 0 x 40 ea 0804 next 22 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 0 x 40 ea 0810 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p key 23 0 x 0000 0 x 40 ea 081 c newp 0 x 40 ea 0810 0 x 40 ea 0808 30 next p 0 x 40 ea 082 c 0 x 40 ea 0820 newp 0 x 40 ea 0828 0 x 0100 0001 key 0 x 40 ea 0834 next 21 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 0 x 40 ea 0834 key 0 x 40 ea 0838 next 0 x 40 ea 083 c … ② 確保した領域に値を代入 newp ->key = 30; … 0 x 40 ea 0800 0 x 40 ea 0824 ここで、新たに要素を追加したい (ただし、変数newpをつかってよい) 21 0 x 40 ea 0800 22 next 30 0 x 1010 0111 0 x 0101 0000 … key next 23 NULL
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 22 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p newp 0 x 40 ea 0828 0 x 0000 30 next p 0 x 0100 0001 key 0 x 40 ea 0834 next 21 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 0 x 40 ea 0834 key 0 x 40 ea 0838 next 0 x 40 ea 083 c … key 0 x 40 ea 082 c 0 x 40 ea 0820 0 x 40 ea 0824 newp 23 0 x 0000 0 x 40 ea 081 c ③確保した領域からリストに接続 newp ->next = p; 0 x 40 ea 0810 0 x 40 ea 0808 0 x 40 ea 0810 ここで、新たに要素を追加したい (ただし、変数newpをつかってよい) 21 0 x 40 ea 0800 22 next 30 0 x 40 ea 082 c 0 x 0101 0000 … key 値(アドレス:ポインタ) をコピー key next 23 NULL
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 22 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 key 0 x 40 ea 0814 next ③確保した領域からリストに接続 newp ->next = p; newp 0 x 40 ea 0810 0 x 40 ea 0808 0 x 40 ea 0810 ここで、新たに要素を追加したい (ただし、変数newpをつかってよい) key 23 30 next ここがポイント! → 0 x 40 ea 0818 0 x 0000 p 0 x 40 ea 081 c newp 0 x 40 ea 0828 0 x 0100 0001 key 0 x 40 ea 0834 next 21 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 0 x 40 ea 0834 key 0 x 40 ea 0838 next 0 x 40 ea 083 c … p 0 x 40 ea 082 c 0 x 40 ea 0820 0 x 40 ea 0824 0 x 0000 21 0 x 40 ea 0800 22 next 30 0 x 40 ea 082 c 0 x 0101 0000 … key 値(アドレス:ポインタ) をコピー key next 23 NULL
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … key 0 x 40 ea 0804 next 22 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 0 x 40 ea 0810 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p key 23 0 x 0000 0 x 40 ea 081 c newp 0 x 40 ea 0810 0 x 40 ea 0808 30 next p 0 x 40 ea 0834 0 x 40 ea 0820 newp 0 x 40 ea 0828 0 x 0100 0001 key 0 x 40 ea 0834 next 21 0 x 0100 0001 値(アドレス:ポインタ) 0 x 40 ea 082 c key 0 x 40 ea 0830 next 0 x 40 ea 0834 key 0 x 40 ea 0838 next 0 x 40 ea 083 c … ④リストの先頭を改める p = newp; … 0 x 40 ea 0800 0 x 40 ea 0824 ここで、新たに要素を追加したい (ただし、変数newpをつかってよい) 21 0 x 40 ea 0800 key 22 next 30 0 x 40 ea 082 c 0 x 0101 0000 … をコピー key next 23 NULL
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … ここで、新たに要素を追加したい (ただし、変数newpをつかってよい) ④リストの先頭を改める p = newp; … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 22 newp 0 x 40 ea 0810 0 x 40 ea 0808 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 ここがポイント!→ 0 x 40 ea 0810 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p 30 next p 0 x 40 ea 0834 0 x 40 ea 0820 newp 0 x 40 ea 0828 0 x 0100 0001 key 0 x 40 ea 0834 next 21 0 x 0100 0001 値(アドレス:ポインタ) 0 x 40 ea 082 c key 0 x 40 ea 0830 next 0 x 40 ea 0834 key 0 x 40 ea 0838 next 0 x 40 ea 083 c … 0 x 0000 0 x 40 ea 081 c 0 x 40 ea 0824 23 key 21 0 x 40 ea 0800 key 22 next 30 0 x 40 ea 082 c 0 x 0101 0000 … をコピー key next 23 NULL
アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … 完了! … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 22 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 0 x 40 ea 0810 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p 0 x 0000 30 next p 0 x 40 ea 0834 0 x 40 ea 0820 newp 0 x 40 ea 0828 0 x 0100 0001 key 0 x 40 ea 0834 next 21 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 0 x 40 ea 0834 key 0 x 40 ea 0838 next 0 x 40 ea 083 c … key 23 0 x 0000 0 x 40 ea 081 c newp 0 x 40 ea 0810 0 x 40 ea 0808 0 x 40 ea 0824 ここで、新たに要素を追加したい (ただし、変数newpをつかってよい) 21 0 x 40 ea 0800 22 next 30 0 x 40 ea 082 c 0 x 0101 0000 … key next 23 NULL
ここで、新たに要素を追加したい アドレス(32 bit) 中身(1記憶単位=8 bitを 4 領域まとめて 32 bitで表示) , 4アドレス飛び … 完了! … 0 x 40 ea 0800 key 0 x 40 ea 0804 next 22 0 x 40 ea 0810 0 x 40 ea 0808 0 x 41 b 7 41 b 0 0 x 40 ea 080 c 0 x 4 c 6 f a 750 0 x 40 ea 0810 key 0 x 40 ea 0814 next 0 x 40 ea 0818 p newp 0 x 40 ea 0828 key 30 next 0 x 0100 0001 key 0 x 40 ea 0834 next 21 0 x 0100 0001 0 x 40 ea 082 c key 0 x 40 ea 0830 next 0 x 40 ea 0834 key 0 x 40 ea 0838 next 0 x 40 ea 083 c … 0 x 0000 0 x 40 ea 0834 0 x 40 ea 0820 0 x 40 ea 0824 23 0 x 0000 0 x 40 ea 081 c p 21 0 x 40 ea 0800 22 next 30 0 x 40 ea 082 c 0 x 0101 0000 … key next 23 NULL
ここで、新たに要素を追加したい (ただし、変数newpをつかってよい) 図で、もう1回。 ① newp用にメモリ確保 newp = (struct list *)malloc(sizeof(struct list)); newp key next 21 key next 22 key next 23 NULL
ここで、新たに要素を追加したい 図で、もう1回。 完了! p key next 30 key next 21 key next 22 key next 23 NULL
- Slides: 30