Однозв'язний список — вид зв'язаного списку, який складається з вузлів, кожен з яких містить у собі дані (інформаційну частину) та посилання на наступний вузол.
Структура однобічно зв'язаного списку
Структура списку
Найчастіше вузлом списку вважають структурний тип (структуру), який зберігає у собі певну інформаційну частину (іншу структуру або тип даних) та посилання (вказівник) на наступний вузол у списку. Список має «голову» head, тобто вказівник на початок списку та інколи має кінець tail, проте найчастіше його не використовують.
Переваги та недоліки списків у порівнянні з масивами
Переваги списків над масивами
- Можливість додавати вузол у кінець списку. Масив має статичний розмір, і, якщо, вільного місця там немає, доведеться створювати масив більшого розміру, копіювати у нього елементи «старого» масиву і тільки після цього додавати новий елемент
- Можливість видаляти вузол і звільнювати пам'ять, яку він займав. У масиві можна лише зсунути елементи і розглядати його, як масив меншого розміру. Пам'ять при цьому не звільняється.
- Можливість вставляти вузол у середину списку. При умові, що масив не заповнений до кінця, можна «розсунути» елементи і вставити між ними необхідний. Якщо ж масив повний — доведеться створювати новий масив більшого розміру, копіювати елементи і вставляти новий.
Недоліки списків перед масивами
- Відсутність поіндексного доступу до елементів списку
- Зайвий час на прохід по списку для пошуку/видалення/додавання елементу у кінець
- Використання більшого об'єму пам'яті за рахунок покажчиків на наступний вузол
Операції зі списками
Додати вузол у кінець списку
Для того, щоб додати вузол А у кінець списку, треба знайти останній вузол В у цьому списку, заповнити інформаційну частину вузла А і вказівнику вузла А присвоїти NULL, і «приєднати» його до останнього вузла у списку, тобто до вузла В.
Додати вузол у початок списку
Для того, щоб додати вузол А у початок списку, потрібно заповнити інформаційну частину вузла А, вказівник А направити на голову head списку і зробити цей вузол головою.
Видалити заданий вузол зі списку
Для того, щоб видалити необхідний вузол, потрібно послідовно перебирати вузли, запам'ятовуючи попередній вузол В. Коли необхідний вузол А буде знайдено, потрібно вказівник «попередника» (тобто вузла В) зв'язати з наступним вузлом (тим, що йде після вузла А) і видалити вузол А.
Реалізація списку у С++
Реалізація вузла
struct Node { int value; // певна інформативна частина Node * next; // вказівник (pointer) на наступну структуру-вузол у списку }; Node * head = NULL; // вказівник на голову списку, спочатку він нікуди не вказує, бо список порожній
Реалізація функції додавання у кінець списку
void addToEnd(int v) { Node * n; if (!head) { head = new Node; head->value = v; head->next = NULL; return; } else { n = head; while (n->next) n = n->next; Node * newNode = new Node; newNode->value = v; newNode->next = NULL; n->next = newNode; return; } }
Реалізація функції додавання у початок списку
void addToBegin(int v) { Node * n = new Node; n->value = v; n->next = head; head = n; }
Реалізація функції видалення певного вузла
void deleteNode(Node * n) { Node * k = head; if (head == n) { head = n->next; delete n; return; } while (k->next != n) k = k->next; k->next = n->next; delete n; }
Реалізація функції пошуку вузла за інформаційною частиною
Node * find(const int v) { Node * n = head; while (n) { if (n->value == v) return n; n = n->next; } return NULL; }
Реалізація функції вставки вузла після заданого вузла
void insert(const int v, Node * n) { Node * newNode = new Node; newNode->value = v; newNode->next = n->next; n->next = newNode; }
Див. також
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Odnozv yaznij spisok vid zv yazanogo spisku yakij skladayetsya z vuzliv kozhen z yakih mistit u sobi dani informacijnu chastinu ta posilannya na nastupnij vuzol Struktura odnobichno zv yazanogo spiskuStruktura spiskuNajchastishe vuzlom spisku vvazhayut strukturnij tip strukturu yakij zberigaye u sobi pevnu informacijnu chastinu inshu strukturu abo tip danih ta posilannya vkazivnik na nastupnij vuzol u spisku Spisok maye golovu head tobto vkazivnik na pochatok spisku ta inkoli maye kinec tail prote najchastishe jogo ne vikoristovuyut Perevagi ta nedoliki spiskiv u porivnyanni z masivamiPerevagi spiskiv nad masivami Mozhlivist dodavati vuzol u kinec spisku Masiv maye statichnij rozmir i yaksho vilnogo miscya tam nemaye dovedetsya stvoryuvati masiv bilshogo rozmiru kopiyuvati u nogo elementi starogo masivu i tilki pislya cogo dodavati novij element Mozhlivist vidalyati vuzol i zvilnyuvati pam yat yaku vin zajmav U masivi mozhna lishe zsunuti elementi i rozglyadati jogo yak masiv menshogo rozmiru Pam yat pri comu ne zvilnyayetsya Mozhlivist vstavlyati vuzol u seredinu spisku Pri umovi sho masiv ne zapovnenij do kincya mozhna rozsunuti elementi i vstaviti mizh nimi neobhidnij Yaksho zh masiv povnij dovedetsya stvoryuvati novij masiv bilshogo rozmiru kopiyuvati elementi i vstavlyati novij Nedoliki spiskiv pered masivami Vidsutnist poindeksnogo dostupu do elementiv spisku Zajvij chas na prohid po spisku dlya poshuku vidalennya dodavannya elementu u kinec Vikoristannya bilshogo ob yemu pam yati za rahunok pokazhchikiv na nastupnij vuzolOperaciyi zi spiskamiDodati vuzol u kinec spisku Dlya togo shob dodati vuzol A u kinec spisku treba znajti ostannij vuzol V u comu spisku zapovniti informacijnu chastinu vuzla A i vkazivniku vuzla A prisvoyiti NULL i priyednati jogo do ostannogo vuzla u spisku tobto do vuzla V Dodati vuzol u pochatok spisku Dlya togo shob dodati vuzol A u pochatok spisku potribno zapovniti informacijnu chastinu vuzla A vkazivnik A napraviti na golovu head spisku i zrobiti cej vuzol golovoyu Vidaliti zadanij vuzol zi spisku Dlya togo shob vidaliti neobhidnij vuzol potribno poslidovno perebirati vuzli zapam yatovuyuchi poperednij vuzol V Koli neobhidnij vuzol A bude znajdeno potribno vkazivnik poperednika tobto vuzla V zv yazati z nastupnim vuzlom tim sho jde pislya vuzla A i vidaliti vuzol A Realizaciya spisku u S Realizaciya vuzla struct Node int value pevna informativna chastina Node next vkazivnik pointer na nastupnu strukturu vuzol u spisku Node head NULL vkazivnik na golovu spisku spochatku vin nikudi ne vkazuye bo spisok porozhnij Realizaciya funkciyi dodavannya u kinec spisku void addToEnd int v Node n if head head new Node head gt value v head gt next NULL return else n head while n gt next n n gt next Node newNode new Node newNode gt value v newNode gt next NULL n gt next newNode return Realizaciya funkciyi dodavannya u pochatok spisku void addToBegin int v Node n new Node n gt value v n gt next head head n Realizaciya funkciyi vidalennya pevnogo vuzla void deleteNode Node n Node k head if head n head n gt next delete n return while k gt next n k k gt next k gt next n gt next delete n Realizaciya funkciyi poshuku vuzla za informacijnoyu chastinoyu Node find const int v Node n head while n if n gt value v return n n n gt next return NULL Realizaciya funkciyi vstavki vuzla pislya zadanogo vuzla void insert const int v Node n Node newNode new Node newNode gt value v newNode gt next n gt next n gt next newNode Div takozhCherga struktura danih Zv yazanij spisok