Добавление элемента в список
Листинг 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=^TStudent; //указатель на тип 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;