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

делфи, объясните чутка пжлста

есть в книге такой вот код.. .

unit Unit1;
interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
edt1: TEdit;// фамилия
edt2: TEdit;// имя
btn1: TButton;// кнопка добавить
btn2: TButton;// кнопка показать
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
type
TPStudent = ^TStudent;//указатель на тип TStudent

TStudent = record
f_name:string[20];// фамилия
l_name:string[20];// имя
next:TPStudent;// след. элемент
end;

var
head: TPStudent;// начало (голова) списка

// добавить элемент в начало списка
procedure TForm1.btn1Click(Sender: TObject);
var
curr: TPStudent;// новый элемент списка
begin
New(curr);// выделить память для элемента списка
curr^.f_name := edt1.Text;
curr^.l_name := edt2.Text;

// добавление в начало списка
curr^.next := head;
head := curr;

// очистить поля ввода
edt1.Text := '';
edt2.Text := '';
end;

Допустим мы ввели: Иванов Егор - добавили, потом Щербаков Дмитрий - добавили.. .

Что то я не понимаю,
>По мне так curr^.next := head; присваивает пустой элемент, следовательно следующий элемент пустой, затем head := curr; присваивает Иванов Егор и пустой элемент.. .
>Следом curr^.next := head; 2 элемент пуст, то следующий за ним 3-ий присваивает Иванов Егор и пустой элемент, затем head := curr; присваивает... блин запутался.. .

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

Вы абсолютно правы, запутались. :)

Начнем с конца. Действительно, по-уму, надо бы указателю на начало списка присвоить пустое значение, чтобы "мусор" не инициализированной глобальной переменной не мешал работе. Кстати, это могло быть сделано при создании, например, главного окна программы.

Теперь что касается добавления. Итак, примем для определенности, что первоначально head имеет значение nil. В обработчике первой кнопки вы выделяете память под новый элемент и присваиваете значения инфомационным полям записи. С этим вопросов нет? НО этот элемент пока "болтается" в воздухе и его надо включить в список, а конкретнее, вставить в начало списка. Для этого полю связи next мы присваиваем значение указателя на начало списка (пока это nil) и указателю на начало списка присваиваем указатель на только что введенный элемент. Т. е. head теперь указывает на Иванов Егор. Далее очистили поля ввода и обработчик завершил свою работу.

Затем в едиты вводим Щербаков Дмитрий и жмем на кнопку. Снова выделяется память и присваиваются значения информационным полям. Приступаем к добавлению элемента в начало списка, учитывая, что теперь head указывает на Иванов Егор. Полю связи мы присваиваем указатель на этого самого Иванова Егора и ИЗМЕНЯЕМ значение указателя на начало списка. Теперь первым становится Щербаков Дмитрий. Поле связи первого элемента указывает на второй, т. е. на Иванова Егора, а поле связи второго имеет значение nil, т. е. дальше элементов нет.

Как-то так...
Дархан Салимжанов
Дархан Салимжанов
59 614
Лучший ответ