Смекни!
smekni.com

Основні принципи модульного програмування та стеки (стр. 2 из 2)

uses crt;

type

ptr=^zap; {тип покажчик на запис}

zap=record

number:string; {елементданих}

next:ptr; {покажчик на наступний елемент}

end;

var first: ptr; {покажчик на початок списку }

ch: char; { вибiр режиму обробки списку}

newptr, {покажчик на введений елемент}

curr, {покажчик на наступний елемент}

prev: ptr; {покажчик на попереднiй елемент}

reg: string; {значення елемента даних }

done: boolean; {прапорець для пошуку мiсця вставки елемента}

{додавання елементiв до списку }

procedure insert;

begin

write('input elenent:');

readln(reg);

new(newptr); { видiленняпам'ятi пiдновийелемент}

newptr^.number:=reg; { ввiдданихвпам'ять}

if first=nil then { формування першого елемента списку}

begin

first:=newptr; {початковий покажчик на першому елементi}

first^.next:=nil; { покажчик на наступний елемент }

end

else {якщо список не порожнiй

перевiрка впорядкованостi списку}

if reg<=first^. number then {якщо нове значення менше iснуючого}

{вставка нового елемента на початку списку}

begin newptr^.next:=first;

first:=newptr;

end

else {якщоновезначеннябiльше iснуючих}

{пошукпотрiбногомiсцявставки }

begin

curr:=first; {покажчикпоточногоелементавказуєнаперший}

repeat

prev:=curr; {покажчик попереднього елемента вказує на

поточний елемент}

curr:=curr^.next; {покажчик поточного елемента вказує на

наступнийелемент}

if curr=nil

then done:=true

else done:=curr^.number>=reg;

until done; {переадресацiя пари покажчикiв до тих пiр, поки значення

даних, що введене, бiльше за тих, що є в списку: until curr^.number>=reg;}

{вставка нового елемента }

prev^.next:=newptr;

newptr^.next:=curr;

end

end; { кiнецьпроцедури insert}

{вилучення елемента iз списку, перший елемент вилучається останнiм}

procedure delete;

begin

if first=nil then {якщосписокпорожнiй}

begin

writeln('List is empty.Press ENTER...');

readln;

end

else {якщо список не порожнiй}

begin

write('input element:');

readln(reg); {ввiдзначення, щовилучається }

curr:= first;

if curr^.number=reg then {якщопотрiбнийелементзнайдений}

first:=curr^.next {вилученняелемента }

else

repeat {пошукпотрiбногоелемента }

prev:=curr; {перепризначенняпокажчикiв }

curr:=curr^.next; {покажчикнапопереднiйелементстає

поточним покажчиком, покажчик на

поточний елемент вказує на наступний}

until (curr^.number=reg) or (curr^.next=nil);

{вилучення знайденого елемента та звiльнення пам'ятi}

if curr^.number=reg then {якщо елемент списку спiвпадає з заданим}

begin

prev^.next:=curr^.next; {переадресацiя покажчикiв}

dispose(curr); end {звiльненняпам'ятi}

else

begin {якщо елемент не знайдено}

writeln(reg,' not found in list. Press ENTER...'); {вивiдповiдомлення}

readln;

end;

end;

end; { кiнецьпроцедури delete }

{ вивiдспискунаекран }

procedure outlist;

begin

curr:=first; {поточний покажчик вказує на перший}

if curr=nil then writeln('List is empty')

else begin

writeln(' output list:');

repeat

write(curr^.number,' '); {вивiдзначенняелемента }

curr:=curr^.next; {поточнимстаєпокажчикнанаступнийелемент} until curr=nil;

{вивiд значень, поки є елементи в списку}

end;

writeln;

end;

begin {**** головнапрограма ******}

first:=nil; {початок списку- список порожнiй }

repeat

clrscr; outlist; {очищення екрана, виведення списку}

writeln('I- input D- delete Q- quit');

write('input command:');

readln(ch);

ch:=upcase(ch);

case ch of

'I': Insert;

'D': delete;

end;

until ch='Q';

end.