На этом шаге мы рассмотрим алгоритм построения списка с заглавным звеном.
Чтобы сделать действия, выполняемые при включении элемента в список (исключении элемента из списка), единообразными, обычно применяется следующий прием. В начало каждого списка добавляется заглавное звено (заголовок списка). Оно никогда не исключается из списка и перед ним в список никогда не включаются новые элементы.
Информационная часть заглавного звена или не используется вовсе, или используется для специальных целей. Например, в случае списка целых чисел она может содержать число, равное количеству звеньев в списке. Добавление заглавного звена в список приводит к тому, что теперь у всех элементов, в том числе и у первого, имеется предшественник, и действия по включению новых элементов в список (или исключение элементов из списка) проводятся единым способом.
Приведем алгоритм построения однонаправленного списка с заглавным звеном с сохранением порядка поступления звеньев. Шаги построения алгоритма будем иллюстрировать с помощью схем "до и после" Д.Кнута.
struct node *phead; struct node *t;
Рис.1. Резервирование места в памяти
phead = new(node);
Рис.2. Выделили место для элемента списка
Построено заглавное звено будущего однонаправленного списка.
t = phead;
Рис.3. Присвоим значение t
(*t).sled = NULL;
Рис.4. Присвоим указателю заглавного звена NULL
cin>>Число; while (Число != Числу, определяющему окончание ввода) { (*t).sled = new (node); //Резервируем место для нового объекта.
Рис.5. Создаем новый объект
t = (*t).sled; //Указатель t содержит адрес //расположения созданного объекта.
Рис.6. Определяем t
(*t).elem = Число; //Заполняем поля объекта. (*t).sled = NULL;
Рис.7. Результат заполнения полей
cin>>Число; //Запрос на ввод следующего значения.
}
Алгоритм построения оформим в виде функции на языке C++:
void POSTROENIE (node **phead) // Построение списка с заглавным звеном. // *phead - указатель на заглавное звено. { node *t; int el; // Вначале создадим заглавное звено *phead = new (node); t = *phead; (*t).sled = NULL; cout<<"Вводите элементы звеньев списка: "; cin>>el; while (el!=0) { (*t).sled = new (node); t = (*t).sled; (*t).elem = el; (*t).sled = NULL; cin>>el; } }
Ясно, что пустой однонаправленный список с заглавным звеном можно схематически представить так:
Рис.8. Пустой однонаправленный список с заглавным звеном
На следующем шаге мы рассмотрим удаление списка из памяти.