Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_СиОД_метЗап.doc
Скачиваний:
1
Добавлен:
08.08.2019
Размер:
238.59 Кб
Скачать

4. Лінійний однозв'язний список.

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

Мал. 1. Найпростіший лінійний список

Типовий набір операцій над списком, якими визначається логічна структура списку, буде включати додавання, видалення і пошук його елементів, обчислення довжини списку, послідовну обробку елементів (ітерацію) списку.

Як правило, при описі списку представлення кожного елемента списку описується у виді окремого класу. У цьому класі в якості його атрибута мається посилання на наступний і/чи попередній елемент. У листингу 1. представлений опис класу intList, що задає найпростіший односпрямований список з цілих чисел.

Листинг 4.1. Визначення класу intList //файл intlist.h class IntList {

/* Клас ListItem представляє елемент списку, зв'язаний з наступним за допомогою покажчика, що міститься в полі next */

struct ListItem {

int item; // значення елемента списку ListItem *next; // покажчик на наступний елемент списку // Конструктор для створення нового елемента ListItem(int і, ListItem *n = NULL) { item = і; next = n; } }; int count;// лічильник числа елементів

ListItem *first; // перший елемент списку ListItem *last; // останній елемент списку public :

// Конструктор за замовчуванням - створення порожнього списку IntList() { count = 0; first = last = NULL; }

// Конструктор копіювання - створення копії наявного списку IntList(const IntList & src); // Деструктор списку ~IntList(); // Доступ до першого елемента списку

int head() const { return first->item; }

int & head() { retprn first->item; } // Доступ до останнього елемента списку int tail () const return last->item; } int & tail() { zjbturn last->item; }

// Додати один елемент у початок списку void addFirst(int item); // Додати один елемент у кінець списку void addLast{int item); // Додати елементи іншого списку в кінець цього void addLast(const IntList & src); // Видалити перший елемент int removeFirst();

// кількість елементів списку int getCount() { return count; } }; // Кінець визначення класу IntList

5. Багатозв’язні лінійні спискові структури.

Однозв'язний лінійний та кільцевий списки мають ще таку ваду: обробка списку можлива тільки в одному напрямку згідно з напрямком покажчика. В деяких випадках, наприклад, в довгих списках ( списках з багатьма елементами ) це буде серьйозним недоліком при необхідності просування по списку . Цей недолік можна виправити, якщо в кожному елементі списку передбачити два покажчика: 0дин на наступний, а другий на попередній елемент списку. Їх звуть відповідно прямий та зворотній покажчики

Info

Next

Pred

Beg

Info N

Info N-1

Info 1

End

Лінійність 2-х зв'язного спска випливає з того, що кожен з двох покажчиків, окрім покажчиків в крайніх елементах списку, забезпечує лінійний порядок в своєму напрямку. Обмеження довжини списку забезпечуєтьзя значенням NULL (нікуди не показує ) покажчика Next на наступний елемент. Відповідно, початок списку визначається елементом списку, в котрому значення NULL має покажчик Pred на попередній елемент. Слід зазначити, що доступ до списку можливий як до початку списку через вказівник Beg на початок списку, так і до кінця списку через вказівник End на кінець списку. Якщо покажчики крайніх елементів списку " замкнути " відповідно на початок і кінець 2-х зв'язного списку він перетворюється в 2-х зв'язний кільцевий список.

Логічна структура 2-х зв'язнних списків визначається операціями, які дозволяються над списком: відбудова списку, перегляд в прмому та зворотньому напрямку, додавання та вилучення елементів, пошук елемента за тою чи іншою ознакою і інші.

Фізична структура списка визначається інформаційним вектором або дескриптором, який має структуру записів зі звичайним для інформаційних векторів набором полів: кода структури, іменем списка, адресою початка і кінця списка і, звичайно, опису елемента списка.

Засобами мови С++ найпростішим описом елемента 2-х зв'язнонго списка можна вважати описом за допомогою структури: struct T2sp{ Tinfo Info; T2sp *Next, *Pred; } ;

Основні операції над 2-х зв'язним списком.

Утворення 2-х зв'язного списку з одного елемента : T2sp *Beg=NULL; T2sp *End=NULL; T2sp *T; T=new T2sp; T->Info=Info1; T->Next=NULL; T->Pred=NULL; Beg=T; End=T;

Додавання до початку списку:

T=new T2sp; T->Info=InfoN+1; T->Next=Beg; T->Pred=NULL; Beg->Pred=T; Beg=T;

Додавання до середини списку:

Додатковий ( "робочий") покажчик Rab розташований на елементі списку, за яким передбачається розташувати додаваємий елемент. T=new T2sp; T->Info=InfoК+1; T->Next=Rab->Next; T->Pred=Rab; Rad->Next->Pred=T; Rab->Next=T;

Вилучення з кінця списку: T=End; End = End->Pred; End->Next=NULL; delete T;

Вилучення з середини списку:

Додатковий ( "робочий") покажчик Rab розташований на елементі списку, за яким передбачається вилучити елемент. T=Rab->Next; Rab->Next=T->Next; T->Next->Pred=Rab; delete T;

Запити до захисту лабораторної роботи.

  1. Визначення стека як логічної структури даних.

  2. Фізична стуктура динамічного стеку.

  3. Алгоритм дадавання елемента до стеку.

  4. Алгоритм вилучення елемента зі стеку.

  5. Визначення черги як логічної структури даних.

  6. Фізична стуктура динамічної черги.

  7. Алгоритм дадавання елемента до черги.

  8. Алгоритм вилучення елемента з черги.

  9. Лінійний однозв'язний список. Логічна і фізична структура.

  10. Агоритм додавання і вилучення з середини списку.

  11. Лінійний двохзв'язний список. Логічна і фізична структура.

  12. Агоритм додавання і вилучення з середини списку.

Лабораторна робота № 4

Списки з каталогами.

Мета роботи: Практично реалізувати списки з каталогами як приклади статичних і динамічних нелінійних структур даних.

Зміст роботи та звіту.

  1. Коротко описати основні відомості про списки з каталогами: їх застосування, способи подавання статичними і динамічними нелінійними списковими структурами.

  2. Розробити алгоритми основних методів обробки списків з каталогами .

  3. Реалізувати розроблені алгоритми програмою, відлагоджений текст якої подати до звіту.

  4. Привести приклади результатів роботи програми.

Завдання :

Розробити програму обробки результатів змагань : 1) з бігу на короткі дистанції( чоловіки і жінки на 100 м, 200 м, 110 м з бар'єрами); 2) з бігу на середні дистанції ( чоловіки і жінки на 400 м, 800 м, 1500 м ); 3) з бігу на довгі дистанції( чоловіки і жінки на 5000 м, 10000 м, марафон); 4) з стрибків в довжину, в висоту, потрійним, з жердиною ( чоловіки і жінки ); 5) з плавання вільним стилем( чоловіки і жінки на 100 м, 400 м, 1500 м); 6) з плавання брасом( чоловіки і жінки на 100 м, 400 м, 1500 м); 7) з плавання на спині( чоловіки і жінки на 100 м, 400 м, 1500 м); 8) з плавання батерфляєм( чоловіки і жінки на 100 м, 400 м, 1500 м); 9) з метання диску, спису, молота ( чоловіки і жінки);

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