Лінійні однорангові списки
Довжина списку. Кількість елементів у списку.
Списки можуть бути типізований або нетипізований. Якщо список типізований, то тип його елементів заданий, і всі його елементи повинні мати типи, сумісні з заданим типом елементів списку. Зазвичай списки, реалізовані за допомогою масивів, є типізований.
Список може бути сортовані або несортовані
Залежно від реалізації може бути можливий довільний доступ до елементів списку.
елемент списку доступний в програмі через покажчик. «Сенс» цього покажчика відображає функціональне призначення елемента списку в програмі: перший, останній, поточний, попередній, новий і т.п. Між покажчиком і елементом списку є така ж взаємозв'язок, як між індексом в масиві і елементом масиву;
в програмі список задається за допомогою заголовка - покажчика на перший елемент списку;
порядок проходження елементів визначається послідовністю зв'язків між елементами. Зміна порядку елементів (вставка, видалення) здійснюються зміною перевстановлення покажчиків на сусідні елементи.
логіческій (порядковий) номер елемента списку також задається його природною нумерацією в ланцюжку елементів;
спісок є структурою даних з послідовним доступом. Для полученіяn-го за рахунком елемента необхідно послідовно пройти по ланцюжку від елемента, на який є покажчик (наприклад, від заголовка);
спісок зручний для використання саме як динамічна структура даних. елементи списку зазвичай створюються як динамічні змінні, а зв'язки між ними встановлюються програмно (динамічно);
спісок має властивість локальності змін: при вставці / видаленні елемента зміни стосуються тільки поточного та його сусідів. Згадаймо масив: при вставці / видаленні його елементів відбувається фізичне переміщення (зрушення) всіх елементів від поточного до кінця.
Звідси випливає, що переваги списків проявляються в таких структурах даних, де операції зміни порядку превалюють над операціями доступу і пошуку.
Операції, які ми маємо право виконувати з лінійними списками:
1. Отримати доступ до k-му вузлу списку, щоб проаналізувати і / або
змінити вміст його полів.
2. Включити новий вузол безпосередньо перед k-им вузлом.
3. Виключити k-й вузол.
4. Об'єднати два (або більше) лінійних списки в один список.
5. Розбити лінійний список на два (або більше) списку.
6. Зробити копію лінійного списку.
7. Визначити кількість вузлів в списку.
8. Виконати сортування вузлів списку в порядку зростання за деякими
9. Знайти в списку вузол з заданим значенням в деякому полі.
Односпрямований і двонаправлений список
Односпрямований і двонаправлений список - це лінійний список, в якому все виключення і додавання відбуваються в будь-якому місці списку.
Односпрямований список відрізняється від двунаправленного списку лише зв'язком. Тобто в однобічному списку можна переміщатися тільки в одному напрямку (з початку в кінець), а двунаправленном - в будь-якому.
Приклад 2. Видалення з односпрямованого списку елемента з номером k
Якщо покажчик посилається лише на наступну ланку списку (як показано на малюнку і в оголошеній вище структурі), то такий список називають односпрямованим. якщо на наступне та попереднє ланки -двунаправленним списком. Якщо покажчик в останньому ланці встановлений не в Nil, а посилається на головній ланка списку, то такий список називаетсякольцевим. Кільцевими можуть бути і односпрямовані, і двонаправлені списки.
Більш докладно розглянемо роботу зі зв'язаними списками на прикладі однонаправленої некольцевого списку.
#include
#include
#include
#include
typedef long BT;