- •Лабораторна робота № 12.
- •4. Короткі теоретичні відомості.
- •4.1. Статичні і динамічні змінні
- •4.2. Посилання і покажчики
- •4.3. Лінійний (одно направлений) список
- •4.3.1. Створення і проглядання списку
- •4.3.2. Створення списку цілих чисел впорядкованих за збільшенням
- •4.3.3. Видалення елемента із списку
- •4.4. Двох зв'язаний список - кільце
- •4.5. Стек
- •4.6. Черга
- •5. Варіанти завдань
4.3. Лінійний (одно направлений) список
4.3.1. Створення і проглядання списку
З визначення списку виходить, що кожний його елемент містить поле даних (data) (воно може мати складну структуру) і поле посилання на наступний елемент (next). Поле посилання останнього елемента повинне містити порожній покажчик (nil).
Приклад 1 Сформувати список, що містить цілі числа 3, 5, 1, 9.
Визначимо запис типу s з полями, що містять характеристики даних - значення чергового елемента data і адреси наступного за ним елемента next.
Type ptr=^s
s =record
data: integer;
next: ptr;
end;
Щоб список існував, треба визначити покажчик на його початок.
Опишемо змінні: Var u,sl:ptr;
Таким чином, ми описали посилальний тип, за допомогою якого можна створити наш зв'язаний одно направлений список:
При роботі із списками дуже важливо зрозуміти спосіб переходу від одного елемента списку до наступному по порядку елемента. Наприклад, якщо покажчик а є посиланням на який-небудь елемент списку, то для привласнення цьому покажчику нове значення посилання на наступний елемент треба виконати оператор привласнення: а:=a^.ptr; є аналогом оператора i:=i+1 (i - змінна цілого типу), який виконувався, наприклад, для отримання індексу i наступного елемента масиву.
Статична
змінна Динамічні змінні
u u^ u^. next^ u^. next^. next^
|
|
|
|
|
|
|
|
nil |
|
|
3 |
|
5 |
|
1 |
|
9 |
Створимо перший елемент:
New(u); {виділимо місце в пам'яті для змінної u^ типу S}
u u^
-
u^. next
u^. data
u^. next := NIL; { покажчик порожній }
u u^
-
nil
u^. next
u^. data
u^. data := 3; { інформаційне поле першого елемента)
u u^
-
nil
u^. next
3
u^. data
Продовжимо формування списку, для цього потрібно додати елемент в кінець списку. Для цього введемо допоміжну змінну sl вказівного типу, яка берегтиме адресу останнього елемента списку.
sl:= u;
Тепер останній елемент списку співпадає з його початком
u u^ sl ^
-
nil
u^. next sl ^. next
3
u^. data sl ^. data
sl
Таким чином, до області пам'яті можна звернутися через два покажчики. Далі, створимо область пам'яті для наступного елемента списку.
New(u^.next)
u u^ sl ^ u^.next
-
3
sl
Привласнимо змінній sl значення адреси виділеної області пам'яті:
sl:=
sl
^.next;
Після
цього статична змінна sl
приймає
значення адреси виділеної області
пам'яті.
Визначимо
значення цього елемента списку:
sl^.data:=5;
sl^.next:=nil;
u u^ sl ^ u^.next u u^ sl ^ u^.next
|
|
|
|
|
|
|
|
|
|
|
|
nil |
|
|
|
3 |
|
|
|
|
|
|
|
3 |
|
5 |
|
sl sl
|
|
|
|
|
|
Оформимо створення списку у вигляді програми, в якій його елементи вводяться з клавіатури.
Program p3; { створення і проглядання списку }
type ptr=^s;
s =record
data: integer;
next: ptr;
end;
var d:integer; {значення інформаційної частини елемента списку}
u, sl,first: ptr;
Begin
writeln(' Введіть список ');
u:= nil; {список пуст}
writeln('Bвeдите елементи списку. Кінець введення 0'); read(d);
while d<>0 Do
begin
new(sl); { формування елемента списку }
sl^.next:=nil;
sl^.data:=d;
if u=nil
then begin
u:=sl; { вставляємо перший елемент списку }
first:=u {запам'ятовуємо адресу першого елемента списку}
end
else u^.next:=sl; {вставляємо елемент в кінець списку}
u:=sl;{переносимо значення покажчика на останній еле-нт списку}
read(d);
end;
{Проглядання списку здійснюється послідовно, починаючи з його початком. Покажчик first послідовно посилається на перший, другий, і т.д. елементи списку до тих пір, поки весь список не буде пройдений. При цьому з кожним елементом списку виконується операція write(first^.data'). Початкове значення first — адреса першого елемента списку first^}
while first<>nil do
begin
write(first^.data,' ');
first:=first^.next;
end;
readkey;
End.
Отже, ми побудували список додаванням елементів в кінець списку. Вставимо елемент із значенням 7 в початок списку.
Нам необхідно отримати наступний список:
u
-
nil
7
3
5
1
9
Виконаємо наступні дії:
New(sl); {створення нової динамічної змінної}
u
-
nil
3
5
1
9
sl
sl.data := 7; {інформаційне поле створеного елемента}
sl.next := u; {приєднаємо елементи списку u до створеного елемента
u
-
nil
3
5
1
9
sl
-
sl.next
7
sl.data
u := sl; {змінимо значення покажчика початку списку}
u
-
nil
3
5
1
9
sl
-
sl.next
7
sl.data