Списки

Покажчики та динамічні змінні дозволяють створювати складні динамічні структури даних, такі як списки і дерева.

Список можна зобразити графічно (рис. 8.6).

Рис. 8.6. Графічне зображення списку

Кожен елемент списку (Вузол) являє собою запис, що складається з двох частин. Перша частина – інформаційна. Друга частина відповідає за зв’язок з наступним і, можливо, з попереднім елементом списку. Список, в якому забезпечується зв’язок тільки з наступним елементом, називається однозв’язного.
Для того щоб програма могла використовувати список, треба визначити тип компонентів списку і змінну-покажчик на перший елемент списку. Нижче наведено приклад оголошення компонента списку студентів:

type < font face = "Courier New, Courier, mono">
TPStudent = ^ TStudent; // покажчик на змінну типу TStudent
// опис типу елемента списку
TStudent = record
surname: string [20]; // прізвище
name: string [20]; ' // ім'я
group: integer; // номер групи
address: string [60]; // домашню адресу
next: TPStudent; // покажчик на наступний елемент списку

end;
var
head: TPStudent; // покажчик на перший елемент списку

Додавати дані можна в початок, в кінець або в потрібне місце списку. У всіх цих випадках необхідно коригувати покажчики. На рис. 8.7 зображений процес додавання елементів в початок списку.
Після додавання другого елемента в список head вказує на цей елемент

Рис. 8.7. Додавання елементів до списку

Наступна програма (Її текст приведений в лістингу 8.4) формує список студентів, додаючи прізвища в початок списку. Дані вводяться в поля редагування діалогового вікна програми (Рис. 8.8) і додаються в список натисненням кнопки Додати (suttoni).

Рис. 8.8. Вікно програми Динамічний список 1

Лістинг 8.4. Додавання елемента в початок динамічного списку

unit dlist1_; interface
uses
Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = Class (TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit; // прізвище
Edit2: TEdit; // ім'я
Button1: TButton; // кнопка Додати
Button2: TButton; // кнопка Показати
procedure ButtonlClick (Sender: TObject);
procedure Button2Click (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 TForml.Button1Click (Sender: TObject);
var
curr: TPStudent; // новий елемент списку

begin
new (curr); // виділити пам'ять для елемента списку
curr ^ .f_name : = Edit1.Text;
curr ^ .1_пате : = Edit2.Text;
// додавання в початок списку

curr ^ .next : = Head; head: = curr;
// очистити поля введення

Edit1.text: = ''; Edit2.text: = ;

end;
// вивести список
procedure TForml.Button2Click (Sender: TObject);

var
curr: TPStudent; // поточний елемент списку

n: integer; // довжина (к-ть елементів) списку

st: string; // строкове представлення списку

begin n: = 0; st: = '';
curr : = Head; // покажчик на перший елемент списку

while curr <> NIL do begin
n : = N + 1;
st : = St + curr ^ .f_name + '' + curr ^ .1_name

+ # 13; curr: = curr ^ .next;

// покажчик на наступний елемент end;
if n <> 0
then ShowMessage ( 'Список:' + # 13 + st)
else ShowMessage ( 'У списку немає елементів.');
end;

end.

Додавання елемента в список виконує процедура TForm1.Button1Click, яка створює динамічну змінну-запис, привласнює її полях значення, відповідні вмісту полів введення діалогового вікна, і коригує значення покажчика head.
Відкриття списку виконує процедура TForm1.Button2Click, яка запускається натисканням кнопки Показати. Для доступу до елементів списку використовується покажчик curr. Спочатку він містить адреса першого елемента списку. Після того як перший елемент списку буде оброблений, вказівником curr присвоюється значення поля next тієї записи, на яку вказує curr. В результаті цього змінна curr містить адресу другого елементу списку. Таким чином, покажчик переміщається по списку. Процес повторюється до тих пір, поки значення поля next поточного елемента списку (елементу, адреса якого містить змінна curr) не опиниться одно NIL.