Додавання елемента в список виконується шляхом коригування покажчиків. Для того щоб додати елемент в упорядкований список, потрібно спочатку знайти елемент, після якого потрібно вставити новий. Потім слід скорегувати покажчики. покажчик нового елемента потрібно встановити на той елемент, на який вказує елемент, після якого додається новий. Покажчик елемента, після якого додається новий елемент, встановити на цей новий елемент (рис. 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.