Основы языка Delphi

79b4045b

Добавление элементов в упорядоченный список



Листинг 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, после которого должен быть помещен новый узел.



Содержание раздела