Бағдарламалаудың қазіргі тілдерінде көрсеткіштерді қолдануға болады.
Бұл мәліметтердің әртүрлі динамикалық құрылымдарын жасауға мүмкіндік
береді. Оларда жады элемент болған уақытқа ғана бөлінеді де, сосын элемент
жойылғанда босатылады. Болашақта жадының бұл облысы қайта қолданыла
береді.
Динамикалық бөлінетін элементтерде ат жоқ, оларға стандарты
жолмен қатынасуға болмайды. Динамикалық айнымалыларға қатынау
көрсеткіштер (сілтемелер) көмегімен жүзеге асады, олар бағдарламаның
динамикалық элементін құрғаннан кейін анықталған болады.
Тізімдерді динамикалық көрсету үшін тізімнің әрбір элементі мәндік
ақпараттан басқа "көрсеткіш" типті өріске ие болуы керек. Сәйкесінше,
динамикалық тізімдік құрылымдарда элемент ретінде жазба болады, оның
компоненттерінің бірі "көрсеткіш" типіне ие. Осыларға сәйкес, тізім
элементінің бейнеленуі мынадай болады:
TYPE ТР
=
^SР;
SP = RECORD
INF : CHAR; {INF : To }
LINK:TP
END;
6.2 Стек көрсетілімі
Стек жадының бірнеше динамикалық облыстарынан тұрады, сонымен
қатар жоғары орналасқан элементтің көрсеткіші алдындағы элементке
көрсетеді. Сыртқы көрсеткіш (стек көрсеткіші) стектің жоғарғы элементіне
көрсету керек (сур.15).
Сур. 15 Стектің сызықты тізім түрінде көрсетілімі
Стекті ұйымдастыру үшін және жүргізу үшін екі көрсеткіш алдын-ала
қарастырылуы керек: ТОР мен К:
VAR TOP, К: ТР;
СН:CHAR;
Стекке элемент қосу үшін:
• К көрсеткіші бойынша динамикалық айнымалыны құру керек;
• оған керек ақпаратты енгізу керек;
• жаңа элемент көрсеткішінің өрісінде ТОР көрсеткішінің мәнін енгізу
керек;
• ТОР көрсеткішіне К көрсеткішінің мәнін меншіктеу керек. NEW(K);
K^.INF:= СН;
KALINK := TOP;
ТОР:=К;
Стектен элементті жою үшін жеткілікті:
• ақпаратты оқу СН := TOP^.INF;
• ТОР көрсеткішіне жойылатын элементтің көрсеткішін енгізу
TOP := TOP^.LINK;
Бірақ бұл жағдайда стектен жойылған элемент "қоқыс" құрайды.
Одан да ТОР көрсеткішінің мәнін алдын-ала сақтап, жадыдан осы
элементті жойған дұрыс:
К := ТОР;
TOP := K^.LINK;
СН := K^.INF;
DISPOSE(K);
Тағы да кері және айналы принцип бұл жерде орындалады.
Стекті басынан бастап құру. N элементтен тұратын стек:
TOP := Nil;
WHILE N> 0 DO BEGIN
NEW(K); READ(CH);
K^.INF := CH;
K^.LINK := TOP;
TOP:=K; N:=N-1 END;
Стектің барлық элементтерін таңдау (өз еркінше):
REPEAT
К:-=TOP;
TOP:= K^.LINK;
CH := K^.INF; WRITE(CH);
DISPOSE(K);
UNTIL TOP = NIL;
немесе WHILE TOP <> NIL DO ...;
Тізбекті жадыда стек элементтерін өңдеу операцияларын салыстыра
отырып, олардың ұқсастығын табамыз (массивтермен салыстыру).
Бірақ динамикалық құрылымдарда стектің толып кету мәселесі
шешіледі.
6.3 Кезек көрсетілімі
Сур. 16 Сызықты тізім түрінде кезектің көрсетілуі
F көрсеткіші кезектің бірінші элементін көрсету керек, ал R –
соңғысына. Кезектің соңғы элементінің көрсеткіші NIL-ға тең болуы керек
(Сур.16). осылайша кезекпен жұмыс істеу үшін "көрсеткіш" типті үш
айнымалы қажет. Онда бейнелеу:
TYPE ТР
=
^SP;
SP
=
RECORD
INF:CHAR;
LINK:TP
END;
VAR F, K, R: TP;
CH:CHAR;
Бұндай көрсетілімде жою көзқарасы бойынша кезек стекке ұқсас, ал
қосу көзқарасы бойынша – бұл стектің төменгі шекрасының төмендеуі
сияқты.
Кезектен жою операциясы толығымен F көрсеткіші бойынша стектен
жою операциясын эквивалентті.
K:=F;
F:=K^.LINK;
CH := K^.INF;
DISPOSE(K);
Кезекке қосу операциясы – бұл R көрсетіп тұрған элементтен кейін
қосу:
NEW(K); - жаңа элементке арналған жады
K^.INF := CH; - жаңа элементке ақпарат
K^.LINK := NIL; - көрсеткішті енгізу, себебі бұл элемент соңғы
R^.LINK := К; - соңғы элементпен байланыс
R := К; - соңғы элементке көрсеткіш.
Динамикалық кезекпен жұмыс істегенде кезектің толып кету мәселесі
шешіледі.
Бос кезекті тексеру F-ті NIL-мен салыстыруда жүзеге асады.
6.4 Динамикалық тізімдерді көрсеткіштер көмегімен
жүргізу
Динамикалық тізімдер оңай жүргізіледі, егер сілтемелер ретінде
"көрсеткіш" типті айнымалылар қолданса. Бұл жағдайда теориялық түрде
ЭЕМ жадысын шексіз деп есептеуге болатындықтан, толып кету мәселесі
шешіледі.
Бұдан басқа, көрсеткіштер бос жадыны тек қана бір тізімге емес,
бірнешеуіне де қайта қолдануға мүмкіндік береді.
Бірбайланысты тізімді бейнелейік.
TYPE TP = ^SР;
SP-RECORD
INF: CHAR; { INF: To }
LINK : TP
END;
VARNACH,I,J,K:TP
С:CHAR;
Назар аударыңыз: SP типті айнымалы жоқ!
Тізімдерге қолданылатын негізгі операциялар.
Келесі элементке көшу.
I – тізімнің ағымдағы элементіне көрсеткіш болсын. Онда
J := I^.LINK; - тізімнің келесі элеменітне көрсетеді.
Тізімнің басынан бастап керек элементті іздеу.
'А' мәнді элементті тапқымыз келсін.
I:=NACH;
WHILE (С <> 'A') AND (I о<>NIL) DO BEGIN
С:=I^.INF;
I :== I^.LINK
END;
IF С <>'A' THEN { элемент жоқ }
Массивті модельдеу кезіндегі операциямен салыстырыңыз.
Тізімге I көрсеткіші бар элементтен кейін қосу.
NEW(J);
JMNF := С;
J^.LINK:=I^.LINK;
I^.LINK :=J;
Тізімнен I көрсеткіші бар элементтен кейін жою.
J := I^.LINK;
I^.LINK := J^.LINK;
С := J^.INF; {егер ақпаратты сақтау керек болмаса, алып тастау }
DISPOSE(J);
Біз I көрсетіп тұрған элементтен кейін жою мен қосу операцияларын
орындадық.
Элементтің алдына қосу немесе ағымдағы элементті жою мүмкін емес,
себебі алдыңғы элементпен байланыс жоқ.
Бірақ, қарапайым әдіс бұл қиындықты жеңе алады.
Алдында қосу: I көрсеткіші бар элементтен кейін қосу, сосын қосылған
және алдыңғы элементтердің ақпараттық бөлімдерін орындарымен
ауыстыру. NEW(J);
J^.LINK := I^.LINK;
I^.LINK := J;
J^.INF= I^.INF;
I^.INF:=C;
Элементтің өзін жою: тізімнің келесі және ағымдағы элементтерін
орындарымен ауыстыру, сосын келесі элементті жою.
J := I^.LINK; - келесіні таптық
С := J^.INF; - келесіні есте сақтадық (егер керек болса)
I^.INF := С; - алдыңғыға сілтедік
I^.LINK :=J^.LINK; - байланысты ауыстырдық
DISPOSE(J);
Жойылатын эелемент тізімде соңғы болмаған кезде жою операциясы
мүмкін.
Достарыңызбен бөлісу: |