
- •1 Виділення слів у текстових файлах
- •1.1 Підготовка до лабораторної роботи
- •Теоретичні відомості
- •Варіанти завдань
- •1.4 Контрольні питання
- •2 Комбінований тип даних
- •2.1 Підготовка до лабораторної роботи
- •2.2 Теоретичні відомості
- •2.3 Варіанти завдань
- •2.4 Контрольні питання
- •3 Сортування масивів комбінованого типу даних
- •3.1 Підготовка до лабораторної роботи
- •3.2 Теоретичні відомості
- •3.3 Варіанти завдань
- •3.4 Контрольні питання
- •4 Підпрограми-процедури
- •4.1 Підготовка до лабораторної роботи
- •4.2 Теоретичні відомості
- •4.3 Варіанти завдань
- •4.4 Контрольні питання
- •5 Підпрограми-функції
- •5.1 Підготовка до лабораторної роботи
- •5.2 Теоретичні відомості
- •5.3 Варіанти завдань
- •Контрольні питання
- •6 Організація односпрямованого списку
- •6.1 Підготовка до лабораторної роботи
- •6.2 Теоретичні відомості
- •6.3 Варіанти завдань
- •6.4 Контрольні питання
- •7 Обробка матриць у середовищі lazarus
- •7.1 Теоретичні відомості
- •7.2 Варіанти завдань
- •7.3 Контрольні питання
- •Перелік посилань
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.