ка, (* lst) .elem - перший елемент списку. По-іншому перший елемент позначається за допомогою операції доступу до члена структури через покажчик: lst- gt; elem. Вираз lst- gt; next означає покажчик на другу ланку. Далі,
* lst- gt; next - саме друга ланка,
lst- gt; next- gt; elem - другий елемент списку,
lst- gt; next- gt; next - вказівник на третю ланку,
* lst- gt; next- gt; next - саме третя ланка,
lst- gt; next- gt; next- gt; elem - третій елемент списку, gt; next- gt; next- gt ; next - порожній покажчик (кінець списку).
Вираз 1st має й інший сенс. Воно позначає список в програмі, оскільки, знаючи покажчик на першу ланку, ми маємо доступ до всіх інших ланках, тобто знаємо весь список. З цієї точки зору вираз lst- gt; next у нашому прикладі позначає список? b, c? , А вираз lst- gt; next- gt; next- gt; next - порожній список.
Зауважимо, що сусідні ланки ланцюжка розташовуються в оперативній пам'яті довільно відносно один одного, на відміну від сусідніх компонент масиву, завжди займають суміжні ділянки пам'яті. Таке розташування ланок полегшує операції вставки і видалення, так як немає необхідності переміщати елементи, як це було б у разі реалізації списків масивами. Пояснимо це на прикладах.
Нехай зі списку? a, b, c? , Представленого в програмі змінної lst , потрібно видалити другий елемент. Для цього достатньо виключити з ланцюжка друга ланка - носій другого елементу. Змінимо покажчик в поле next першої ланки:
lst- gt; next = lst- gt; next- gt; next.
Тепер після першої ланки в ланцюжку йде ланка, що містить елемент c. Вийшов список? a, c?. Щоб виключена ланка не займало місця в пам'яті, його слід знищити за допомогою функції free (), попередньо запам'ятавши покажчик на нього в допоміжній змінної q. Отже, остаточне рішення таке:
q = lst- gt; next; lst- gt; next = lst- gt; next- gt; next;
free (q);
Покажемо на малюнку відбуваються після кожної дії зміни.
Нехай тепер потрібно вставити d після першого елементу списку? a, c?. Рішення складається з двох етапів. По-перше, необхідно створити носій - Ланка для зберігання вставляемого елемента, і занести цей елемент у поле elem носія raquo ;. По-друге, шляхом зміни покажчиків включити створене ланка в ланцюжок після першої ланки. Перший етап реалізується фрагментом
q=(link) malloc (sizeof (node)); gt; elem = d ;
де q - допоміжна змінна типу link. Фрагмент
q- gt; next = lst- gt; next;
lst- gt; next = q ;
здійснює другий етап вставки. Наступний малюнок ілюструє етапи вставки.
З прикладів видно, що довжина ланцюжка (кількість ланок в ній) може динамічно змінюватися, тобто змінюватися в процесі виконання програми. Подібно ланцюжках можна сконструювати і більш складні структури, в яких об'єкти пов'язані між собою за допомогою покажчиків. Такого роду структури даних називаються динамічними.
2. Постановка завдання
У файловій системі каталогфайлів організований у вигляді лінійного списку. Для кожного файлу в каталозі містяться такі відомості:
· ім'я файлу;
· дата створення;
· кількість звернень до файлу.
Написати програму, яка забезпечує:
· початкове формування каталогу файлів;
· висновок каталогу файлів;
· видалення файлів, дата створення яких менше заданої;
· вибірку файлу з найбільшою кількістю звернень.
Програма повинна забезпечувати діалог за допомогою меню.
3. Блок-схема
4. Інстру...