Другие языки программирования и технологии

delphi, динамические списки

Здравствуйте!
Как бы мне стыдно не было признаваться - но я реально не могу понять даже на логическом уровне как строятся динамические списки и как они именно работают
Там очень много циклов, присваиваний по 3 раза одной и тойже величины, что заблуждает меня совсем
Я примерно понял что такое динамические списки, но не совсем понял что делает у меня мой код,
Он вроде работает, но добавление записей толи перезатирает предыдущий, потому что запись у меня конечная выводится только.
Как работать с типизированными файлами я разобрался, а вот с динамическими списками не могу(что-то схожее есть но логика там разная)

вот мой код, опишите под каждой строчкой пожалуйста что она делает, ОЧЕНЬ ВАС ПРОШУ:

type
PDan = ^Dan;
Dan = record
shifr: integer;
name: string[10];
price: integer;
mass: integer;
next: PDan;
end;

var
Form1: TForm1;
prev, dobav: PDan;
i: integer;
ldan: Dan;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
New(dobav);
dobav^.next:= nil;
with dobav^ do begin

shifr:= StrToInt(Edit1.Text);
name:= Edit2.Text;
price:= StrToInt(Edit3.Text);
mass:= StrToInt(Edit4.Text);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
for i:= 0 to sizeof(next) do begin
Label1.Caption:= Label1.Caption + #13#10 + IntToStr(dobav^.shifr) + '___' + dobav^.name + '___' + IntToStr(dobav^.price) + '___' + IntToStr(dobav^.mass);
end;
end;
Ничего стыдного в том, что чего-то не знаете не вижу. А списки это довольно просто. Вот только на вашем месте я бы начал с чего-нить попроще, чтобы не путаться с кучей присваиваний. И не заморачивался бы с формами, а простенько так, в консоли поэкспериментировал бы. Возьмите для начала просто список чисел. Типа этого (для начала однонаправленный)

type
PList = ^TList;
TList = record
Next : PList; {указатель на следующий элемент}
Num : Integer; {элемент списка}
end;

Для работы со списком нам потребуется по-крайней мере два указателя. Один на начало списка, а второй на текущий элемент.

var Fst, Cur : PList;

Теперь попробуем реализовать процедуру вывода элементов списка на экран.

procedure ShowList(Fst: PList);
var L : PList;
begin
L := Fst;
while L <> Nil do begin
Write(L^.Num:4);
L := L^.Next;
end;
WriteLn;
end;

Процедура имеет один входной параметр, которым задается начало списка. В качестве текущего используется локальная переменная L. После работы процедуры на экране в столбик будут выведены все элементы списка.

Попробуем заполнить список. Пусть это будут нечетные числа из диапазона 1..10

for i:=1 to 10 do
if Odd(i) then begin
if Fst = Nil then begin {первый элемент списка}
New(Cur); {выделяем память}
Fst := Cur; {указатель на начало списка}
end
else begin
New(Cur^.Next); {выделяем память}
Cur := Cur^.Next; {организуем связь элементов}
end;
Cur^.Num := i; {запись информации}
Cur^.Next := Nil; {дальше элементов нет}
end;

Поскольку для элементов списка память выделяется динамически в куче, то при завершении программы ее нужно освободить.

while Fst <> Nil do begin
Cur := Fst;
Fst := Fst^.Next;
Dispose(Cur);
end;

Примерно так.. . Т. к. не разрешены комменты в вопросе, то пояснить смогу только в течение 30 минут. Можете сукнуться в агент или аську 158-419-452.

Что касается вашей просьбы прокомментировать строки вашего кода и завершить его, то не вижу в этом смысла, хотя бы потому, что список, как таковой вы не организуете, поскольку не создаете связей между последним элементом и предыдущим.
Александр Зиборов
Александр Зиборов
59 614
Лучший ответ
Пиши на мыло, договоримся.
.M
... Maks ...
8 247