Функция create() просто создает список List свободной памяти. Она напоминает комбинацию конструктора (функция init() выполняет инициализацию) и оператора new (функция malloc() выделяет память).
struct List* create() /* создает пустой список */
{
struct List* lst =
(struct List*)malloc(sizeof(struct List)); init(lst); return lst;
}
Функция clear() предполагает, что все узлы уже созданы и расположены в свободной памяти, и удаляет их оттуда с помощью функции free().
void clear(struct List* lst) /* удаляет все элементы списка lst */
{
assert(lst);
{
struct Link* curr = lst->first; while(curr) {
struct Link* next = curr->suc;
free(curr);
curr = next;
}
lst->first = lst->last = 0;
}
}
Также вам может показаться, что такая тема как
http://www.kanta.ru/production/11/106 никак не связана и даже не тематична с программированием. Хотя, может быть и связана.
В любом случае все-таки зайдите на сайт kanta.ru
Тема стяжные ремни там представлена весьма широко.
Обратите внимание на способ, с помощью которого мы обходим список, используя член suc класса Link. Мы не можем получить безопасный доступ к члену объекта после его удаления с помощью функции free(), поэтому ввели переменную next, с помощью которой храним информацию о своей позиции в контейнере List,
одновременно удаляя объекты класса Link с помощью функции free().
Если не все объекты структуры Link находятся в свободной памяти, лучше
не вызывать функцию clear(), иначе она вызовет разрушение памяти.
Функция destroy(), по существу, противоположна функции create(), т.е.
она представляет собой сочетание деструктора и оператора delete.
void destroy(struct List* lst) /* удаляет все элементы списка 1st;
затем удаляет сам список 1st */
{
assert(lst);
clear(lst);
free(lst);
}
Обратите внимание на то, что перед вызовом функции очистки памяти (деструктора) мы не делаем никаких предположений об элементах, представленных в виде узлов списка. Эта схема не является полноценной имитацией методов языка С++ — она для этого не предназначена.
Функция push_back() — добавление узла Link в конец списка — вполне очевидна.
void push_back(struct List* lst, struct Link* p) /* добавляет элемент p
в конец списка 1st */
{
assert(lst);
{
struct Link* last = lst->last; if (last) {
last->suc = p; /* добавляет узел p после узла 1ast */ p->pre = last;
}
else {
lst->first = p; /* p — первый элемент */ p->pre = 0;
}
lst->last = p; /* p — новый последний элемент */
p->suc = 0;
}
}
Опубликовал katy
May 01 2015 11:31:01 ·
0 Комментариев ·
4739 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.