Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 85

Автор Π‘Π΅Ρ€Ρ‚Ρ€Π°Π½ ΠœΠ΅ΠΉΠ΅Ρ€

Π§Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ОО-ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ? Одна ΠΈΠ· Π½ΠΎΠ²ΠΈΠ½ΠΎΠΊ скорСС организационная, Ρ‡Π΅ΠΌ тСхничСская: Π² этом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ большоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ удСляСтся ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌΡƒ использованию Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ΠœΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ прилоТСния ΠΈ создатСлями систСмных срСдств - компилятора ΠΈ срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ - стоит Ρ‚Ρ€Π΅Ρ‚ΡŒΡ Π³Ρ€ΡƒΠΏΠΏΠ° людСй, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ… Π·Π° написаниС ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… основныС структуры Π΄Π°Π½Π½Ρ‹Ρ…. Π§Π»Π΅Π½ΠΎΠ² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ½ΠΎΠ³Π΄Π° Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΈ Π² Π΄Π²ΡƒΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ипостасях, принято Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ производитСлями ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (component manufacturers).

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ Π»ΡŽΠ±Ρ‹ΠΌ использованиСм Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ находятся Π² Π»ΡƒΡ‡ΡˆΠ΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΈ поискС ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ для всСх экзСмпляров этого класса.

Если модСль размСщСния ΠΈ удалСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса достаточно проста, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΉΡ‚ΠΈ эффСктивноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ reclaim. Они ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ всС Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… понятий высокого уровня. Π­Ρ‚ΠΎ ΠΈ называСтся ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ связного списка

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Рассмотрим класс LINKED_LIST, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ список, состоящий ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° (header) ΠΈ Π½Π°Π±ΠΎΡ€Π° связанных ячССк, ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ экзСмплярами класса LINKABLE. МодСль размСщСния ΠΈ удалСния для связного списка проста. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ рассмотрСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ связанныС ячСйки. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² (люди, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠ΅ Π·Π° классы LINKED_LIST ΠΈ LINKABLE) Π·Π½Π°ΡŽΡ‚ Ρ‚ΠΎΡ‡Π½ΠΎ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΈ ΠΊΠ°ΠΊ становятся "ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹ΠΌΠΈ" экзСмпляры класса LINKABLE - ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ вставки ΠΈ удалСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ особСнным способом.

Допустим, класс LINKED_LIST ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ вставки: put_right ΠΈ put_left, Π²ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт справа ΠΈΠ»ΠΈ слСва ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ курсора. КаТдой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ вставки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Π½ΠΎΠ²Ρ‹ΠΉ LINKABLE ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Випичная рСализация ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅:


put_right (v: ELEMENT_TYPE) is

- Вставка элСмСнта со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ v ΠΏΡ€Π°Π²Π΅Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ курсора.

require

...

local

new: LINKABLE

do

create new.make (v)

active.put_linkable_right (new)

... Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΏΠΎ измСнСнию Π΄Ρ€ΡƒΠ³ΠΈΡ… связСй...

end


Рис. 9.11.  Π‘вязный список

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ создания create new.make (v) Π΄Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΡƒΡ€ΠΎΠ²Π½ΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ языка Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² памяти Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ управляСм Ρ‚Π΅ΠΌ, Π³Π΄Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΌΡ‹ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Π΅ΠΌ, Π³Π΄Π΅ ΠΎΠ½ΠΈ становятся нСдостиТимыми, - Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ… удалСния. ΠŸΡƒΡΡ‚ΡŒ Π² нашСм классС Ρ‚Ρ€ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹: remove, remove_right, remove_left. ΠœΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ remove_all_occurrences (которая удаляСт всС экзСмпляры с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ) ΠΈ wipe_out (удаляСт всС элСмСнты списка). Допустим, Ρ‡Ρ‚ΠΎ Ссли ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ удалСния. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° remove, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ:


remove is

- удаляСт элСмСнт Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ курсора.

do

...

previous.put_linkable_right (next)

... Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΏΠΎ измСнСнию Π΄Ρ€ΡƒΠ³ΠΈΡ… связСй...

active := next

end


Рис. 9.12.  Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

Π­Ρ‚ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ удалСния ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ контСкст обнаруТСния нСдостиТимых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ, ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, прСдоставят эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ использования. Π’ отсутствиС ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ автоматичСской схСмы освобоТдСния памяти Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ бСзопасно Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰ΡƒΡŽΡΡ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Если ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ создало нСдостиТимыС LINKABLE ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ размСстило ΠΈΡ… Π³Π΄Π΅-Ρ‚ΠΎ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ использования, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° вставка Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ создания Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, экзСмпляры LINKABLE хранятся Π² структурС Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ available. Она Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСна Π½ΠΈΠΆΠ΅. Π’ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ инструкции создания Ρ‚ΠΈΠΏΠ° create new.make (v) Π² put_right ΠΈ put_left Π½Π°


new := fresh (v)


Π³Π΄Π΅ fresh закрытая функция класса LINKED_LIST, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊ использованию экзСмпляр linkable. Ѐункция fresh пытаСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈΠ· available списка, ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° этот список пуст.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΏΠ°Π΄Π°Ρ‚ΡŒ Π² available Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ… удалСния. НапримСр, Ρ‚Π΅Π»ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ remove Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ:


do

recycle (active)

- ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ:

... Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ ΠΏΠΎ обновлСнию связСй: previous, next, first_element, active...


Π³Π΄Π΅ recycle новая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° LINKED_LIST ΠΈΠ³Ρ€Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ, ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡƒΡŽ fresh, добавляя свой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² available. Π­Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ, ΠΎΠ½Π° Π½ΡƒΠΆΠ½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ использования.

Π Π°Π±ΠΎΡ‚Π° с ΡƒΡ‚ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ fresh ΠΈ recycle, ΠΌΠΎΠΆΠ½ΠΎ срСди Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ available ΠΊΠ°ΠΊ стСк: fresh Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ элСмСнт ΠΈΠ· стСка, Π° recycle Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ элСмСнт Π² стСк. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ класс STACK_OF_LINKABLES для этого случая ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² класс LINKED_LIST (Π’ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ Π£23.1. трСбуСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ появлСниС Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fresh ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов.):


available: STACK_OF_LINKABLES

fresh (v: ELEMENT_TYPE): LINKABLE is

- Новый элСмСнт со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ v, для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ

- использования Π²ΠΎ вставкС

do

if available.empty then

- Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта

create Result.make (v)

else

- ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС linkable

Result := available.item; Result.put (v); available.remove

end

end

recycle (dead: LINKABLE) is

-Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ dead Π² список достиТимых элСмСнтов.

require

dead /= Void

do

available.put (dead)

end


ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ класс STACK_OF_LINKABLES ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


class

STACK_OF_LINKABLES

feature {LINKED_LIST}

item: LINKABLE

- Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка

empty: BOOLEAN is

- Π½Π΅Ρ‚ элСмСнтов Π² стСкС?

do

Result := (item = Void)

end

put (element: LINKABLE) is

- Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнт Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка.

require

element /= Void

do

element.put_right (item); item := element

end

remove is

- Π£Π΄Π°Π»ΠΈΡ‚ΡŒ послСдний Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ элСмСнт.

require

not empty

do

item := item.right

end

end


Рис. 9.13.  STACK_OF_LINKABLES

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ стСка ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ всС прСимущСства поля right, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ элСмСнтС LINKABLE, связывая всС ΡƒΡ‚ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ элСмСнты ΠΈ прСдоставляя, Ρ‚Π΅ΠΌ самым, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ для размСщСния Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов списка LINKED_LIST. Класс LINKABLE Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ right ΠΈ put_right Π² класс STACK_OF_LINKABLES.

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ available являСтся Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ класса. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ связный список Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ свой собствСнный стСк. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эффСктивнСС Π² систСмС, содСрТащСй нСсколько списков ΠΈ СдинствСнный стСк для всСх ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… элСмСнтов. Вакая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (once functions), Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСна ΠΏΠΎΠ·ΠΆΠ΅; ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΅Π΅ для available ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ экзСмпляр класса STACK_OF_LINKABLES Π±ΡƒΠ΄Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° выполнСния систСмы, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ достиТСниС поставлСнной Ρ†Π΅Π»ΠΈ. ( Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ Π£9.3. ΠΈ Π£9.4. Об ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹Ρ… функциях см. Π»Π΅ΠΊΡ†ΠΈΡŽ 18)

Дискуссия

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ восстановлСния памяти. ΠŸΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ языка Π½Π΅ прСдоставляСт автоматичСского ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° сборки мусора, описанного Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ…. НС обрСмСняя ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ пСрСдаСтся ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΌ классам, созданных производитСлями ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

НСдостатки ΠΈ польза - понятны. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (ΡƒΠ³Ρ€ΠΎΠ·Π° нСнадСТности, ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ) Π½Π΅ ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚ магичСски. ЗащищСнная ΠΎΡ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ использования схСма управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для связного списка, - Ρ‚Ρ€ΡƒΠ΄Π½Π°. Но вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Ρ€Π°Π±ΠΎΡ‚Π° возлагаСтся Π½Π° производитСля ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π§Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½Ρ‹Π΅ усилия, Π·Π°Ρ‚Ρ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ производитСлями ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΎΠΊΡƒΠΏΠ°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ созданныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ прилоТСниями.