ку */
{address * old, * p;=* start;
if (! * last) {/ * перший елемент у списку */
i- gt; next=NULL;
* last=i;
* start=i ;;
}=NULL; (p) {(strcmp (p- gt; name, i- gt; name) lt; 0) {= p;=p- gt; next;
} {(old) {/ * вставка в середину */
old- gt; next=i; gt; next=p;
return;
} gt; next=p;/* Вставка в початок */
* start=i ;;
}
}
(* last) - gt; next=i;/* Вставка в кінець */ gt; next=NULL;
* last=i;
}
Послідовний перебір елементів пов'язаного списку здійснюється дуже просто: почати з початку і слідувати вказівниками. Зазвичай фрагмент коду перебору настільки малий, що його вставляють в іншу процедуру - наприклад, функцію пошуку, видалення або відображення вмісту. Так, наведена нижче функція виводить на екран всі імена зі списку розсилки:
void display (struct address * start)
{(start) {(% s n raquo ;, start- gt; name);
start=start- gt; next;
}
}
При виклику функції display () параметр start повинен бути покажчиком на перший структуру в списку. Після цього функція переходить до наступного елементу, на який вказує покажчик в поле next. Процес припиняється, коли next дорівнює нулю.
Для отримання елемента зі списку потрібно просто пройти по ланцюжку посилань. Нижче наведено приклад функції пошуку по вмісту поля name:
struct address * search (struct address * start, char * n)
{(start) {(! strcmp (n, start- gt; name)) return start;=start- gt; next;
} NULL;/* Підходящий елемент не знайдений */
}
Оскільки функція search () повертає покажчик на елемент списку, що містить шукане ім'я, повертається тип описаний як покажчик на структуру address. При відсутності в списку підходящих елементів повертається нуль (NULL).
Видалення елемента з одинзв'язного списку виконується просто. Так само, як і при вставці, можливі три випадки: видалення першого елемента, видалення елемента в середині, видалення останнього елемента. На рис.4 показані всі три операції.
Нижче приведена функція, що видаляє заданий елемент зі списку структур address.
void sldelete (address * p,/* попередній елемент */address * i,/* видаляється елемент */address ** start,/* початок списку */address ** last)/* кінець списку */
{(p) p- gt; next=i- gt; next; * start=i- gt; next; (i == * last amp; amp; p) * last=p;
}
Функції sldelete () необхідно передавати покажчики на видаляється елемент, що передує удаляемому, а також на перший і останній елементи. При видаленні першого елемента покажчик на попередній елемент повинен бути рівний нулю (NULL). Ця функція автоматично оновлює покажчики start і last, якщо один з них посилається на видаляється елемент.
У однозв'язних списків є один великий недолік: однозв'язний список неможливо прочитати у зворотному напрямку. З цієї причини зазвичай застосовуються двусвязний списки.
4. Опис програми
Програма складається з декількох файлів вихідних текстів програм.
Всі функції описані в хедер файлах. Їх призначення:
Parserlib. h - функції-парсери для перевірки валідності даних;
Registration. h - Робота з одинзв'язного списком,
функціональність: реєстрація вселення/виселення постояльця
hastable. h - Робота з хеш-таблицею
функціональність: робота з інформацією про постояльців
avl. h - робота з АВЛ-деревом
функціональність: робота з готельними номерами
Програма володіє простим, інтуїтивним інтерфейсом, що не вимагає спеціального курсу навчання.
Вихідні тексти програми:
Avl. h
/***************************************** *****
робота з АВЛ-деревом
функціональність: робота з готельними номерами
****************************************** *****/