
Абстрактна структура даних список
Лінійним списком називається послідовність елементів, розташованих довільним чином, але так, щоб кожний елемент послідовно зв’язувався з наступним елементом за допомогою деякого зв’язку.
Існує послідовний розподіл елементів у списку, при якому елементи зберігаються в послідовних комірках пам’яті. Такий спосіб – це масив.
Зв’язане представлення:
Схематично лінійний зв’язаний однонаправлений список можна зобразити наступним чином:
А1 |
|
|
А2 |
|
|
А3 |
NULL |
Математична послідовність зображена таким чином: <А1, А2, А3>
Кожен елемент списку містить стрілочку, вказівник на наступний елемент. Останній елемент списку містить ознаку кінця списку.
Розглянемо порівняння послідовного та зв’язного розподілів на базі масиву розмірністю 6.
Послідовний |
Зв’язний |
||||||||||||||||||||||||||||||||||
List
0 |
List Free
|
Побудуєм список з 3-х елементів: <1,2,3>
1 |
|
|
2 |
|
|
3 |
NULL |
Програмна реалізація роботи зі списками, представленим за допомогою вказівників:
1) опишемо типи і оголосимо змінну списку.
Struct node {
int data;
struct node * next;
}
typedef struct node * list
list head;
list * head_ptr;
2) в змінні x1 покладено адресу першого елемента:
list x1;
x1 = head;
3)в змінні x2 покладено адресу другого елемента:
list x2;
x2 = head -> next;
4) в x3 – адреса 3тього елемента:
x3 = head -> next -> next;
Або
x3 = head;
x3 = x3 -> next;
x3 = x3 -> next;
5) визначаєм адресу 30-того елемента:
for (i = 0; i < 29; ++i)
x30 = x30 -> next;
6) в змінну xk запишем адресу останнього елементу списку:
xk = head;
while (xk -> next )
xk = xk ->next;
7) в змінну y1 запишемо значення першого елемента списку:
int y1;
y1 = head -> data;
y1 = head -> next -> data;
8) 30-тий елемент
Введемо list tmp;
list tmp = head;
for ( i=0; i < 29; ++i)
tmp = tmp -> next;
y30 = tmp -> data;
9) інформація, що знаходиться в останньому елементі:
list tmp = head;
while (tmp -> next )
tmp = tmp -> next;
yk = tmp -> data;