Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабPaб3.doc
Скачиваний:
6
Добавлен:
21.02.2016
Размер:
1.27 Mб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]