Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабороторные 2 семестр.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
435.71 Кб
Скачать

6 Організація односпрямованого списку

Мета роботи - отримати практичні навички роботи зі змінними посилального типу та динамічними змінними; освоїти різні способи організації, формування та обробки односпрямованих списків.

6.1 Підготовка до лабораторної роботи

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

6.2 Теоретичні відомості

Використання списків доцільно в тих випадках, коли важко або неможливо передбачити число об'єктів, що обробляються програмою. У подібних ситуаціях використовуються динамічні об'єкти, які створюються не заздалегідь, а в моменти, які визначаються логікою програми. Створені елементи зв'язуються з вже існуючими об'єктами за допомогою покажчиків.

Для опису елемента списку використовується структура, яка описується за допомогою комбінованого типу даних. Всі поля елемента списку за призначенням поділяються на дві групи:

  • інформаційні;

  • адресні.

В інформаційних полях розміщуються ті дані, заради яких і будується список. Елемент списку містить по меншій мірі одне інформаційне поле. Адресні поля служать для зв'язку елементів списку між собою. Для організації односпрямованих списків досить використовувати одне адресне поле.

Для опису односпрямованого списку, елементи якого містять дійсні числа, вводиться тип даних ELEM, у якому поле INF - інформаційне, а поле NEXT - адресне.

TYPE

LINK=^ELEM;

ELEM=RECORD

INF: REAL;

NEXT:LINK

END;

Якщо кількість елементів списку відома, то список може формуватися за допомогою циклу FOR. У цьому випадку перший елемент створюється до виконання цього циклу. Так як елементи списку - динамічні змінні, то черговий елемент виникає при виконанні процедури NEW. В останньому елементі списку адресне поле NEXT є порожнім посиланням NIL.

VAR

F,T,P:LINK;

I,N:INTEGER;

BEGIN

WRITELN(‘Введіть кількість ЕЛЕМЕНТІВ СПИСКУ ‘);

READLN(N);

WRITELN(‘ВВЕДІТЬ ЕЛЕМЕНТИ СПИСКУ ‘);

{ФОРМУВАННЯ 1-го ЕЛЕМЕНТА }

NEW(F);

READLN(F^.INF);

P:=F;

{ФОРМУВАННЯ ІНШИХ ЕЛЕМЕНТІВ }

FOR I:=2 TO N DO

BEGIN

NEW(T);

READLN(T^.INF);

P^.NEXT:=T;

P:=T

END;

T^.NEXT:=NIL;

Для подальшого перегляду списку поточний покажчик потрібно встановити на початок списку T: = F, а переміщатися за списком (переходити на наступний елемент) можна, виконуючи в циклі оператор T: = T ^. NEXT. Наприклад, для знаходження суми всіх елементів списку, служить наступний цикл:

T:=F;

S:=0;{S-змінна дійсного типу }

WHILE T<>NIL DO

BEGIN

S:=S+T^.INF;

T:=T^.NEXT

END;

WRITELN(‘СУМА ЭЛЕМЕНТІВ СПИСКУ-‘, S:7:2);

Виведення списку:

T:=F;

WHILE T<>NIL DO

BEGIN

WRITE(T^.INF:5:2);

T:=T^.NEXT

END;

Приклад. Сформувати список, що складається з символів. Ознака закінчення введення - крапка. Будемо вважати словом послідовність символів, що не містять пробілів. Кількість пробілів на початку списку, в кінці і між словами може бути будь-якою. Підрахувати в списку кількість слів, що містять цифри, а потім видалити всі цифри списку.

TYPE

LINK=^ELEM;

ELEM=RECORD

INF: CHAR;

NEXT:LINK

END;

VAR

P,T,F,N:LINK;

I,K: INTEGER;

L:BOOLEAN;

SIM:CHAR;

BEGIN

{ формування списку }

WRITELN (‘ВВЕДІТЬ СИМВОЛИ ДО КРАПКИ’);

READLN(SIM);

IF SIM=’.’ THEN WRITELN(‘ВИХІДНИЙ СПИСОК ПУСТИЙ ')

ELSE

BEGIN

NEW(F);

P:=F;

P^.INF:= SIM;

READLN(SIM);

WHILE SIM<>’.’ DO

BEGIN

NEW(T);

T^.INF:=SIM;

P^.NEXT:=T;

P:=T;

READLN(SIM);

END;

T^.NEXT:=NIL;

P:=F;

K:=0;

{ виведення списку }

WRITE(‘У вихідному списку – ‘);

WHILE P<>NIL DO

BEGIN

WRITE(P^.INF);

P:=P^.NEXT

END;

WRITELN;

P:=F;

{ прохід за списком }

WHILE P<>NIL DO

BEGIN

L:=TRUE;

{ виділення слів }

WHILE (P<>NIL)AND (P^.INF=’ ‘) DO

P:=P^.NEXT ;

WHILE (P<>NIL)AND(P^.INF<>’ ‘) DO

BEGIN

IF P^.INF IN [‘0’..’9’] THEN L:=FALSE;

P:=P^.NEXT ;

END;

IF NOT L THEN INC(K);

END;

WRITELN (‘КІЛЬКІСТЬ СЛІВ, ЩО МІСТЯТЬ ЦИФРИ =’,K );

{ видалення цифр на початку списку }

P:=F; N:=F;

WHILE (P<>NIL) AND (P^.INF IN [‘0’..’9’]) DO

BEGIN

N:=P^.NEXT;

DISPOSE(P);

P:=N

END;

{ видалення цифр у середині списку }

IF P<>NIl THEN

BEGIN

F:=P;

N:=P;

P:=P^.NEXT;

WHILE P<>NIL DO

BEGIN

IF (P^.INF IN [‘0’..’9’]) THEN

BEGIN

N^.NEXT:=P^.NEXT;

DISPOSE(P);

P:=N^.NEXT;

END

ELSE

BEGIN

N:=P; P:=P^.NEXT;

END;

END;

{ виведення списку }

WRITE(‘СПИСОК БЕЗ ЦИФР – ‘);

P:=F;

WHILE P<>NIL DO

BEGIN

WRITE(P^.INF);

P:=P^.NEXT

END;

WRITELN;

END

ELSE WRITELN (‘У вихідному списку ТІЛЬКИ ЦИФРИ ')

END

END.