Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   стек, список в паскале абц (поясните) (http://forum.oszone.net/showthread.php?t=250919)

Евгений_Еров@vk 08-01-2013 14:59 2061801

стек, список в паскале абц (поясните)
 
вобщем есть программа, рабочая 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 2062163

Цитата:

Цитата Евгений_Еров@vk
не пойму процедуру удаления
зачем нам ? »

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

Евгений_Еров@vk 10-01-2013 19:22 2063618

блин...модераторы наверно убрали... я хотел узнать что делает
Код:

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

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

ViRTaCe 11-01-2013 03:00 2063895

Полностью очищает стек

ferget 11-01-2013 09:21 2063979

Цитата:

Цитата ViRTaCe
Полностью очищает стек »

Стек тут не причем, здесь обрывается цепочка нод и последней полю next присваивается nil

Евгений_Еров@vk 13-01-2013 20:44 2066052

то есть этот кусочек удаляет указатель на удаленный элемент?

ferget 13-01-2013 22:25 2066110

Нет, этот код присваивает указателю значение nil, а зтем элемент удаляется dispose(v);


Время: 07:07.

Время: 07:07.
© OSzone.net 2001-