Добавление элементов в упорядоченный список
Листинг 8.5. Добавление элементов в упорядоченный список
unit dlist2_;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations } public
{ Public declarations } end;
var
Form1: TForm1;
implementation
($R *.DFM}
type
TPStudent=ATStudent; //указатель на тип TStudent
TStudent = record
f_name:string[20]; // фамилия
l_name:string[20]; // имя
next: TPStudent; // следующий элемент списка
end;
var
head: TPStudent; // начало (голова) списка
// добавить элемент в список
procedure TForm1.Button1Click(Sender: TObject);
var
node: TPStudent; // новый узел списка
curr: TPStudent; // текущий узел списка
pre: TPStudent; // предыдущий, относительно curr, узел
begin
new(node);
// создание нового элемента списка
node^.f_name:=Edit1.Text; // фамилия
node^.l_name:=Edit2.Text; // имя
// добавление узла в список
// сначала найдем в списке подходящее место для узла
curr:=head;
pre:=NIL;
{ Внимание!
Если приведенное ниже условие заменить
на (node. f_name>
curr". f__name) and (currONIL) ,
то при добавлении первого узла возникает ошибка времени
выполнения, т. к. curr = NIL и, следовательно,
переменной curr. *name нет!
В используемом варианте условия ошибка не возникает, т. к.
сначала проверяется условие (curr о NIL), значение которого
FALSE, и второе условие в этом случае не проверяется.
}
while (curr о NIL) and (node.f_name >
curr^.f_name) do
begin
// введенное значение больше текущего pre:= curr;
curr:=curr^.next; // к следующему узлу
end;
if pre = NIL then
begin
// новый узел в начало списка
node^. next: =head; head:=node;
end
else
begin
// новый узел после pre, перед
curr node^.next:=рre^.next;
рrе^.next:=node;
end;
Edit1.text:='';
Edit2.text:='';
Edit1.SetFocus;
end;
// отобразить список
procedure TForm1.Button2Click(Sender: TObject);
var
curr: TPStudent; // текущий элемент списка
n:integer; // длина (кол-во элементов) списка
at:string; // строковое представление списка
begin
n:=0;
st: = '';
curr:=head;
while curr <>
NIL
do
begin n:=n+l;
st:=st+curr^.f_name+' '+currA.l_name+#13;
curr:=curr^.next;
end; if n <>
0
then ShowMessage('Список: '+ЦЗ+st)
else ShowMessage('В списке нет элементов.');
end;
// начало работы программы
procedure TForm1.FormActivate(Sender: TObject);
begin
head:=NIL; // список пустой
end;
end.
Процедура TFormi.ButtoniClick создает динамическую переменную-запись, присваивает ее полям значения, соответствующие содержимому полей ввода диалогового окна, находит подходящее место для узла и добавляет этот узел в список, корректируя при этом значение указателя узла next, после которого должен быть помещен новый узел.