Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
56
Добавлен:
10.05.2014
Размер:
10.87 Кб
Скачать
program db;
(*
(c) 2005 Dima Zolotukhin aka 'Zlogic' <zlogic@gmail.com>
Redistributable under GNU GPL license
*)
type
str_message = string[70];
node_pointer = ^node;
node = record
data:integer;
next:node_pointer;
end;

function get_int(message:str_message):integer;
var
response:integer;
begin
write(message,'> ');
readln(response);
get_int:=response;
end;

procedure show_menu;
begin
writeln;
writeln('-------------Њ…Ќћ ‘Џ€‘ЉЂ-------------');
writeln(' 1 „®Ў ўЁвм н«Ґ¬Ґ­в ў ­ з «® бЇЁбЄ ');
writeln(' 2 „®Ў ўЁвм н«Ґ¬Ґ­в ў Є®­Ґж бЇЁбЄ ');
writeln(' 3 „®Ў ўЁвм н«Ґ¬Ґ­в Ї®б«Ґ гЄ § ­­®Ј®');
writeln(' 4 „®Ў ўЁвм н«Ґ¬Ґ­в ЇҐаҐ¤ гЄ § ­­л¬');
writeln(' 5 “¤ «Ёвм н«Ґ¬Ґ­в Ё§ ­ з «  бЇЁбЄ ');
writeln(' 6 “¤ «Ёвм н«Ґ¬Ґ­в Ё§ Є®­ж  бЇЁбЄ ');
writeln(' 7 “¤ «Ёвм н«Ґ¬Ґ­в Ї® §­ зҐ­Ёо');
writeln(' 8 “¤ «Ёвм н«Ґ¬Ґ­в Ї®б«Ґ гЄ § ­­®Ј®');
writeln(' 9 “¤ «Ёвм н«Ґ¬Ґ­в ЇҐаҐ¤ гЄ § ­­л¬');
writeln('10 ђ бЇҐз в вм бЇЁб®Є');
writeln('11 Ќ ©вЁ н«Ґ¬Ґ­в Ї® ҐЈ® §­ зҐ­Ёо');
writeln('12 Ё«Ё «оЎ п ¤агЈ п жЁда  ўл室Ёв Ё§ Їа®Ја ¬¬л.');
end;

procedure print_list(_node_pointer:node_pointer);
begin
if(_node_pointer<>NIL)then
begin
writeln('<< ЌЂ—Ђ‹Ћ ‘Џ€‘ЉЂ >>');
while _node_pointer<>NIL do
begin
write(_node_pointer^.data:4);
_node_pointer:=_node_pointer^.next;
end;
writeln;
writeln('<< ЉЋЌ…– ‘Џ€‘ЉЂ >>');
end
else
writeln('<< ‘Џ€‘ЋЉ Џ“‘’ >>');
end;

procedure add_to_end(var _node_pointer:node_pointer;data_to_add:integer);
var
new_node_pointer:node_pointer;
last_node_pointer:node_pointer;
begin
new(new_node_pointer);{ᮧ¤ Ґ¬ ­®ўл© н«Ґ¬Ґ­в бЇЁбЄ }
new_node_pointer^.next:=NIL;
new_node_pointer^.data:=data_to_add;
last_node_pointer:=_node_pointer;
while(last_node_pointer^.next<>NIL) and (last_node_pointer<>NIL)do{ЁйҐ¬ Ї®б«Ґ¤­Ё© н«Ґ¬Ґ­в}
last_node_pointer:=last_node_pointer^.next;
if(_node_pointer<>NIL)then{Ґб«Ё ¤® нв®Ј® Ўл« Їгбв®© бЇЁб®Є}
last_node_pointer^.next:=new_node_pointer{ЇаЁбў Ёў Ґ¬ Ґ¬г ­®ў®Ґ §­ зҐ­ЁҐ}
else{Ё­ зҐ}
_node_pointer:=new_node_pointer;{¤®Ў ў«пҐ¬ ­®ўл© н«Ґ¬Ґ­в}
end;

procedure add_to_start(var _node_pointer:node_pointer;data_to_add:integer);
var
new_node_pointer:node_pointer;
last_node_pointer:node_pointer;
begin
new(new_node_pointer);{ᮧ¤ Ґ¬ ­®ўл© н«Ґ¬Ґ­в бЇЁбЄ }
new_node_pointer^.next:=_node_pointer;
new_node_pointer^.data:=data_to_add;
_node_pointer:=new_node_pointer;{¬Ґ­пҐ¬ гЄ § вҐ«м ­  ­ з «® бЇЁбЄ }
end;

function add_after(var _node_pointer:node_pointer;data_before,data_to_add:integer):boolean;
var
current_node_pointer:node_pointer;
begin
add_after:=false;
current_node_pointer:=_node_pointer;
while (current_node_pointer^.data<>data_before) and (current_node_pointer<>NIL)do{Ї®Є  !­ и«Ё н«Ґ¬Ґ­в Ё !Є®­Ґж бЇЁбЄ }
begin
current_node_pointer:=current_node_pointer^.next;{ЇҐаҐе®¤Ё¬ Є б«Ґ¤го饬г н«Ґ¬Ґ­вг}
end;
if current_node_pointer<>NIL then{Ґб«Ё н«-в ­ ©¤Ґ­}
begin
add_to_start(current_node_pointer^.next,data_to_add);{¤®Ў ў«пҐ¬ н«-в ў ­ з «® ­®ў®Ј® бЇЁбЄ }
add_after:=true;
end;
end;

function add_before(var _node_pointer:node_pointer;data_after,data_to_add:integer):boolean;
var
current_node_pointer:node_pointer;
previous_node_pointer:node_pointer;
begin
add_before:=false;
current_node_pointer:=_node_pointer;
previous_node_pointer:=NIL;
while (current_node_pointer^.data<>data_after) and (current_node_pointer<>NIL)do{Ї®Є  !­ и«Ё н«Ґ¬Ґ­в Ё !Є®­Ґж бЇЁбЄ }
begin
previous_node_pointer:=current_node_pointer;
current_node_pointer:=current_node_pointer^.next;{ЇҐаҐе®¤Ё¬ Є б«Ґ¤го饬г н«Ґ¬Ґ­вг}
end;
if current_node_pointer<>NIL then{Ґб«Ё н«-в ­ ©¤Ґ­}
begin
if previous_node_pointer<>NIL then{Ґб«Ё нв® ў ­ з «Ґ бЇЁбЄ }
begin
add_to_start(current_node_pointer,data_to_add);{¤®Ў ў«пҐ¬ н«-в ў ­ з «® ­®ў®Ј® бЇЁбЄ }
previous_node_pointer^.next:=current_node_pointer;
end
else{Ё­ зҐ}
add_to_start(_node_pointer,data_to_add);{¤®Ў ў«пҐ¬ н«-в ў ­ з «® ­®ў®Ј® бЇЁбЄ }
add_before:=true;
end;
end;

function delete_at_start(var _node_pointer:node_pointer):boolean;
var
deleted_node_pointer:node_pointer;
begin
if _node_pointer<>NIL then{Ґб«Ё бЇЁб®Є ­Ґ Їгбв}
begin
deleted_node_pointer:=_node_pointer;{б®е࠭塞  ¤аҐб г¤ «пҐ¬®Ј® н«Ґ¬Ґ­в }
_node_pointer:=_node_pointer^.next;{¤ўЁЈ Ґ¬ Ї®Ё­вҐа}
dispose(deleted_node_pointer);{г¤ «пҐ¬}
delete_at_start:=true;
end
else{Ё­ зҐ}
delete_at_start:=false;{®иЁЎЄ }
end;

function delete_at_end(var _node_pointer:node_pointer):boolean;
var
current_node_pointer:node_pointer;
begin
if _node_pointer<>NIL then{Ґб«Ё бЇЁб®Є ­Ґ Їгбв}
begin
current_node_pointer:=_node_pointer;
if current_node_pointer^.next=NIL then{Ґб«Ё в®«мЄ® 1 н«Ґ¬Ґ­в}
delete_at_start(_node_pointer){г¤ «пҐ¬ б­ з « }
else{Ё­ зҐ}
begin
while current_node_pointer^.next^.next<>NIL do{Ї®Є  ­Ґ ЇаҐ¤Ї®б«Ґ¤­Ё© н«Ґ¬Ґ­в}
current_node_pointer:=current_node_pointer^.next;{¤ўЁЈ Ґ¬бп ўЇҐаҐ¤}
dispose(current_node_pointer^.next);{г¤ «пҐ¬ Ї®б«Ґ¤­Ё© н«Ґ¬Ґ­в}
current_node_pointer^.next:=NIL;{§ Ўлў Ґ¬ ббл«Єг ­  Ї®б«Ґ¤­Ё© н«Ґ¬Ґ­в}
end;
delete_at_end:=true;
end
else{Ё­ зҐ}
delete_at_end:=false;{®иЁЎЄ }
end;

function delete_by_value(var _node_pointer:node_pointer;data_to_delete:integer):boolean;
var
current_node_pointer,previous_node_pointer:node_pointer;
begin
delete_by_value:=false;
current_node_pointer:=_node_pointer;
previous_node_pointer:=NIL;
if _node_pointer<>NIL then{Ґб«Ё бЇЁб®Є ­Ґ Їгбв}
begin
while (current_node_pointer<>NIL) and (current_node_pointer^.data<>data_to_delete)do{Ї®Є  !гўЁ¤Ё¬ н«Ґ¬Ґ­в Ё !Є®­Ґж бЇЁбЄ }
begin
previous_node_pointer:=current_node_pointer;{¤ўЁЈ Ґ¬бп ўЇҐаҐ¤}
current_node_pointer:=current_node_pointer^.next;
end;
if current_node_pointer<>NIL then{Ґб«Ё н«Ґ¬Ґ­в ­ ©¤Ґ­}
begin
delete_by_value:=true;
if previous_node_pointer<>NIL then{Ґб«Ё ­Ґ ў ­ з «Ґ}
begin
delete_at_start(current_node_pointer);{г¤ «пҐ¬ ⥪гйЁ© н«Ґ¬Ґ­в}
previous_node_pointer^.next:=current_node_pointer;{б®е࠭塞 ббл«Єг}
end
else{Ё­ зҐ}
delete_at_start(_node_pointer);{г¤ «пҐ¬ Ё§ ­ з « }
end;
end;
end;

function delete_after(_node_pointer:node_pointer;data_to_delete:integer):boolean;
var
current_node_pointer,previous_node_pointer:node_pointer;
begin
delete_after:=false;
current_node_pointer:=_node_pointer;
previous_node_pointer:=NIL;
if _node_pointer<>NIL then{Ґб«Ё бЇЁб®Є ­Ґ Їгбв}
begin
while (current_node_pointer<>NIL) and (current_node_pointer^.data<>data_to_delete)do{Ї®Є  !гўЁ¤Ё¬ н«Ґ¬Ґ­в Ё !Є®­Ґж бЇЁбЄ }
begin
previous_node_pointer:=current_node_pointer;{¤ўЁЈ Ґ¬бп ўЇҐаҐ¤}
current_node_pointer:=current_node_pointer^.next;
end;
if current_node_pointer<>NIL then{Ґб«Ё н«Ґ¬Ґ­в ­ ©¤Ґ­}
delete_after:=delete_at_start(current_node_pointer^.next);{г¤ «пҐ¬ ¤ ­­л© н«Ґ¬Ґ­в}
end;
end;

function delete_before(var _node_pointer:node_pointer;data_to_delete:integer):boolean;
var
current_node_pointer,previous_node_pointer:node_pointer;
begin
delete_before:=false;
current_node_pointer:=_node_pointer;
previous_node_pointer:=NIL;
while (current_node_pointer^.next<>NIL) and (current_node_pointer^.next^.data<>data_to_delete)do{Ї®Є  !­ и«Ё н«-в Ё !Є®­Ґж}
begin
previous_node_pointer:=current_node_pointer;
current_node_pointer:=current_node_pointer^.next;{ЇҐаҐе®¤Ё¬ Є б«Ґ¤го饬г н«Ґ¬Ґ­вг}
end;
if current_node_pointer^.next<>NIL then{Ґб«Ё н«-в ­ ©¤Ґ­}
begin
if previous_node_pointer<>NIL then{Ґб«Ё нв® ў ­ з «Ґ бЇЁбЄ }
begin
delete_before:=delete_at_start(current_node_pointer);{¤®Ў ў«пҐ¬ н«-в ў ­ з «® ­®ў®Ј® бЇЁбЄ }
previous_node_pointer^.next:=current_node_pointer;
end
else{Ё­ зҐ}
delete_before:=delete_at_start(_node_pointer);{¤®Ў ў«пҐ¬ н«-в ў ­ з «® ­®ў®Ј® бЇЁбЄ }
end;
end;

function find_element(_node_pointer:node_pointer;data_to_find:integer):boolean;
begin
while (_node_pointer<>NIL) and (_node_pointer^.data<>data_to_find)do
_node_pointer:=_node_pointer^.next;
find_element:=_node_pointer<>NIL;
end;

var
exit:boolean;
response:byte;
_node_pointer:node_pointer;
begin
exit:=false;
_node_pointer:=NIL;
while not exit do{Ї®Є  ­Ґ ­г¦­® ўл©вЁ}
begin
show_menu;{Ї®Є §лў Ґ¬ ¬Ґ­о}
response:=get_int('‚лЎҐаЁвҐ ў аЁ ­в');{зЁв Ґ¬ ®вўҐв Ї®«м§®ў вҐ«п}
writeln;
case response of
1:add_to_start(_node_pointer,get_int('‚ўҐ¤ЁвҐ зЁб«®, Є®в®а®Ґ ­г¦­® ¤®Ў ўЁвм ў ­ з «® бЇЁбЄ '));{¤®Ў ў«пҐ¬ н«-в ў ­ з «®}
2:add_to_end(_node_pointer,get_int('‚ўҐ¤ЁвҐ зЁб«®, Є®в®а®Ґ ­г¦­® ¤®Ў ўЁвм ў Є®­Ґж бЇЁбЄ '));{¤®Ў ў«пҐ¬ н«Ґ¬Ґ­в б Є®­ж }
3:if not add_after(_node_pointer,get_int('‚ўҐ¤ЁвҐ зЁб«®, Ї®б«Ґ Є®в®а®Ј® ­г¦­® ¤®Ў ўЁвм'),
get_int('‚ўҐ¤ЁвҐ зЁб«®, Є®в®а®Ґ ­г¦­® ¤®Ў ўЁвм')) then{¤®Ў ў«пҐ¬ н«Ґ¬Ґ­в Ї®б«Ґ ­г¦­®Ј®}
writeln('<< ќ«Ґ¬Ґ­в, Ї®б«Ґ Є®в®а®Ј® ­г¦­® ¤®Ў ў«пвм, ­Ґ ­ ©¤Ґ­ >>');
4:if not add_before(_node_pointer,get_int('‚ўҐ¤ЁвҐ зЁб«®, ¤® Є®в®а®Ј® ­г¦­® ¤®Ў ўЁвм'),
get_int('‚ўҐ¤ЁвҐ зЁб«®, Є®в®а®Ґ ­г¦­® ¤®Ў ўЁвм')) then{¤®Ў ў«пҐ¬ н«Ґ¬Ґ­в ¤® ­г¦­®Ј®}
writeln('<< ќ«Ґ¬Ґ­в, ¤® Є®в®а®Ј® ­г¦­® ¤®Ў ў«пвм, ­Ґ ­ ©¤Ґ­ >>');
5:if not delete_at_start(_node_pointer)then{г¤ «пҐ¬ н«Ґ¬Ґ­в Ё§ ­ з «  бЇЁбЄ }
writeln('<< ЌҐў®§¬®¦­® г¤ «Ёвм н«Ґ¬Ґ­в Ё§ ­ з «  (бЇЁб®Є Їгбв) >>');
6:if not delete_at_end(_node_pointer)then{г¤ «пҐ¬ н«Ґ¬Ґ­в Ё§ Є®­ж  бЇЁбЄ }
writeln('<< ЌҐў®§¬®¦­® г¤ «Ёвм н«Ґ¬Ґ­в Ё§ Є®­ж  (бЇЁб®Є Їгбв) >>');
7:if not delete_by_value(_node_pointer,get_int('‚ўҐ¤ЁвҐ §­ зҐ­ЁҐ н«Ґ¬Ґ­в , Є®в®ал© ­г¦­® г¤ «Ёвм'))then
{г¤ «пҐ¬ н«-в Ї® ҐЈ® §­ зҐ­Ёо}
writeln('<< ЌҐў®§¬®¦­® г¤ «Ёвм н«Ґ¬Ґ­в Ї® ҐЈ® §­ зҐ­Ёо >>');
8:if not delete_after(_node_pointer,get_int('‚ўҐ¤ЁвҐ §­ зҐ­ЁҐ н«Ґ¬Ґ­в , Ї®б«Ґ Є®в®а®Ј® ­г¦­® г¤ «Ёвм'))then
{г¤ «пҐ¬ н«-в Ї®б«Ґ гЄ § ­­®Ј®}
writeln('<< ЌҐў®§¬®¦­® г¤ «Ёвм н«Ґ¬Ґ­в Ї®б«Ґ гЄ § ­­®Ј® >>');
9:if not delete_before(_node_pointer,get_int('‚ўҐ¤ЁвҐ §­ зҐ­ЁҐ н«Ґ¬Ґ­в , ¤® Є®в®а®Ј® ­г¦­® г¤ «Ёвм'))then
{г¤ «пҐ¬ н«-в ¤® гЄ § ­­®Ј®}
writeln('<< ЌҐў®§¬®¦­® г¤ «Ёвм н«Ґ¬Ґ­в ¤® гЄ § ­­®Ј® >>');
10:print_list(_node_pointer);{ўлў®¤Ё¬ бЇЁб®Є}
11:if find_element(_node_pointer,get_int('‚ўҐ¤ЁвҐ, Є Є®© н«Ґ¬Ґ­в ­ ¤® ЁбЄ вм'))then
writeln('<< ќ«Ґ¬Ґ­в ЌЂ‰„…Ќ >>')
else
writeln('<< ќ«Ґ¬Ґ­в Ќ… ­ ©¤Ґ­>>');
12:exit:=true;{­  ўл室}
end;
end;
end.
Соседние файлы в папке 04