есть в книге такой вот код.. .
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, т. е. дальше элементов нет.
Как-то так...
Вы абсолютно правы, запутались. :)
Начнем с конца. Действительно, по-уму, надо бы указателю на начало списка присвоить пустое значение, чтобы "мусор" не инициализированной глобальной переменной не мешал работе. Кстати, это могло быть сделано при создании, например, главного окна программы.
Теперь что касается добавления. Итак, примем для определенности, что первоначально head имеет значение nil. В обработчике первой кнопки вы выделяете память под новый элемент и присваиваете значения инфомационным полям записи. С этим вопросов нет? НО этот элемент пока "болтается" в воздухе и его надо включить в список, а конкретнее, вставить в начало списка. Для этого полю связи next мы присваиваем значение указателя на начало списка (пока это nil) и указателю на начало списка присваиваем указатель на только что введенный элемент. Т. е. head теперь указывает на Иванов Егор. Далее очистили поля ввода и обработчик завершил свою работу.
Затем в едиты вводим Щербаков Дмитрий и жмем на кнопку. Снова выделяется память и присваиваются значения информационным полям. Приступаем к добавлению элемента в начало списка, учитывая, что теперь head указывает на Иванов Егор. Полю связи мы присваиваем указатель на этого самого Иванова Егора и ИЗМЕНЯЕМ значение указателя на начало списка. Теперь первым становится Щербаков Дмитрий. Поле связи первого элемента указывает на второй, т. е. на Иванова Егора, а поле связи второго имеет значение nil, т. е. дальше элементов нет.
Как-то так...
Похожие вопросы
- надо решить задачку через делфи и паскаль)))
- Вопрос по делфи
- языки делфи и си
- Скажите сколько месяцев нужно изучать Делфи что бы написать программу вывода даты, дня недели и года в окно ?
- Кто может объяснить что такое списки в делфи? Пожалуйста !
- Как свое сворачивать приложение на делфи в tree ася 404048645
- стоит ли изучать ассемблер, если программирую на Делфи? и вообще реально ли что нибудь хорошее, дельное, нужное написать
- Кто работает в делфи или паскале....
- Делфи
- Как сделать защиту в программе написанной на делфи?