Войти

Показать полную графическую версию : стек, список в паскале абц (поясните)


Евгений_Еров@vk
08-01-2013, 14:59
вобщем есть программа, рабочая 100%
не пойму процедуру удаления
зачем нам ?
begin
u:=last;
v:=first;
while u^.next<>first do
begin
u:=u^.next;
end;
first:=u;
first^.next:=nil;
dispose(v);



uses Formsabc;
type
PNode = ^TNode; //Это наш указатель (ссылка)
TNode = record //описание одной ячейки очереди
color: string[30]; // рабочие данные
kod:string[10];
next: PNode; // указатель на следующий элемент очереди
end;

var
first,last: PNode; // переменная, через которую будет общаться с очередью - это и есть "голова" очереди
bt1,bt2,bt3:button;
l:listbox;
d,k:Field;

procedure Add(var first:PNode;var last:PNode);
var n:PNode;
Begin
new(n);
n^.color:=d.text;
n^.kod:=k.text;
n^.next:=nil;
if first=nil then
begin
first:=n;
last:=n;
end
else
begin
n^.next:=last;
last:=n;
end;
End;

procedure Addelement;
begin
Add(first,last);
end;


procedure Print;
var r:PNode;
begin
l.Items.Clear();
r:=Last;
while r<>nil do
begin
l.Items.Add(r^.color+' - '+r^.kod.ToString());
r:=r^.next;
end;
end;

procedure del(var first,last:PNode);
Var v:PNode; u:PNode;
begin
if first=last then
begin
dispose(last);
first:=nil;
last:=nil;
end
else
begin
u:=last;
v:=first;
while u^.next<>first do
begin
u:=u^.next;
end;
first:=u;
first^.next:=nil;
dispose(v);
end;
end;



procedure delelement;
begin
del(first,last);
end;




procedure Main;
Begin
bt1:=new Button('Добавить');
bt2:=new Button('Показать');
bt3:=new Button('Удалить');
LineBreak;
d:=new Field('Цвет',150);
LineBreak;
k:=new Field('код цвета',100);
LineBreak;
l:=new ListBox();
LineBreak;
bt1.click+=Addelement;
bt2.Click+=Print;
bt3.Click+=delelement;
end;




BEGIN
Main;
END.

lxa85
09-01-2013, 01:38
не пойму процедуру удаления
зачем нам ? »
Зачем нужна процедура удаления или как она работает?
Если зачем -- то для красоты и полного набора функционала. Создание/добавление/удаление.
Если как -- убивает ссылки и стирает данные, высвобождая память.

Евгений_Еров@vk
10-01-2013, 19:22
блин...модераторы наверно убрали... я хотел узнать что делает

while u^.next<>first do
begin
u:=u^.next;
end;
first:=u;
first^.next:=nil;

в процедуре удаления

ViRTaCe
11-01-2013, 03:00
Полностью очищает стек

ferget
11-01-2013, 09:21
Полностью очищает стек »
Стек тут не причем, здесь обрывается цепочка нод и последней полю next присваивается nil

Евгений_Еров@vk
13-01-2013, 20:44
то есть этот кусочек удаляет указатель на удаленный элемент?

ferget
13-01-2013, 22:25
Нет, этот код присваивает указателю значение nil, а зтем элемент удаляется dispose(v);




© OSzone.net 2001-2012