Додавання елемента в список

Додавання елемента в список виконується шляхом коригування покажчиків. Для того щоб додати елемент в упорядкований список, потрібно спочатку знайти елемент, після якого потрібно вставити новий. Потім слід скорегувати покажчики. покажчик нового елемента потрібно встановити на той елемент, на який вказує елемент, після якого додається новий. Покажчик елемента, після якого додається новий елемент, встановити на цей новий елемент (рис. 8.9).

Рис. 8.9. Додавання елемента в упорядкований список

Рис. 8.10. Діалогове вікно програми Упорядкований динамічний список 2

Наступна програма (Її текст приведений в лістингу 8.5, а діалогове вікно – на рис. 8.10) формує список, упорядкований по полю Прізвище. Дані вводяться в поля редагування (Edit1 і Edit2) і натисканням кнопки Додати (Buttoni) додаються в список таким чином, що список завжди впорядкований по полю Прізвище.

Лістинг 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 = A 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 & gt; 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 + ' '+ Curr A .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, після якого повинен бути поміщений новий вузол.

Рис. 8.11. Приклад упорядкованого списку, сформованого програмою

Відкриття списку виконує процедура TForml.Button2Сlick, яка запускається натисканням кнопки Показати. Після запуску програми і введення не «/ font> скількох прізвищ, наприклад, в такій послідовності: Іванов, Яковлєв, Алексєєв, петрів, список виглядає так, як показано на рис. 8.11.