Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

{

assert(lst);

clear(lst);

free(lst);

}

Обратите внимание на то, что перед вызовом функции очистки памяти (деструктора) мы не делаем никаких предположений об элементах, представленных в виде узлов списка. Эта схема не является полноценной имитацией методов языка С++ — она для этого не предназначена.

Функция

push_back
— добавление узла
Link
в конец списка — вполне очевидна.

void push_back(struct List* lst, struct Link* p) /*
добавляет элемент p

в конец списка lst */

{

assert(lst);

{

struct Link* last = lst–>last;

if (last) {

last–>suc = p; /* добавляет узел p после узла last */

p–>pre = last;

}

else {

lst–>first = p; /* p — первый элемент */

p–>pre = 0;

}

lst–>last = p; /* p — новый последний элемент */

p–>suc = 0;

}

}

Весь этот код было бы трудно написать, не нарисовав схему, состоящую из нескольких прямоугольников и стрелок. Обратите внимание на то, что мы забыли рассмотреть вариант, в котором аргумент

p
равен нулю. Передайте нуль вместо указателя на узел, и ваша программа даст сбой. Этот код нельзя назвать совершенно неправильным, но он не соответствует промышленным стандартам. Его цель — проиллюстрировать общепринятые и полезные методы (а также обычные недостатки и ошибки).

Функцию

erase
можно было бы написать следующим образом:

struct Link* erase(struct List* lst, struct Link* p)

/*
удаляет узел p из списка lst;

возвращает указатель на узел, расположенный после узла p

*/

{

assert(lst);

if (p==0) return 0; /* OK для вызова erase(0) */

if (p == lst–>first) {

if (p–>suc) {

lst–>first = p–>suc; /* последователь становится
первым */

p–>suc–>pre = 0;

return p–>suc;

}

else {

lst–>first = lst–>last = 0; /* список становится
пустым */

return 0;

}

}

else if (p == lst–>last) {

if (p–>pre) {

lst–>last = p–>pre; /*
предшественник становится
последним */

p–>pre–>suc = 0;

}

else {

lst–>first = lst–>last = 0; /* список становится
пустым */

return 0;

}

}

else {

p–>suc–>pre = p–>pre;

p–>pre–>suc = p–>suc;

return p–>suc;

}

}

Остальные функции читатели могут написать в качестве упражнения, поскольку для нашего (очень простого) теста они не нужны. Однако теперь мы должны разрешить основную загадку этого проекта: где находятся данные в элементах списка? Как реализовать простой список имен, представленных в виде С-строк. Рассмотрим следующий пример:

struct Name {

struct Link lnk; /* структура Link нужна для выполнения ее
операций */

char* p; /* строка имен */

};

До сих пор все было хорошо, хотя остается загадкой, как мы можем использовать этот член

Link
? Но поскольку мы знаем, что структура
List
хранит узлы
Link
в свободной памяти, то написали функцию, создающую объекты структуры
Name
в свободной памяти.

struct Name* make_name(char* n)

{

struct Name* p = (struct Name*)malloc(sizeof(struct Name));

p–>p = n;

return p;

}

Эту ситуацию можно проиллюстрировать следующим образом:

Попробуем использовать эти структуры.

int main

{

int count = 0;

struct List names; /* создает список */

struct List* curr;

init(&names);

/* создаем несколько объектов Names и добавляем их в список: */

push_back(&names,(struct Link*)make_name("Norah"));

push_back(&names,(struct Link*)make_name("Annemarie"));

push_back(&names,(struct Link*)make_name("Kris"));

Поделиться:
Популярные книги

Live-rpg. эволюция-3

Кронос Александр
3. Эволюция. Live-RPG
Фантастика:
боевая фантастика
6.59
рейтинг книги
Live-rpg. эволюция-3

Я – Орк

Лисицин Евгений
1. Я — Орк
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я – Орк

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Идеальный мир для Лекаря 3

Сапфир Олег
3. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 3

Делегат

Астахов Евгений Евгеньевич
6. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Делегат

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Возвышение Меркурия. Книга 17

Кронос Александр
17. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 17

Курсант: Назад в СССР 11

Дамиров Рафаэль
11. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант: Назад в СССР 11

Я – Орк. Том 4

Лисицин Евгений
4. Я — Орк
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 4

Восход. Солнцев. Книга XI

Скабер Артемий
11. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга XI

Мимик нового Мира 4

Северный Лис
3. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 4